2008-11-10 31 views
11

Chúng tôi đang sử dụng Prototype cho tất cả các yêu cầu Ajax xử lý của chúng tôi và đơn giản là chúng ta sẽ tạo nội dung HTML sau đó được gán cho div thích hợp bằng cách sử dụng hàm sau:Làm thế nào để bắt buộc Javascript thực thi trong phản hồi HTML với Ajax Request

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"; 
      } 
     } 
    ); 
} 

Tuy nhiên, đôi khi tôi cần thực thi Javascript trong phản hồi HTML và phương pháp này dường như không có khả năng thực hiện điều đó.

Tôi đang cố gắng giữ danh sách hàm cho các cuộc gọi Ajax ở mức tối thiểu vì một số lý do để có cách sửa đổi hàm hiện tại mà không vi phạm ở mọi nơi mà hiện đang được sử dụng hoặc cách sửa đổi phản hồi HTML sẽ gây ra bất kỳ javascript nhúng nào để thực thi điều đó sẽ tuyệt vời.

Bằng cách lưu ý, tôi đã thử thêm "evalJS: 'force'" vào hàm để xem nó sẽ làm gì và nó không giúp ích gì.

Trả lời

17

Các tham số là:

evalScripts:true 

Lưu ý rằng bạn nên sử dụng Ajax.Updater, không Ajax.Request

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

Ajax.Request sẽ chỉ trình JavaScript nếu tiêu đề phản hồi là:

application/ECMAScript, application/javascript, application/x-ECMAScript, application/x-javascript, text/ECMAScript, text/javascript, text/x-ECMAScript, hoặc text/x-javascript

Trong khi đó Ajax.Updater sẽ xử lý JS là evalScripts: true được đặt. Ajax.Request hướng đến việc truyền dữ liệu, chẳng hạn như nhận được phản hồi JSON.

Vì bạn đang cập nhật HTML, bạn nên sử dụng Ajax.Updater anyways.

+0

R WASNG HOÀN TOÀN ĐÃ ĐƯỢC CHÉP! Tôi không thể tin rằng tôi chưa bao giờ thấy điều này trước đây. Cảm ơn bạn. –

+0

Tôi cũng thế. Tôi đã phạm sai lầm tương tự và dành một giờ để đập đầu vào màn hình của tôi. Đó là bởi vì tôi vừa mới tung ra JS và không quan tâm đến việc cập nhật bất kỳ HTML nào. Tôi đã kết thúc cập nhật một DIV giả/ẩn chỉ vì vậy tôi không phải fiddle với tiêu đề máy chủ. –

0

Bạn sẽ có thể làm điều gì đó như thế này:

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

Nếu bạn cần phải thực hiện một cái gì đó cùng một lúc như tiêm HTML, bạn có thể thay đổi chữ ký của ajaxModify() bằng cách truyền tham số khác, đó sẽ là chức năng javascript bạn sẽ thực hiện (nếu nó không phải là null - mà hãy để bạn giữ nó tùy chọn, vì bạn chắc chắn sẽ không muốn thực hiện một cái gì đó trên phản ứng EVAX EVAX).

1

Cài đặt evalScripts: true có phải là trợ giúp tùy chọn không?

0

Chỉ cần thực hiện một my_function tùy chỉnh() sau khi phản ứng ajax

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

sau đó thực hiện bất kỳ chức năng bên trong my_function tùy chỉnh()

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

Lưu ý rằng my_function() có thể trong ngưỡng ngoài div .innerHTML.

-1

bạn cần phải sử dụng eval() để chạy javascript trong Ajax nghỉ ngơi này có thể sử dụng đầy đủ để tách các kịch bản và chạy nó

 

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 để biết thêm thông tin, xem này http://www.yasha.co/Ajax/execute-javascript-on-Ajax-return/article-2.html

+1

eval() luôn luôn là ác. –

Các vấn đề liên quan