Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak uruchomić javascrypt po przeslaniu kodu w AJAX ?
Forum PHP.pl > Forum > XML, AJAX > AJAX
kojocik76
Witam,
Przejrzałem kilka wątków w tym temacie ale nic sensownego nie znalazłem, może ktoś z grupowiczów mi pomoże .... ?

Otóż mam taki problem:
1.skrypt.php który generuje mi kod html+javascript - działa wywołany bezpośrednio
np.
  1. echo 'kod html';
  2. echo '<script>kod javascript </script>';
  3. echo 'kod html';


2. natomiast jeśli przepuszczam go przez AJAX - już nie !

  1. ...
  2. object.open("POST", "skrypt.php",true);
  3. ....
  4. if (object.readyState == 4 && object.status == 200) {
  5. obj_div.innerHTML= object.responseText;
  6.  
  7. /*
  8. //use eval
  9. var ob = obj_div.getElementsByTagName("script");
  10. for(var i=0; i<ob.length-1; i++){
  11. if(ob[i+1].text!=null) eval(ob[i+1].text);
  12. }
  13. */
  14.  
  15. }
  16.  
  17.  
  18. ....
  19. <div id="obj_div">
  20.  
  21. </div>
  22. ...



3. jesli w pliku skrypt.php mam np. <script> alert('tekst'); </script> - to eval działa, ale jesli np chciałbym już coś wyświetlić w odpowiednim miejscu kodu html generowanego w tym skrypcie to już nie daje rady sad.gif

Czy ktoś z szanownych grupowiczów przyjdzie mi z pomocą ? Może jest jakaś inna ścieżka na rozwiązanie tego problemu ? POMOCY !

pozdr,
AdamP
nospor
Jakbyś użył jQuery to byś nie miał problemu smile.gif
jQuery z automatu przetwarza kod js
croc
Ajax służy do pobierania danych, a nie do pobierania kodu JS. Oczywiście, można i tak, ale to nie jest najlepszy pomysł. Napisz co chcesz osiągnąć - na pewno można to zrobić w lepszy (bezpieczny) sposób.
kojocik76
Dzięki wielkie za szybką odpowiedź smile.gif

Przerobiłem kod do jQuery - fakt, szybko, miło i sprawnie ...niestety utknąłem w tym samym miejscu. A o to przykład: (później opiszę do czego mi to potrzebne, być może faktycznie powinienem isć inną drogą rozumowania?)

1. plik z ajaxem:

  1. <script type="text/javascript" src="calendar.js"></script>
  2. </head>
  3. ....
  4. function formget1(url, divobj, form)
  5. {
  6. var parameters = pobierzWartForm(form);
  7. jQuery.ajax({
  8. type: "POST",
  9. url: url,
  10. dataType: 'html',
  11. data: parameters,
  12. success: function(html_out) {
  13. $('#div1').html(html_out);
  14. }
  15. });
  16. }
  17. ......
  18.  
  19. echo '<div id="div1">
  20. <form name="form1" id="form1" action="1.php" method="post" >
  21.  
  22. <select name="s1" id="s1" onchange="formget1(\'2.php\',\'div1\',\'form1\');" style="width:160;">
  23. <option value="0" selected="selected">aaaa</option>
  24. <option value="2" >bbbb</option>
  25. </select>
  26. <script>
  27. DateInput("k15", true, "YYYY-MM-DD", "2010-06-25");
  28. </script>
  29. <input type=submit tabindex="102" value="test" name="submit">
  30. </form>';


oraz kod z pliku wywoływanego przez jQuery (ajax) ....(akurat w tym przypadku echo z pierwszego i drugiego pliku niczym się nie różni ale w założeniu ma być i to znacznie)

  1.  
  2. echo '<div id="div1">
  3. <form name="form1" id="form1" action="1.php" method="post" >
  4.  
  5. <select name="s1" id="s1" onchange="formget1(\'2.php\',\'div1\',\'form1\');" style="width:160;">
  6. <option value="0" selected="selected">aaaa</option>
  7. <option value="2" >bbbb</option>
  8. </select>
  9. <script>
  10. DateInput("k15", true, "YYYY-MM-DD", "2010-06-25");
  11. </script>
  12. <input type=submit tabindex="102" value="test" name="submit">
  13. </form>';
  14.  


