2011-12-09 44 views
9

Ok mã HTML sau đây được phân tách khi tôi tải một trang:Javascript không tải sau khi AJAX gọi

<div id="clip-wrapper"> 
    <script type="text/javascript"> 
     alert("bla"); 
    </script> 
</div> 

Điều này rõ ràng dẫn đến cảnh báo cho biết "bla", sau khi gọi AJAX của tôi, phân tích cú pháp HTML mã trông giống như sau:

<div id="clip-wrapper"> 
<script type="text/javascript"> 
    alert("ajaxbla"); 
</script> 
</div> 

Mặt khác, không dẫn đến cảnh báo. Tại sao? Và làm cách nào để khắc phục điều này?

+0

kiểm tra câu trả lời thay đổi nội dung –

Trả lời

8

Nếu có bất kỳ tập lệnh nào được tải vào dom của bạn từ cuộc gọi Ajax, họ sẽ không được thực thi vì lý do bảo mật.

Để có được kịch bản để thực hiện, bạn sẽ cần phải tách nó ra khỏi phản ứng, và chạy nó thông qua eval

Lý tưởng nhất là mặc dù, bạn sẽ muốn chạy script của bạn như một callback khi yêu cầu ajax của bạn đã hoàn thành. Nếu bạn đang sử dụng jQuery, điều này sẽ là sự kiện thành công của cuộc gọi ajax của bạn và nếu bạn đang thực hiện điều đó, nó sẽ là sự kiện readyStateChange của đối tượng xhr của bạn.

EDIT

Nếu bạn thực sự muốn lựa chọn tùy chọn eval, bạn có thể thử một cái gì đó như thế này:

document.getElementById(contentDiv).innerHTML = xmlHttp.responseText; 
eval(document.getElementById("clip-wrapper").innerHTML); 
+0

Bạn có thể giải thích cách tôi có thể đưa nó ra khỏi phản hồi không? Và chạy nó thông qua eval sau đó? Tôi đang sử dụng đoạn mã sau: 'function stateChanged() { if (xmlHttp.readyState == 4) document.getElementById (contentDiv) .innerHTML = xmlHttp.responseText; } ' trong đó contentDiv là trình bao bọc trong trường hợp này. (nó đơn giản như eval (xmlHttp.responseText);?) – pbond

+0

Ok Tôi nghĩ rằng tôi có nó đúng, nhưng nó vẫn không hoạt động: 'if (xmlHttp.readyState == 4) { document.getElementById (contentDiv) .innerHTML = xmlHttp.responseText; eval (document.getElementById (contentDiv) .innerHTML); } ' Tôi có thiếu gì đó không? Cảm ơn sự giúp đỡ, thực sự đánh giá cao nó! – pbond

+1

Tôi không nghĩ rằng eval thích các thẻ script trong đó - bạn có thể gửi trả lời mà không có chúng không? –

1

đưa bạn mã trong

$(document).ready(function() 
{ 
    alert(msg); 
}); 

hoặc tận dụng sự kiện readysatchange của đối tượng XMLHttp.

XMLHttpobject.readyStateChange(furnction() { alert('msg'); }); 

Sửa

nếu bạn đang sử dụng jquery hơn đi cho

$.ajax({ 
    url: "test.html", 
    context: document.body, 
    success: function(){ 
    $(this).addClass("done"); 
    } 
}); 

đây trong trường hợp những thành công bạn có thể viết mã của bạn mà được thực hiện một khi bạn đang thực hiện với ajax.

+0

Tôi đã thử gợi ý của bạn, nó phân tích mã HTML sau:

nhưng nó không đưa ra một cảnh báo. PS. làm cách nào để lấy mã trong nhận xét? – pbond

+0

hey bạn cần phải bao gồm jQuery cho rằng ................. –

+0

Nó được bao gồm, khi tôi đang sử dụng Wordpress. – pbond

1

bất kỳ mã bên trong cơ thể ở giữa script thẻ sẽ chỉ được thực hiện trong khi tải các tài liệu.

trong cuộc gọi ajax, sử dụng callback hoặc success: hoặc oncomplete: để xử lý phản hồi ajax nếu bạn đang sử dụng jQuery.

0

Bạn có nghĩa là mã html thứ hai sẽ xuất hiện dưới dạng phản hồi ajax ?? Bạn thậm chí đã chèn html vào trang hiện tại chưa?

Cái gì đó như,

document.body.innerHTML = ajax_response; 

Nhưng ngay cả với innerHTML thay thế tôi làm không phải là điều các script bên trong nó sẽ được tự động thực hiện. Trình duyệt sẽ phân tích cú pháp script nhưng sẽ không tự động chạy nó.(Ví dụ: nếu bạn có định nghĩa function trong html, sau cuộc gọi ajax, bạn sẽ có thể gọi các chức năng đó)

Tùy chọn khác là sử dụng document.write, nó sẽ thay thế toàn bộ nội dung trang bằng html mới và các thẻ script trong đó sẽ được thực thi tự động.

document.write(ajax_response); 

Hope this helps,

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