Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ajax] Problem z javascript
Forum PHP.pl > Forum > XML, AJAX
slammer
Problem polega na tym, że gdy wyświetlam na stronie responseText w którym jest fragment kodu javascript to w efekcie kod ten nie zostaje wykonany, po prostu nic sie nie dzieje. Gdy ten sam plik wyświetle normalnie na stronie to wszystko działa jak należy... Jak zrobić, żeby JS zadziałał przy wczytaniu z ajaxa?

To jest plik do którego odwołuję się przez ajax i zwracam go na stronie.


  1. <a href="java script: void(0)" onclick="alert('asd');">as
  2. <script language="JavaScript" type="text/javascript">
  3. alert('asd');
  4.  
  5. <form action="" method="post">
  6. <input type="hidden" name="order" id="order" value="" />
  7. <input type="submit" onclick="getSort()" value="Sortuj" />
  8. </form>



Link oczywiście poprawnie wyświetla alert.
prond
Spróbuj skorzystać z prototype'a tam masz metodę `update` w klasie `Element`
http://www.prototypejs.org/api/element/update

Możesz pobawić się samemu, ale jest z tym trochę roboty:
- wyciągasz z tekstu JS
- wklejasz go do HTML
- wykonujesz JS zawarty w tekście
snipe
może przepuść wynik przez funkcję eval()? winksmiley.jpg
yaotzin
Witam! mam podobny problem, z tym że ja używam biblioteki xajax do obsługi technologii AJAX, i w sumie wszystko sprawnie idzie, po za tym małym mankamentem jakim jest właśnie problem z javascript umieszczonym w zwracanym kodzie strony...

Czy ktoś jest w stanie mi pomóc z tym questionmark.gif

P.S. szukałem w dokumentacji xajax może jest jakaś gotowa funkcja która ten problem niweluje, mi się nie udało jej znaleźć :/
drbane
Witam, mam identyczny problem, wczytując coś do DIV co posiada JS i powinno się wykonywać - poprostu nie działa. Jak widzę problem jest spory bo nie ma żadnych odpowiedzi rozwiązujących to.
yaotzin
Swoje już załatwiłem, w bibliotece xajax jest taka funkcja addScriptCall i addScript w zupełności wystarczyły do moich celów opisałem to w jakimś innym wątku.

A nie działa z tego powodu iż skrypt musiałby być wywołany przy ladowaniu strony, a przy ajax jest nieco inaczej i stąd problem, należy zrobić tak jak jest powyżej napisane albo użyć prototype.js (doskonały wzorzec projektowy) albo napisać własną funckcję temu służącą (może się ktoś podzieli :]) lub użyć tak jak ja to zrobiłem xajax i jego funkcji bibliotecznych. można też z xajax zgapić jak to jest zrobione metod jest wiele, a wynik pewnie jeden.
skowron-line
z przykroscia musze dolaczyc do dyskucji poniewaz mam taki sam problem z tym ze ja uzywam advAJAX i po sprawdzeniu w bazie w przypadku bledu chce zeby zwrocilo kod js ktory zmieni kolor pola input ale zamiast zmienic kolor kod jest wyswietlany.

Zna ktos rozwiazanie dla advAJAX??
kwiateusz
wysyłany kod przepuścić przez eval?
skowron-line
Cytat(kwiateusz @ 4.05.2007, 09:02:16 ) *
wysyłany kod przepuścić przez eval?


to pytanie czy odpowiedz??
kwiateusz
Odpowiedź w formie pytania smile.gif Skoro przesyłasz ajaxem javascript to aby sie wykonał trzeba go wrzucić w eval bo inaczej jest traktowany jak zwykły tekst...
drbane
No dobra, EVAL , ale jak tego użyć? Skoro mój skrypt wczytuje coś do DIV'a za pomocą .innerHTML? Jak użyć EVAL?
slammer
możecie "przefiltrować" responseText w taki sposób:

  1. item = myreq.responseText;
  2. data = item.split('\n');
  3. arraylen = data.length;
  4. var i = 0;
  5. while(i < arraylen)
  6. {
  7. if( data[i].indexOf("script") > -1)
  8. {
  9. i++;
  10. while(data[i].indexOf("/script") < 0)
  11. {
  12. eval(data[i]);
  13. i++;
  14. }
  15. }
  16. i++;
  17. }