OK.
to był przykład który jeśli by mi zadziałał byłbym już w domu. A teraz pokrótce opiszę co chciałbym uzyskać.
Otóż mój kod php generuje formularz na podstawie konfiguracji zapisanej w bazie.Kilka typów kontrolek może wywoływać podscenariusze formularza głównego w zależności od konfiguracji i aktualnych danych. Efekt docelowy który chcę/muszę uzyskać to aby po zmianie wartości kontrolki x odrysować nowy formularz wraz z podscenariuszem wywołanym przez tą kontrolkę bez odświeżania strony.Czyli plik php wywolany przez ajax'a ma za zadanie stworzyć nową wersję scenariusza wysyłając echo 'kod html';. Wszystko działa pięknie jeśli mam standardowe kontrolki, ele wykorzystuję w formularzu dwie dodatkowe (gotowce javascript), które po przeładowaniu przez ajax już nie działają sad.gif. przykład powyżej.
Problem pokrótce wygląda tak. Czy jest na to jakieś sensowne rozwiązanie questionmark.gif?

pozdr,
AdamP
nospor
1) do diva o id div1 wgrywasz ajaxem znowu diva o id div1. W efekcie koncowym masz dwa divy o id div1 jeden w drugim
2) nie <script> a <script type="text/javascript">
3) trudno mi coś wiecej powiedziec, mi tam takie cos zawsze dziala
4) masz to gdzies wystawione? Mozemy obejrzec to w dzialaniu?
5) zainstaluj sobie FireBug'a dla FireFox - bardzo pomaga przy takich sprawach
kojocik76
Co do pkt 1. i 2. to faktycznie, jest jak mówisz. mój błąd co nie zmienia faktu że mi nie działa.

Dopiero dziś mogłem wystawić przykład. Możecie to podejrzeć na http://www.czg.pl/ajax/1.php
Oba comboboxy wywołują akcję ajaxa. plik 2.php daje takie samo echo form1. efekt można zobaczyć.

1.php
  1.  
  2. <html>
  3. <head>
  4. <script type="text/javascript" src="calendar.js"></script>
  5. <script type="text/javascript" src="jquery-1.4.2.js"></script>
  6. </head>
  7. <body>
  8.  
  9. <script type="text/javascript">
  10. // tworzymy zmienna
  11.  
  12. function formget1(url, divobj, form)
  13. {
  14. var parameters = getFormValues(form);
  15. jQuery.ajax({
  16. type: "POST",
  17. url: url,
  18. dataType: 'html',
  19. data: parameters,
  20. success: function(html_out) {
  21. $('#div1').html(html_out);
  22. }
  23. });
  24. }
  25.  
  26. function getFormValues(form)
  27. {
  28. var str = "";
  29. var fobj = document.getElementById(form);
  30. var valueArr = null;
  31. var val = "";
  32. var cmd = "";
  33. for(var i = 0;i < fobj.elements.length;i++) {
  34. switch(fobj.elements[i].type) {
  35. case "text":
  36. str += fobj.elements[i].name +
  37. "=" + escape(fobj.elements[i].value) + "&";
  38. break;
  39. case "textarea":
  40. str += fobj.elements[i].name +
  41. "=" + escape(fobj.elements[i].value) + "&";
  42. break;
  43. case "select-one":
  44. str += fobj.elements[i].name +
  45. "=" + fobj.elements[i].options[fobj.elements[i].selectedIndex].value + "&";
  46. break;
  47. case "radio":
  48. if (fobj.elements[i].checked) {
  49. str += fobj.elements[i].name +
  50. "=" + fobj.elements[i].value + "&";
  51. }
  52. break;
  53. case "checkbox":
  54. if (fobj.elements[i].checked) {
  55. str += fobj.elements[i].name + "=1&";
  56. } else {
  57. str += fobj.elements[i].name + "=0&";
  58. }
  59. break;
  60. }
  61. //str += fobj.elements[i].name +
  62. // "=" + fobj.elements[i].type + "&";
  63.  
  64. }
  65. str = str.substr(0,(str.length - 1));
  66. return str;
  67. }
  68.  
  69. </script>
  70.  
  71. <?php
  72.  
  73. echo '<div id="div1">
  74. <form name="form1" id="form1" action="1.php" method="post" >
  75.  
  76. <select name="s1" id="s1" onchange="formget1(\'2.php\',\'div1\',\'form1\');" style="width:160;">
  77. <option value="0" selected="selected">aaaa</option>
  78. <option value="2" >bbbb</option>
  79. </select>
  80. <select name="s2" id="s2" onchange="formget1(\'2.php\',\'div1\',\'form1\');" style="width:160;">
  81. <option value="0" selected="selected">cccc</option>
  82. <option value="2" >dddd</option>
  83. </select>
  84. <input type="text" name="f111" value="12345"/>
  85. <script type="text/javascript">
  86. DateInput("k15", true, "YYYY-MM-DD", "2010-06-25");
  87. </script>
  88. <input type=submit tabindex="102" value="test" name="submit">
  89. </form>
  90. ';
  91. print_r($_POST);
  92.  
  93. ?>
  94. </div>
  95. </body>
  96. </html>
