Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [FF] Problem z podmianą źródła kodu JS
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
m.mix
Witam,
mam pewien problem z podmianą źródła kodu skryptu - żeby było jaśniej podam przykład:
plik test.php - jakiaś tam sobie stronka:

  1. <script id=skrypt_java></script>
  2. <script id=skrypt_pom>
  3. function GenerujLink() {
  4. var dane=document.getElementById('pole').value;
  5. document.getElementById('skrypt_java').src='./skrypt.php?zmienna='+dane;
  6. }
  7. </script>
  8. <input type=text id=pole>
  9. <input type=button value=Wcisnij onclick="GenerujLink()">
  10. </body>
  11. </html>


i drugi plik - który ma za zadanie wygenerować kod JS:

Kod
<?php
print("alert('Wpisales: ".$_GET[zmienna]."');");
?>


No i wszystko działa pięknie, ale tylko raz sad.gif tzn po naciśnięciu przycisku piękny alercik wyskakuje, ale juz po naciśnięciu drugi raz przeglądarka nie interpretuje kodu. O dziwo, w IE wszystko działa tak jak oczekuję, czyli za każdym razem na nowo generowany jest kod, przeglądarka go interpretuje i wyświetla alert. I teraz moje pytanie - jak zmusić FF żeby wykonał kod skryptu, który został podmieniony??

Będę wdzięczny za szybką odpowiedź smile.gif
bregovic
Pfffft... na twoim miejscu odpuściłbym sobie ten koszmarek, i zainteresował się np jQuery.getScript...
m.mix
No tak, z tym że to jest tylko przykład żeby było wiadomo o co chodzi.. w swoim projekcie ten zagnieżdżony skrypt przetwarza mi informacje z bazy danych, generuje mnóstwo obiektów i w ogóle jest mocno rozbudowany - stąd POTRZEBUJE żeby był generowany przez php sad.gif
mike
A skąd przeglądarka ma wiedzieć, że to jest JavaScript? Wyślij odpowiednie nagłówki za pomocą header()
m.mix
Niestety, dodanie nagłówka funkcją header("Content-type: text/javascript"); nic nie daje sad.gif FF po prostu go drugi raz nie odpala.. link ze źródłem skryptu się ładnie zmienia, bo podglądam FireBug'iem, ale nic się nie dzieje sad.gif
bregovic
Mix, zamknij oczy, wejdź na skrzynię, i popatrz na twój problem. Co, w moim rozwiązaniu, uniemożliwia generację twojego pliku przez php? Generacja to przecież nie twój problem. Twój problem to dynamiczne ściąganie i wykonywanie kodu w przeglądarce - a przynajmniej tak to prezentujesz. Aby rozwiązać ten problem poważnie, musisz modyfikować DOM (dodać element, ustawić właściwości etc) lub użyć XMLHTTPRequest, popularnie zwanego AJAX'em.

Poza tym, powinieneś pewnie ustawić odpowiednie header'y żeby się twój script nie chache'ował.
  1. <?php
  2. header("Cache-Control: no-cache, must-revalidate");
  3. header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
  4. ?>
m.mix
Przepraszam wszystkich że dopiero teraz odpisuję, ale przez cały tydzień nie miałem dostępu do sieci.
jQuery.getScript() faktycznie pomogło, skrypt wykonuje się poprawnie, chociaż nie lubię używać narzędzi których sam do końca nie poznam (ale niestety nie bardzo mam czas na szukanie czegoś innego, więc na razie przynajmniej niech tak zostanie - jak się douczę to albo zamienie go na coś swojego albo przekonam się że nie ma się tu czego bać smile.gif).
Ale problem pozostaje - dziwi mnie dlaczego przeglądarka nie wykonuje tego podmienionego kodu - przecież w linii
Cytat

document.getElementById('skrypt_java').src='./skrypt.php?zmienna='+dane;

modyfikuję obiekt DOM - zmieniam jego źródło. Brakuje mi tutaj jakiejś komendy "execute" żeby teraz zmusić przeglądarkę aby ponownie przejrzała obiekty i zachowała się zgodnie z oczekiwaniami. Przecież na zmianę innych parametrów typu rozmiary czy kolory DIVów reaguje zawsze bez zwlekania :-/ No i najdziewniejsze że właśnie IE działa tutaj bez problemów sad.gif ale to pewnie dowodzi tylo że twórcy z Redmond w taki sam wypaczony sposób jak ja parzą na świat DOM smile.gif
Tak czy inaczej jeżeli ktoś ma problemy podobne do mnie to działający sposób przedstawiam poniżej:
  1. <script src="http://code.jquery.com/jquery-latest.js"></script>
  2. <script id=skrypt_pom>
  3. function GenerujLink() {
  4. var dane=document.getElementById('pole').value;
  5. $.getScript('./skrypt.php?zmienna='+dane);
  6. }
  7. </script>
  8. <input type=text id=pole>
  9. <input type=button value=Wcisnij onclick="GenerujLink()">
  10. </body>
  11. </html>
bregovic
Trochę grzebania mówi mi że powinieneś zerknąć na jQuery, nie skompresowane, linia 2660. Dla każdego skryptu który ściągasz, tworzą nowy element script, dodają go do head (z odpowiednim src) i usuwają gdy się załaduje.
Dla potomnych:
  1. <?php
  2. var head = document.getElementsByTagName("head")[0];
  3. var script = document.createElement("script");
  4. script.src = s.url;
  5. if (s.scriptCharset)
  6.    script.charset = s.scriptCharset;
  7.  
  8. // Handle Script loading
  9. if ( !jsonp ) {
  10.    var done = false;
  11.  
  12.    // Attach handlers for all browsers
  13.    script.onload = script.onreadystatechange = function(){
  14.        if ( !done && (!this.readyState ||
  15.                this.readyState == "loaded" || this.readyState == "complete") ) {
  16.            done = true;
  17.            success();
  18.            complete();
  19.            head.removeChild( script );
  20.        }
  21.    };
  22. }
  23.  
  24. head.appendChild(script);
  25. ?>
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.