znalezione gdzies na forum biggrin.gif sprawdziłem i działa teraz bez zarzutu winksmiley.jpg
box3r
Może to pomoże



Czyli najważniejsze dodać javascript do objektu header;

poza tym w dodawanym .js można dodać funkcje która ma być od razu po załadowaniu wywołana.

no i guitar.gif
zaxx
Witam, przeczytałem wcześniejsze posty nie rozwiązało to mojego problemu. To mój kod:

  1. <script type="text/javascript">
  2.  
  3. if (window.XMLHttpRequest) {
  4. ObiektXMLHttp = new XMLHttpRequest();
  5. } else {
  6. if (window.ActiveXObject) {
  7. ObiektXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
  8. }
  9. }
  10.  
  11.  
  12. function getData(zrodlo, cel) {
  13.  
  14. if(ObiektXMLHttp)
  15. {
  16. var cel = document.getElementById(cel);
  17. ObiektXMLHttp.open("GET", zrodlo);
  18.  
  19. ObiektXMLHttp.onreadystatechange = function() {
  20. if (ObiektXMLHttp.readyState == 4) {
  21. cel.innerHTML = ObiektXMLHttp.responseText;
  22. }
  23. }
  24. ObiektXMLHttp.send(null);
  25. }
  26. }
  27.  
  28. </script>


