2013-08-30 30 views
5

Vì vậy, về cơ bản tôi đang sử dụng bài đăng jQuery để thực hiện cuộc gọi ajax đến trang php bên ngoài và sau đó tôi phản hồi kết quả, sau đó hiển thị nó trên trang thực.mã javascript được trả về thông qua ajax, nhưng không hiển thị

Vấn đề là, bất cứ khi nào trang php bên ngoài trả về một số javascript, nó không được hiển thị trên trang thực tế.

Javascript được trả lại

<script type="text/javascript">z_media = "SQgeKL07Nr"; z_autoplay=false; z_width=899; z_height=506;</script><script type="text/javascript" src="http://www.zunux.com/static/js/embed.js"></script> 

My jQuery

function videoGrabber(mirror_id, video_version, firstVideo_version, videoNumber) { 


     jQuery.post("/path/to/my/external/php/file.php", {firstParam : mirror_id, secondParam : video_version, thirdParam : firstVideo_version}, function(data) { 
      //this is your response data from serv 
     console.log(data); 
     jQuery('#videoContainer').html(data); 

    }); 
     return false; 
} 

Bây giờ nói chung, khi iframe đang được trả lại, họ đang hiển thị hoàn toàn tốt đẹp trong #videoContainer id, tuy nhiên, bất cứ khi nào mà mã nhúng javascript là được trả lại, nó không hiển thị bất cứ điều gì trong id #videoContainer. Nhưng tôi chắc chắn có thể xác nhận rằng trang php bên ngoài đang trả về dữ liệu vì tôi có thể thấy nó trong bảng điều khiển. Vì vậy, làm thế nào tôi có thể sửa lỗi này?

+0

Bạn có thể thử 'console.log (dữ liệu)' ..? – ErickBest

+0

Bạn mong đợi điều gì sẽ hiển thị trong '# videoContainer'? Tập lệnh JS của bạn chỉ có một vài biến ... không có nội dung hiển thị và không có gì gọi hàm JS. – Steve

Trả lời

2

Hãy thử thêm một eval() thực sự chạy mã Javascript bạn đang lấy:

function videoGrabber(mirror_id, video_version, firstVideo_version, videoNumber) { 
    jQuery.post("/path/to/my/external/php/file.php", {firstParam : mirror_id, secondParam : video_version, thirdParam : firstVideo_version}, function(data) { 
     //this is your response data from serv 
     console.log(data); 
     jQuery('#videoContainer').html(data); 
     eval(data); 
    }); 
    return false; 
} 

BTW hãy chắc chắn bạn có tốt security-- eval() có rất nhiều tiềm năng cho tình trạng lộn xộn nếu ai đó có thể chặn cuộc gọi ajax và tiêm mã riêng của họ.

Oh, và kể từ eval() là sẽ cố gắng để đánh giá chỉ Javascript mã, bạn cần thay đổi mã trở lại của bạn chỉ mã thô JS (không <script> tags):

z_media = "SQgeKL07Nr"; z_autoplay=false; z_width=899; z_height=506; 

Điều duy nhất khác để đối phó với điều này là:

<script type="text/javascript" src="http://www.zunux.com/static/js/embed.js"></script> 

Bạn có thể đưa tập lệnh đó vào trang gọi điện (mã có mã ajax), sau đó kích hoạt mã từ mã bạn nhận được qua ajax không? Vì vậy, mã ajax của bạn cuối cùng sẽ trở lại một cái gì đó như:

z_media = "SQgeKL07Nr"; z_autoplay=false; z_width=899; z_height=506; triggerEmbedScript(); 
+0

Vì một lý do nào đó, tôi nhận được lỗi này 'Uncaught SyntaxError: Mã thông báo không mong muốn <'. Không chắc chắn lý do tại sao, tôi chỉ thêm 'eval (dữ liệu);' – Maaz

+0

nên eval (dữ liệu) được đặt trước (#videoContainer) .html (dữ liệu)? – Maaz

+0

Nó đang cố gắng giải thích mã JS, bắt đầu bằng "

0

Vì an ninh, tôi sẽ tránh yêu cầu bên ngoài javascript và sau đó một cách mù quáng chạy nó, eval hay không. Nếu tôi là bạn, tôi sẽ trả lại các biến đó trong một đối tượng JSON. Đối với các kịch bản thêm, tôi đã có mà đã được nạp và chỉ cần gọi nó khi tôi cần nó.

Bạn đề cập đến iframe quay lại và cách chúng hoạt động đúng cách. Bạn có nghĩa là để nói rằng tập tin php của bạn có thể trở lại bất kỳ HTML để trực tiếp chèn vào #videoContainer của bạn? Tôi cũng sẽ tránh điều đó. Dữ liệu được trả về bởi yêu cầu AJAX vừa hoàn thành đi qua lãnh thổ không xác định: internet. Một cấu trúc tốt hơn có thể giúp ngăn chặn tấn công MITM hoặc XSS.

+0

Tôi đang sử dụng wordpress. Tôi đã tạo một hàm trong tệp functions.php, tệp php bên ngoài chỉ chạy hàm đó. – Maaz

0

Như tôi đã đề cập trong bình luận ở trên, mã JS trả về của bạn không thực sự làm gì cả. Nó chỉ định nghĩa một vài biến (global). Không có nội dung hiển thị nào có thể hiển thị trong #videocontainer và JS không gọi bất kỳ chức năng nào có thể kích hoạt một số hành vi.

Điều đó đang được nói, nếu bạn muốn tải và thực hiện một số JS mà bạn nhận được từ một cuộc gọi AJAX, tôi sẽ khuyên rằng thay vì cố gắng để thêm toàn bộ script tag với nội dung, phải làm như sau:

var script = document.createElement("script"); 
script.type = "text/javascript"; 
script.text = data; 
document.body.appendChild(script); 

Tất nhiên điều này chỉ hoạt động nếu bạn có thể thay đổi các dữ liệu bạn nhận được từ cuộc gọi AJAX của bạn để chuỗi này (không có thẻ):

'z_media = "SQgeKL07Nr"; z_autoplay=false; z_width=899; z_height=506;' 

nhìn chung, mã của bạn sẽ trông như thế này:

function videoGrabber(mirror_id, video_version, firstVideo_version, videoNumber) { 
    jQuery.post("/path/to/my/external/php/file.php", {firstParam : mirror_id, secondParam : video_version, thirdParam : firstVideo_version}, function(data) { 
     var script = document.createElement("script"); 
     script.type = "text/javascript"; 
     script.text = data; 
     document.body.appendChild(script); 
    }); 
    return false; 
}