2008-11-10 6 views
11

Używamy prototypu do obsługi wszystkich naszych żądań Ajax i do prostego renderowania treści HTML, która jest następnie przypisywana do odpowiedniego div przy użyciu następującej funkcji:Jak zmusić JavaScript do wykonania w ramach odpowiedzi HTML na żądanie Ajaxa

function ajaxModify(controller, parameters, div_id) 
{ 
    var div = $(div_id); 

    var request = new Ajax.Request 
    (
     controller, 
     { 
      method: "post", 
      parameters: parameters, 
      onSuccess: function(data) { 
       div.innerHTML = data.responseText; 
      }, 
      onFailure: function() { 
       div.innerHTML = "Information Temporarily Unavailable"; 
      } 
     } 
    ); 
} 

Jednak czasami muszę wykonać JavaScript w odpowiedzi HTML i ta metoda wydaje się niezdolna do tego.

Próbuję zachować listę funkcji dla wywołań Ajax do minimum z kilku powodów, więc jeśli istnieje sposób na modyfikację istniejącej funkcji bez łamania wszędzie tego, że jest on aktualnie używany lub sposób modyfikacji odpowiedź HTML, która spowoduje, że dowolny wbudowany javascript będzie świetny.

Na marginesie, już próbowałem dodać "evalJS:" force "" do funkcji, aby zobaczyć, co by to zrobiło i nic nie pomogło.

Odpowiedz

17

Parametr:

evalScripts:true 

Zauważ, że należy używać Ajax.Updater, nie Ajax.Request

Patrz: http://www.prototypejs.org/api/ajax/updater

Ajax.Request tylko przetworzy JavaScript, jeśli nagłówki odpowiedzi to:

aplikacji/ECMA, aplikacji/JavaScript aplikacji/x ECMAScript, aplikacji/x JavaScript, text/ECMAScript tekst/JavaScript text/x ECMAScript lub text/x JavaScript

Podczas gdy Ajax.Updater przetworzy JS to evalScripts: ustawiona jest prawda. Ajax.Request jest nastawiony na transport danych, taki jak uzyskanie odpowiedzi JSON.

Ponieważ aktualizujesz HTML, powinieneś i tak używać Ajax.Updater.

+0

TO BYŁO TOTALLY WICKED! Nie mogę uwierzyć, że nigdy wcześniej tego nie widziałem. Dziękuję Ci. –

+0

Ja też. Zrobiłem ten sam błąd i spędziłem godzinę waląc głową o monitor. To dlatego, że właśnie wypluwałem JS i nie dbałem o aktualizowanie jakiegokolwiek kodu HTML. Skończyłem na aktualizacji dummy/hidden DIV, więc nie musiałem bawić się z nagłówkami serwerów. –

0

Powinieneś być w stanie zrobić coś takiego:

div.innerHTML = "<div onclick='someOtherFunctionTocall();'>"; 

Jeśli trzeba wykonać coś w tym samym czasie jak wstrzykiwanie HTML można zmodyfikować podpis ajaxModify() przekazując inny parametr, która będzie funkcją javascript, którą zamierzasz wykonać (jeśli nie jest null - co pozwala ci zachować ją opcjonalnie, ponieważ na pewno nie będziesz chciał wykonać czegoś na KAŻDYM odpowiedzi AJAX).

1

Czy ustawienie evalScripts: true jako opcja jest pomocne?

0

Wystarczy wykonać niestandardowy My_function() po ajax odpowiedzi

div.innerHTML=...ajax response text... 
my_function() 

następnie wykonać żadnej funkcji wewnątrz niestandardowego My_function()

function my_function() { 
    function_1() 
    ... 
} 

Zauważ, że My_function() powinna być gdzieś poza div .innerHTML.

-1

trzeba użyć funkcji eval(), aby uruchomić JavaScript w Ajax spoczynku może być użyty pełny oddzielić skryptu i uruchomienia go

 

function PaseAjaxResponse(somemixedcode) 
{ 
    var source = somemixedcode; 
    var scripts = new Array(); 
    while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) { 
    var s = source.indexOf("<script"); 
    var s_e = source.indexOf(">", s); 
    var e = source.indexOf("</script", s); 
    var e_e = source.indexOf(">", e); 
    scripts.push(source.substring(s_e+1, e)); 
    source = source.substring(0, s) + source.substring(e_e+1); 
} 
for(var x=0; x<scripts.length; x++) { 
try { 
    eval(scripts[x]); 
} 
catch(ex) { 
} 
} 
return source; 
} 

alliteratively więcej informacji w tej http://www.yasha.co/Ajax/execute-javascript-on-Ajax-return/article-2.html

+1

eval() jest zawsze zły. –