Przy wykorzystaniu tego kodu pobieram podstronę i ją ładuję do div`a, no ale nie wykonuje się kod javascript tam zawarty, co jest logiczne, bo musi go przeglądarka przetworzyć a nie ma jak bo się strona nie przeładowała.



Cytat(box3r @ 6.05.2007, 12:41:37 ) *
Może to pomoże



Czyli najważniejsze dodać javascript do objektu header;

poza tym w dodawanym .js można dodać funkcje która ma być od razu po załadowaniu wywołana.

no i guitar.gif



To działa, ale tylko jak ładujesz zewnętrzne pliki js, a jak zrobić aby wykonał się kod między znacznikami <script>. Jak ktoś wiem, to prosił bym o jakieś konkretne rozwiązanie (co cza do mojego kodu dodać aby śmigało), bo przeglądnełem już chyba ze 100 storn www i kurna żadnych konkretów ... i proszę bez tekstów poszukaj w google, bo szuakłem i naprawdę ciężko coś znaleźć, powtarza się motyw z eval(), ale próbowałem i muszę chyba coś źle robić, bo za chiny mi to nie działa ... javascript to nie mój mocny punkt, ale chcę usprawnić portal napisany w php i gdyby nie ten problem , to szło mi nieźle z tym ajaxem..... z góry dzięki za odp.
konradk2
to ciekawe ja korzystam z innerHTML i mi wszystko poprawnie działa ;]
a i podczas wykorzystania innerHTML przeglądarka musi zinterpretować to co zostanie przypisane więc kod powinien się wykonać ;]
zaxx
No w ajaxie tak nie jest niestety ... kod się nie wykonuje
snipe
nie umiecie przepuścić wyniku przez eval()questionmark.gif
zaxx
Cytat(snipe @ 10.05.2007, 21:01:39 ) *
nie umiecie przepuścić wyniku przez eval()questionmark.gif


Wychodzi misiu na to że nie, pomogłeś mi że hej laugh.gif

Efekt przepuszczenia przez eval(), jest taki że strona mi się przeładowała i wykonał się tylko kod javascript. Dla przykładu, w pliku jest kod:

  1. <script language="JavaScript" type="text/javascript">
  2. <!--
  3. document.write("<a class=\"link\" style=\"color:#a42626; font-weight:bold\" href=\"");
  4. document.write("mailto:");
  5. document.write("xxxx");
  6. document.write("@");
  7. document.write("wp.pl");
  8. document.write("\">");
  9. document.write("xxxxx");
  10. document.write("@");
  11. document.write("wp.pl");
  12. document.write("</a>");
  13. -->
  14. </script>

Plik ten pobieram przez ajax`a i wrzucam do div`a.

Przed wykonianiem :
  1. cel.innerHTML = ObiektXMLHttp.responseText;

wykonuję funkcję którą podał kolega kilka postów wyżej. Efekt w FF, strona się przeładowuje i wyświetla się link xxxxx@wp.pl , czyli kod się wykonał, tylko że nic po za nim nie ma. W IE nic się nie dzieje, tylko sygnalizuje błąd javascript. Więc pytam się jak to powinno wyglądać, bo może coś źłe robię ...
slammer
Kod działa tylko że jest mały zonk... trzeba całego JS zapisać w jednej linii... W przeciwnym wypadku zostanie zinterpretowana tylko jedna linijka kodu.
zaxx
Fakt, teraz jak dałem w jednej linii kod to działa ... ale kurna dużo zachodu z tym, chyba sobie podaruje tego ajaxa ..... pozdro
skowron-line
mam ajaxa ktory ma wywalic skrypt ktory wyglada tak
Kod
<?php

    $zapytanie = 'SELECT * FROM dane_firm WHERE id_firm = '.$_GET['id'].' ';
        $query = mysql_query($zapytanie);
        echo'<srcipt type="text/javascript">';
        
    while($row = mysql_fetch_array($query)) {
        echo'
                var a = document.getElementById(\'naglowek_1\');
                    a.value = "'.$row['nip'].'";
                var b = document.getElementById(\'a_5\');
                    b.innerHTML = "'.$row['nazwa_firmy'].'";
                var c = document.getElementById(\'b_11\');
                    c.value = "'.$row['kraj'].'";
                var d = document.getElementById(\'b_12\');
                    d.value = "'.$row['wojewodztwo'].'";
                var e = document.getElementById(\'b_13\');
                    e.value = "'.$row['powiat'].'";
                var f = document.getElementById(\'b_14\');
                    f.value = "'.$row['gmina'].'";
                var g = document.getElementById(\'b_15\');
                    g.value = "'.$row['ulica'].'";
                var h = document.getElementById(\'b_16\');
                    h.value = "'.$row['nr_domu'].'";
                var i = document.getElementById(\'b_17\');
                    i.value = "'.$row['nr_lokalu'].'";
                var j = document.getElementById(\'b_18\');
                    j.value = "'.$row['miejscowosc'].'";
                var h = document.getElementById(\'b_19\');
                    h.value = "'.$row['kod'].'";
                var l = document.getElementById(\'b_20\');
                    l.value     = "'.$row['poczta'].'";
        ';        
                
            if($row['rodzaj_podatnika'] == 1){
                echo'
                    var cb_1 = document.getElementById(\'b_8_1\');
                        cb_1.checked = true;
                ';
            }elseif($row['rodzaj_podatnika'] == 2){
                echo'
                    var cb_2 = document.getElementById(\'b_8_2\');
                    cb_2.checked = true;
                ';
            }
                    
    }
            echo'</script>';

    
?>

Cytat(slammer @ 5.05.2007, 10:13:48 ) *
możecie "przefiltrować" responseText w taki sposób:

  1. item = myreq.responseText;
  2. data = item.split('\n');
  3. arraylen = data.length;
  4. var i = 0;
  5. while(i < arraylen)
  6. {
  7. if( data[i].indexOf("script") > -1)
  8. {
  9. i++;
  10. while(data[i].indexOf("/script") < 0)
  11. {
  12. eval(data[i]);
  13. i++;
  14. }
  15. }
  16. i++;
  17. }

no ale skrypt wykonuje tylko 2 pierwsze operacje a potem wywala blad
Kod
Błąd: niepasujący znacznik. Oczekiwano: </srcipt>.
Plik źródłowy: http://localhost/viki/druk%20pcc3/lista.php?id=1&_uniqid=922999979
Wiersz: 29, Kolumna: 7
Kod źródłowy:
                </script>    ----------------------------------^

i
Kod
Błąd: data[i] has no properties
Plik źródłowy: http://localhost/viki/druk%20pcc3/druk.php
Wiersz: 132


pozniej w poscie bylo napisane zeby dac wszystko w jednej lini ale tez mi to niedziala
snipe
  1. <?php
  2. echo'<srcipt type="text/javascript">';
  3. ?>


z tego co wiem to powinno być <script type="text/javascript"> winksmiley.jpg

a poza tym sprawdź czy zmienna data coś zawiera, bo chyba jednak nie - alert(data.length) tongue.gif
Arnimag
Hmm mam ten sam problem i używam xajaxa który wrzuca podstrone do diva, niemam pomysłu jak do tego kodu użyć eval() może ma ktoś jakiś pomysł, albo ma ktoś lepsze rozwiązanie takiej funkcji, ale wymóg to działający php (w tej funkcji działa) no i javascript (który nie działa)

Javascript wykonuje sie nie używając xajaxa, a z xajaxem już nie:/ tu macie fragment kodu podstrony:

  1. <script language='javascript' type='text/javascript'>
  2. document.write('Wypisz sie');


A tu tą funkcje Xajaxa:

  1. <?php $xajax->registerFunction('wklej');
  2. function wklej($adres_podstrony, $miejsce_wklejenia) 
  3. {
  4. ob_start(); 
  5. include $adres_podstrony; 
  6. $zawartosc_strony = ob_get_contents(); 
  7. $objResponse = new xajaxResponse();
  8. $objResponse->addassign($miejsce_wklejenia, 'innerHTML', $zawartosc_strony); 
  9. return $objResponse; 
  10. }
  11. ?>
yaotzin
Cytat(Arnimag @ 4.07.2007, 19:27:04 ) *
Hmm mam ten sam problem i używam xajaxa który wrzuca podstrone do diva, niemam pomysłu jak do tego kodu użyć eval() może ma ktoś jakiś pomysł, albo ma ktoś lepsze rozwiązanie takiej funkcji, ale wymóg to działający php (w tej funkcji działa) no i javascript (który nie działa)

Javascript wykonuje sie nie używając xajaxa, a z xajaxem już nie:/ tu macie fragment kodu podstrony:

  1. <script language='javascript' type='text/javascript'>
  2. document.write('Wypisz sie');


A tu tą funkcje Xajaxa:

  1. <?php $xajax->registerFunction('wklej');
  2. function wklej($adres_podstrony, $miejsce_wklejenia) 
  3. {
  4. ob_start(); 
  5. include $adres_podstrony; 
  6. $zawartosc_strony = ob_get_contents(); 
  7. $objResponse = new xajaxResponse();
  8. $objResponse->addassign($miejsce_wklejenia, 'innerHTML', $zawartosc_strony); 
  9. return $objResponse; 
  10. }
  11. ?>


Może warto było przeczytać kilka postów wyżej co piszę na ten temat...
Arnimag
Hmm wybacz ale jeżeli masz mnie tak odsyłać wyżej to lepiej nic nie pisz, najwidoczniej to z góry nie zbyt pasuje do mojego, albo ja też nie umiem znaleść tam dla mnie rozwiązania ( ja używam xajaxa a wyżej nie było żadnego z nim przykładu) a jak już tak odsyłasz to zrobił byś cytaty odpowiednich postów gdzie takowe rozwiązanie jest... ehh
yaotzin
Cytat
Swoje już załatwiłem, w bibliotece xajax jest taka funkcja addScriptCall i addScript w zupełności wystarczyły do moich celów opisałem to w jakimś innym wątku.


oto i odpowiedź z powyżej

http://forum.php.pl/index.php?showtopic=67...st=?entry354974

i mój post z tamtego topic'u

Cytat
:/ Tak to jest właśnie z technologiami openSourcowymi nie wszystkie mają do końca dobrą dokumentację :/ i to wkurza. Aby sobie poradzić z problemem który macie wystarczy dodać do twojej funkcji wywołanie

$obj->addScriptCall

Kod PHP1
2
3
4
5
6
7
8
9
10
11
12
13
14 <?php
function testAjaxa($id)
{
$obj = new xajaxResponse();
$html = '<a href="images/zdjecie.jpg" rel="lightbox" title="my caption">image</a>';
$obj->addAssign($id,'innerHTML',$html);


$obj->addScriptCall("mojaFunkcja", "argument1", "argument2");


return $obj;
}
?>



A oprócz tego warto zapoznać się z tymi metodami:

xajaxResponse
addAlert
addAppend
addAssign
addClear
addConfirmCommands
addCreate
addCreateInput
addEvent
addHandler
addIncludeScript
addInsert
addInsertAfter
addInsertInput
addInsertInputAfter
addPrepend
addRedirect
addRemove
addRemoveHandler
addReplace
addScript
addScriptCall
getXML
loadXML
outputEntitiesOff
outputEntitiesOn
setCharEncoding
xajaxResponse

zakładam że interesują was najbardziej te:

addIncludeScript - dodaje skrypt w JS który ma sie wykonać zasada dodawania jest taka
$obj->addIncludeScript("mojefunkcje.js");
addScript - pozwala na wpisanie własnego skryptu do otrzymywanego pytania (nie wiem jak to nazwać :/ jest już prawie 2 i szare komórki idą spać)

$obj->addScript("var x = prompt('Podaj jakiś tekst');");

addScriptCall - wywołuje funkjcę zawartą w zwracanej odpowiedzi.

$obj->addScriptCall("mojaFunkcja", "argument1", "argument2");

Jak będę miał kiedyś czas to opiszę wszystkie metody zawarte w klasie xajax i funkcje. może się komuś przyda.




I Wybaczam....
morrison
mam podobny problem, jeszzce nie mialem okazji sie z nim spotkac, uzywam advajax i mam taka funkcje ktora w parametrze ma wskazany plik ktory ma wrzucic do div'a:

  1. <script type="text/javascript">
  2. function showDiv(address) {
  3.  
  4. advAJAX.setDefaultParameters({
  5. onInitialization : function(obj) { document.getElementById(obj.tag).innerHTML = "Preparing..."; },
  6. onLoading : function(obj) { document.getElementById(obj.tag).innerHTML = "Loading..."; },
  7. onSuccess : function(obj) { document.getElementById(obj.tag).innerHTML = obj.responseText; },
  8. onError : function(obj) { document.getElementById(obj.tag).innerHTML = "Error..."; }
  9. });
  10. advAJAX.get({ url: address, tag: "main_text" });
  11. advAJAX.setDefaultParameters({});
  12. }


wewnatrz dolaczonego kodu chce uzyc lightbox'a:
<a href="../img/gallery/001.jpg" rel="lightbox" title="">
<img src="../img/gallery/001s.jpg" width="" height="" alt="" title="" />
</a>
i niestety nie dziala wyswietlanie obrazka w lightbox przez to ze jest to wrzucone do div'a przez ajax.
lightbox mam umieszczony w naglowku glownego pliku:
<script type="text/javascript" src="js/lightbox.js"></script>
czy powinienem ten plik js dolaczyc w pliku ktory wrzucam do div'a i przepuscic go przez eval() jak ktos sugerowal zeby zadzialalo?
czy mozna to inaczej rozwiazac?

pozdr
skowron-line
Tzn. plik lightbox -a dobrze ze masz w pliku głównym przez eval() przerzuć to co ladujesz do diva. Chodz teoretycznie powinno działać
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.