Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: JavaScript a PHP
Forum PHP.pl > Forum > XML, AJAX
phpsuse
Witam,
Mam taki problem. Pisze dodatek do Google Chrome. Dodatek ten ma za zadanie sprawdzać coś w mojej aplikacji PHP i wyświetlać dane w Chrome za pomocą notyfication co 1 min. Wszystko mam tylko nie wiem jak przekazać dane z mojego programu do JavaScript.

Aby dostać w jaki kolwiek sopsób dane musze wywołać stronę php na innym serwerze.
Ostatni pomysł był taki że uruchomię stronę w ten sposób:

plik .js
  1. my_window = window.open("http://localhost/chrome/index_chrome.php", "new");


dane pobiorę tak:
ppp = my_window.window.document.getElementById('nazwa');

a w pliku php
  1. <a href="" id="nazwa" name="nazwa"><?php echo $zmienna; ?>


niestety nie działa.


Jakieś pomysły ?
!*!
W PHP wyświetlasz dane jako json i w JS je odbierasz.
phpsuse
Można jakiś przykład ?
phpsuse
ja musze uruchomić w pliku background.js dla chrome plik php z mojego serwera. I pobrać jakieś smienne lub jakikolwiek sposób dane do tego background.js

w php daje

  1. <?php
  2. $array[var1] = 'Something';
  3. $array[var2] = 'cos tam';
  4.  
  5. echo json_encode( $array ); ?>


w backgroud.js

  1. $.getJSON( 'http://localhost/chrome/message.php', function( data ) {
  2.  
  3. $( 'div' ).html( data.var1 + ' ' + data.var2 );
  4.  
  5. ppp = data.var1;
  6. });


nie działa
!*!
  1. $array['var1']
