10/10/2018, 00:15

Exec a script from ajax

Chào mọi người, hiện mình đang làm một trang có các tab được load nội dung bằng ajax. Các tab ấy sẽ load các đoạn mã widget từ các nguồn khác nhau. Không biêt làm thế nào để có thể thực thi các cấu trúc mã dạng ấy khi load xong ajax về. Mình xài jQuery, nếu là javascript không dùng framework cũng được, mình sẽ chế biến lại

Cảm ơn nhiều

P/z : Hiện mình đang cần rất gấp, ai biết cách nào chỉ mình với, và mình đoán trước rằng các widget thường đưa ra một đoạn script để config, rồi tới 1 tag script có src đến file js ngoài. Ác quá
Thanh duc viết 02:27 ngày 10/10/2018
thử hàm eval chưa 20 ký tự
sacroyant viết 02:26 ngày 10/10/2018
Không hiểu ý Zoe lắm ! Nếu là append 1 script từ ngoài thì có thể viết 1 hàm như thế này :

PHP Code:
     function appendScript(url){
         var    
oScript document.createElement("script");
           
oScript.type 'text/javascript';
            
oScript.src url;
          
document.body.appendChild(oScript);
     } 
1 script bên ngoài vẫn có thể thực thi trên trang của mình. Tùy theo cấu trúc mỗi widget mà xử lý thôi. Chẳng hạn nếu nó trả về chuỗi JSON thì dùng eval.

Cậu miêu tả rõ hơn vấn đề, hay cho 1 tình huống cụ thể đi
zoejoe viết 02:30 ngày 10/10/2018
Giả sử như em có một đoạn script sau :
Code:
 

<script src="http://www.gmodules.com/ig/ifr?url=http://www.canbuffi.de/gadgets/clock/clock.xml&amp;up_title=Clock%20%26%20Date&amp;up_time_format=0&amp;up_seconds=1&amp;up_date_format=0&amp;up_dayofweek=1&amp;up_offset_hours=&amp;up_offset_minutes=&amp;up_daylight=0&amp;up_color=red&amp;synd=open&amp;w=320&amp;h=130&amp;title=__UP_title__&amp;lang=en&amp;country=ALL&amp;border=%23ffffff%7C3px%2C1px+solid+%23999999&amp;output=js">
</script>
Cũng có thể là
Code:
<script> 
//Config varable
var config_1 = 0;
var config_2 = 0;
var config_3 = 0;
var config_4 = 0;
</script>
<script type="text/javascript" src="http://externalfileshere...."></script>
Em nhận được respond text từ ajax rồi, nhưng mà em innerHTML vào khu vực đó nó không chạy.

[=========> Bổ sung bài viết <=========]

Vd thế này, em làm như thế này :
Code:
$(document).ready(function(){
     setTimeout(function(){
          $.ajax({
	       url: "load.php",
               // data nhận về sẽ là : http://www.vndic.org/vndic.js
	       success: function (data)
	       {
	            var oScript = document.createElement("script");
		    oScript.type = 'text/javascript';
	            oScript.src = data;
		    document.getElementById("data").appendChild(oScript);
		}
	});
     }, 2000);
});
Nó thực thi thế nào mà load lại trang ấy với cái script, chẳng hiểu
huhu

[=========> Bổ sung bài viết <=========]

http://nerd.metrocat.org/2006/07/going-global Mới tìm đựoc cái này mà không biết có được không . Cảm ơn anh Sacroyant nhé

[=========> Bổ sung bài viết <=========]

Em đã có một giải pháp đơn giản hơn là thay vì phải evaluate đoạn script tag ấy, em sẽ load thông qua một iframe Đơn giản hơn rất nhiều, nó thực thi cũng khá tốt, khôgn ảnh hưởng tới trang chính
sacroyant viết 02:30 ngày 10/10/2018
Cậu mày mò giỏi thật. Lại còn chia sẻ cho anh em kinh nghiệm xử lý nữa chứ