nospor
Mi tam Twoje selecty przeladowują całą stronę. Nic dziwnego ze ci nie dziala winksmiley.jpg
kojocik76
Ano właśnie coś jest nie tak z <script .... w pliku 2.php. bo jak wytne ten fragment to jest OK. Zerknij teraz exclamation.gif!
nospor
a pokaz dokladnie co ladujesz w skript2.php
Włącznie z javascriptami. Dokladnie co do joty prosze smile.gif

Co robi te:
DateInput("k15", true, "YYYY-MM-DD", "2010-06-25");
Bo mi się w firebugu wywala ze nie znalazl elementu k15 czy jakos tak.
kojocik76
plik 2.php

  1. <?php
  2.  
  3. <form name="form1" id="form1" action="1.php" method="post" >
  4.  
  5. <select name="s1" id="s1" onchange="formget1(\'2.php\',\'div1\',\'form1\');" style="width:160;">
  6. <option value="0" selected="selected">aaaa</option>
  7. <option value="2" >bbbb</option>
  8. </select>
  9. <select name="s2" id="s2" onchange="formget1(\'2.php\',\'div1\',\'form1\');" style="width:160;">
  10. <option value="0" selected="selected">cccc</option>
  11. <option value="2" >dddd</option>
  12. </select>
  13. <input type="text" name="f111" value="xxxxxxx"/>
  14.  
  15. <input type=submit tabindex="102" value="test" name="submit">
  16. </form>
  17. ';
  18. print_r($_POST);
  19.  
  20. ?>


i wersja z javascript

  1. <?php
  2.  
  3. <form name="form1" id="form1" action="1.php" method="post" >
  4.  
  5. <select name="s1" id="s1" onchange="formget1(\'2.php\',\'div1\',\'form1\');" style="width:160;">
  6. <option value="0" selected="selected">aaaa</option>
  7. <option value="2" >bbbb</option>
  8. </select>
  9. <select name="s2" id="s2" onchange="formget1(\'2.php\',\'div1\',\'form1\');" style="width:160;">
  10. <option value="0" selected="selected">cccc</option>
  11. <option value="2" >dddd</option>
  12. </select>
  13. <input type="text" name="f111" value="xxxxxxx"/>
  14. <script type="text/javascript">
  15. DateInput("k15", true, "YYYY-MM-DD", "1999-01-15");
  16. </script>
  17. <input type=submit tabindex="102" value="test" name="submit">
  18. </form>
  19. ';
  20. print_r($_POST);
  21.  
  22. ?>


DateInput tworzy kontrolke data ktora masz w formularzu podstawowym plik 1.php
ale problem chyba ogolnie jest z javascriptem po zaladuwaniu kodu w ajax. zamieniajac na
  1. <script type="text/javascript">
  2. document.write(2+3);

jest to samo sad.gif
nospor
No hej,
to wina przez to document.write
Jak tam dasz zwyklego alerta
alert('blabla');
to dziala.
A twoj kalendarz również korzysta z document.write.

Nigdy nie uzywam tego ustrojstwa "document.write" więc się nigdy nie spotkalem z tym problemem.
Nie mozesz skorzystac z normalnej kontrolki kalendarza? np. jQuery calendar. One pracują trochę bardziej "normalnie" winksmiley.jpg
erix
Cytat
Nigdy nie uzywam tego ustrojstwa "document.write" więc się nigdy nie spotkalem z tym problemem.

Tej konstrukcji można używać wyłącznie na etapie renderowania strony. Więc w jakimkolwiek zdarzeniu ona po prostu nie zrobi niczego.
nospor
Cytat
Więc w jakimkolwiek zdarzeniu ona po prostu nie zrobi niczego.
Hehe, no wlasnie nie. W tym wlasnie opisanym tu przypadku to "badziewie" nie dość ze robi to jeszcze psuje smile.gif. powoduje odswieżenie strony.
kojocik76
OK. Tak zrobiłem. i działa exclamation.gif! dzięki wielkie za pomoc smile.gif
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.