phpsuse
uncauth reference error $ is not defined pod linią

  1. $.getJSON( 'http://localhost/chrome/message.php', function( data ) {
!*!
A dodałeś bibliotekę jquery?
phpsuse
w pliku manifest:

  1. },
  2. "content_scripts": [ {
  3. "js": [ "jquery-1.9.1.min.js"],
  4. "matches": [ "http://*/*", "https://*/*"]
  5. }]
phpsuse
mam prawie tak samo i nic z tego ciąge $ reference error w background.js

  1. "browser_action": {
  2. "default_icon": "icon.png",
  3. "default_popup": "popup.html"
  4. }
  5. ,
  6. "options_page": "options.html",
  7.  
  8. "background": {
  9. "scripts": ["background.js"]
  10. },
  11. "content_scripts": [ {
  12. "js": [ "jquery-1.9.1.min.js" , "jquery-1.9.1.js" ],
  13. "matches": [ "http://*/*", "https://*/*"]
  14. }]
!*!
Nie podajesz ścieżki do skryptu.
phpsuse
skopiowałem do tego samego katalogu, przy uruchamianiu rozszerzenia nie krzyczy.
!*!
Nigdy nie pisałem rozszerzeń dla przeglądarek, ale widzę różnice między

Cytat
"matches": ["http://jquery.com/*"],

a
Cytat
"matches": [ "http://*/*", "https://*/*"]


Czy tego nie trzeba zamienić na link bezpośredni? Np. http://code.jquery.com/jquery-2.0.0.js
phpsuse
po zmianie to samo błąd nie wyskakuje w pliku manifest, jak tam coś jest nie tak to zaraż krzyczy przy uruchamianiu rozrezerzenia. Błąd zgłasza linia z background.js dokładnie pod tą linią:

  1. $.getJSON( 'http://localhost/chrome/message.php', function( data ) {
!*!
Jaki błąd? I czy dane są zwracane pod tym adresem?
phpsuse
uncaught ReferenceError: $ is not defined

dokładnie taki błąd
!*!
Cytat
"content_scripts": [ {
"js": [ "jquery-2.0.0.js" ],
"matches": [ "http://code.jquery.com/*"]
}]


Na pewno tak to masz?
phpsuse
jak tak daje to szuka pliku lokalnie w katalogu z moim dodatkiem do chroma

Niby jQuery sie ładuje z dysku ale nie chce działać bo cokolwiek odwoływać sie bedzie do $ to błąd.

Ciekawe tylko dlaczego z zewnętrznych linków si nie ładuje jQuery tylko mimo wszystko szuka lokalnie.

od wersji chrome 18 tylko deklaracja jquery w lokalnym katalogu.

inna sprawa bo z konsoli działa w funkcji jquery nie działa.

Jak to obejsc ?

przykład
  1. function show($) {
  2. var notification;
  3.  
  4. $.getJSON( 'http://localhost/chrome/message.php', function( data ) {
  5.  
  6. $( 'div' ).html( data.var1 + ' ' + data.var2 );
  7.  
  8. ppp = data.var1;
  9. });


nie wie co to getJSON
phpsuse
nie bardzo rozumiem gdzie tam jest odpowiedź.

U mnie funkcja działa dobrze ale jak wywołam ją ręcznie z konsoli. Jeśli uruchomię komponent to plik background.js wskazuje błąd w miejscu getJSON. funkcja napisana wyżej.

jak dam function show($) to przynajmniej nie czepia sie o jQuery
jak nie dam to się czepia.
zegarek84
dawno nie pisałem pluginów pod przeglądarki, ale możesz także korzystać z narzędzi deweloperskich tak jak na stronie... dodatkowo jQuery masz podpinane pod globalny obiekt window który masz w "ramce", nie jest on tworzony w globalnym obiekcie przeglądarki, z resztą to by nie miało sensu... pisząc plugin jesteś o warstwę wyżej niż na stronie internetowej, do czego to przyrównaćquestionmark.gif np. na stronie masz dołączone jQuery, ale na stronie masz też iframe, o ile adres ramki jest z tego samego serwera to masz możliwość odwołania się do elementów znajdujących się w tej ramce... z pluginu będąc warstwę wyżej nie masz ograniczenia na politykę bezpieczeństwa...

zależy co dokładnie chcesz napisać i do czego to narzędzie ma służyć... może wystarczyło by stworzenie czegoś prostszego jak np. userscript?? warstwą logiki byłbyś od razu na poziomie strony internetowej...
Cytat(phpsuse @ 23.05.2013, 18:25:08 ) *
jak dam function show($) to przynajmniej nie czepia sie o jQuery
jak nie dam to się czepia.

gdyż stworzyłeś zmienną $ i ma ona wartość undefined jeśli nie podałeś argumentu wywołując tą funkcję...
phpsuse
mam swoją aplikację napisaną w php. Jedną z funkcji aplikacji jest wysyłanie wiadomości między użytkownikami. Działa sobie ta aplikacja na jakims serwerku. Wadą jes że trzeba aplikacje miec otwartą przez przeglądarkę i otwartą stronę z nią. Chciałem napisać plugin do chrome który sprawdzałby czy jest wiadomość i wyświetlać komunikat notification jak gtalk. To wszystko już mam. Problem polega na tym ze musze informacje o wiadomościach wydobyć z bazy mysql do której dostęp jest tylko lokalny. Więc napisałem w php funkcje którea do zmiennych zwraca to co powinno pokazać się w komunikacie chroma (notification).

Wiec dane mam po uruchomieniu: http://localhost/chrome/message.php

mam napisane że co sekunde sprawdzam i wywołuje funkcje show która to pobiera dwie zmienne. I to dział bo sprawdzałem w konsoli dokładnie ten kod:
  1. $.getJSON( 'http://localhost/chrome/message.php', function( data ) {
  2.  
  3. $( 'div' ).html( data.var1 + ' ' + data.var2 );
  4.  
  5. ppp = data.var1;
  6. });


natomiast jak ta funkcja jest uruchamiana co sekunde to odrazu dostaje komunikat czepiający się o getJSON.
To samo skopiowane do konsoli działa. Nie bardzo rozumiem . To tak jakby w funkcji nie było dostępu do jQuery.
dlatego funkcje zaczełem wywoływać show($);

Tak mniej więcej wygląda funkcja:

  1. function show($) {
  2. var notification;
  3.  
  4. $.getJSON( 'http://localhost/chrome/message.php', function( data ) {
  5.  
  6. $( 'div' ).html( data.var1 + ' ' + data.var2 );
  7.  
  8. ppp = data.var1;
  9. });
zegarek84
teraz po treningu sobie tak sączę piwko i luknąłem na dokumentację (ale wolę czytać Qt C++ niż to ;p)... masz narzędzia developerskie to upewnij się, czy masz problem z samym jQuery (zasięgiem zmiennych, czy masz tam gdzie stosujesz tą funkcję dostępne jQ) czy może z polityką bezpieczeństwa zaimplementowaną w przeglądarce - angielski znam po łebkach ale stawiam na politykę bezpieczeństwa, nie widzę też całości kodu i dawno nie pisałem rozszerzenia to może i masz też nie zdefiniowany w tym miejscu jQ...
przeczytaj to:
Something to Declare i zwróć uwagę na "permissions"...
pozdro...

edit...
przeglądam po łebkach i czytam wybiórczo, ale patrząc na Twój plik manifest już widzę, że miałem rację
Cross-Origin XMLHttpRequest, dodatkowo jeśli operujesz na zakładkach to chyba musisz mieć dorzucone "tabs"... ogólnie to lektura tego manuala... masz tam jeszcze przykładowe pluginy...
phpsuse
Ja mam taki błąd:

Uncaught TypeError: Cannot call method 'getJSON' of undefined

wywołuje to z konsoli

  1. $.getJSON( 'http://localhost/chrome/message.php', function( data ) {
  2.  
  3. $( 'div' ).html( data.var1 + ' ' + data.var2 );
  4.  
  5. ppp = data.var1;
  6. });


wpisuje ppp i dostaje odpowiedź prawidłową.


Teraz jak uruchomoe tą funkcję

  1. function show($) {
  2. var notification;
  3. var ppp = 'ppp';
  4. var time = /(..)(:..)/.exec(new Date()); // The prettyprinted time.
  5. var hour = time[1] % 12 || 12; // The prettyprinted hour.
  6. var period = time[1] < 12 ? 'a.m.' : 'p.m.'; // The period of the day.
  7.  
  8. //my_window = window.open("http://localhost/chrome/index_chrome.php", "new");
  9. //ppp = my_window.window.document.getElementById('nazwa');
  10.  
  11. $.getJSON( 'http://localhost/chrome/message.php', function( data ) {
  12.  
  13. $( 'div' ).html( data.var1 + ' ' + data.var2 );
  14.  
  15. ppp = data.var1;
  16. });
  17.  
  18.  
  19.  
  20. notification = window.webkitNotifications.createNotification(
  21. '48.png', // The image.
  22. ppp + time[2] + ' ' + period, // The title.
  23. 'Time to make the toast.' // The body.
  24. );


w taki sposób show($); to okienko notyfikacji sie pojawia a nie działa wczytywanie zmiennych z pliku message.php

a i plik manifest:

  1. {
  2. "manifest_version": 2,
  3.  
  4. "name": "IMS - Chrome Extension",
  5. "description": "Dodatek do Google Chrome dla IMS - Spamel",
  6. "version": "1.1",
  7.  
  8. "permissions": [
  9. "<all_urls>", "tabs", "notifications"
  10. ],
  11. "browser_action": {
  12. "default_icon": "icon.png",
  13. "default_popup": "popup.html"
  14. },
  15.  
  16. "options_page": "options.html",
  17.  
  18. "background": {
  19. "scripts": ["background.js", "jquery.js"]
  20. }
  21. }


Inaczej ta funkcja odpalona z konsoli działa:
  1. function show() {
  2. var notification;
  3. var ima = '48.png';
  4.  
  5. $.getJSON( 'http://localhost/chrome/message2.php', function( data ) {
  6. $( 'div' ).html( data.var1 + ' ' + data.var2 );
  7. ppp = data.var1;
  8. ppp2 = data.var2;
  9. });
  10.  
  11. notification = window.webkitNotifications.createNotification(
  12. '48.png', // The image.
  13. ppp + '', // The title.
  14. ppp2 + '' // The body.
  15. );
  16. notification.show();
  17.  
  18. }


ta sama funkcja jako dodatek zwraca błąd: Uncaught ReferenceError: $ is not defined
w lini:
  1. $.getJSON( 'http://localhost/chrome/message2.php', function( data ) {



co jest grane już mnie trafa ?
zegarek84
piszesz co chcesz i nie wszystko udostępniasz...
masz linka
Using jQuery to build Google Chrome extensions
ale jeszcze raz napiszę, iż kontekst strony to nie to samo co kontekst pluginu - masz inne zmienne!!! podstawy js tu się kłaniają i dokumentacja google chrome...

edit...
zainstaluj sobie i przejrzyj źródła rozszerzenia
jQuery Shell

ale prawda jest taka, że nie bardzo wiesz w których plikach kiedy jesteś...

jeszcze możesz przejrzeć źródła
Inject jQuery gdzie możesz załączać jQ na dowolnej stronie - jednak nie o to Ci chodziło tylko o skorzystanie z jQ w pluginie!!!

dokumentacja i narzędzia developerskie to podstawa...
a jeśli chcesz zaimplementować userscript w google chrome na wzór GM z mozilli to dodatek to rozszerzenie typu Tampermonkey
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.