Bàn luận mở rộng :


Going-global chèn script vào head thay vì body.

PHP Code:
        var head document.getElementsByTagName("head")***91;0***93;;
        var 
scriptObj document.createElement("script");
        
scriptObj.setAttribute("type""text/javascript");
        
scriptObj.setAttribute("src"script.src);  
        
head.appendChild(scriptObj); 
Mình thấy nhiều người cũng code như vậy, nhưng có 1 lần mình thử thì nhận được lỗi không thể thay đổi header khi đã tải trang hoàn chỉnh. Thế là từ đó luôn chèn vào body cho chắc ăn.

Cậu chạy script đó mà không gặp lỗi gì sao ?
zoejoe viết 02:18 ngày 10/10/2018
Được gửi bởi sacroyant
Cậu mày mò giỏi thật. Lại còn chia sẻ cho anh em kinh nghiệm xử lý nữa chứ



Bàn luận mở rộng :


Going-global chèn script vào head thay vì body.

PHP Code:
        var head document.getElementsByTagName("head")***91;0***93;;
        var 
scriptObj document.createElement("script");
        
scriptObj.setAttribute("type""text/javascript");
        
scriptObj.setAttribute("src"script.src);  
        
head.appendChild(scriptObj); 
Mình thấy nhiều người cũng code như vậy, nhưng có 1 lần mình thử thì nhận được lỗi không thể thay đổi header khi đã tải trang hoàn chỉnh. Thế là từ đó luôn chèn vào body cho chắc ăn.

Cậu chạy script đó mà không gặp lỗi gì sao ?
À, script ấy em chạy rất tốt, nhưng nó vướng một lỗi là khi được tải về xong, với câu lệnh documen.write() hoặc document.writeln() chạy không tốt, nó viết lại cả trang, làm như hết mọi thứ
sacroyant viết 02:17 ngày 10/10/2018
Thì write và writeln luôn mở ra một stream mới mà.

Cái script kia tớ phải xem lại. Thấy nó đơn giản vậy nhưng tớ cảm thấy có gì đó mâu thuẫn. Khi đang tải trang thì hồ sơ chưa hoàn chỉnh, sẽ sinh lỗi nếu gọi là chắc chắn. Còn khi tải xong thì phần header thì phải là "can not modifier" chứ nhỉ !
zoejoe viết 02:16 ngày 10/10/2018
Được gửi bởi sacroyant
Thì write và writeln luôn mở ra một stream mới mà.

Cái script kia tớ phải xem lại. Thấy nó đơn giản vậy nhưng tớ cảm thấy có gì đó mâu thuẫn. Khi đang tải trang thì hồ sơ chưa hoàn chỉnh, sẽ sinh lỗi nếu gọi là chắc chắn. Còn khi tải xong thì phần header thì phải là "can not modifier" chứ nhỉ !
Hì, cái đó hình như chỉ đúng với việc innerHTML thui, còn việc mình dùng các thao tác của DOM để tao 1 element và append vào hồ sơ thì được xem như hợp lý và không sai. Em test thấy nó thực thi các lệnh liên kết ngoài, không báo lỗi gì cả
trinhdiep viết 02:20 ngày 10/10/2018
minh nghĩ là việc bác nào đó nối lỗi có thể là bác sử dụng attributes(name,value) thay vì sử dụng setAttribute(name,value)
theo mình thì Ajax đâu cần tính chuyện cho vào head hay vào body nhỉ.???
zoejoe viết 02:23 ngày 10/10/2018
Được gửi bởi lkn2
Tham khảo cái jQuery, nó có hàm load từ ngoài và execute, có sự kiện đã load xong và đã fix cho các trình duyệt.
Em đã thử rồi, nhưng nếu là một đoạn html gồm thẻ script với các thao tác lệnh vào 1 thẻ script với đường dẫn ngoài src thì nó không dùng được. Dù seo thì em cũng tìm ra giải pháp rùi hihi thanks all
Bài liên quan
0