2011-06-21 31 views
10

Tôi muốn thêm phần tử vào DOM hiện tại để chạy mã javascript.Thêm phần tử <script> vào DOM và chạy javascript?

Tôi đã làm điều này với YUI:

var scriptNode = Y.Node.create('<script type="text/javascript" charset="utf-8">alert("Hello world!");<\/script>'); 
var headNode = Y.one('head'); 
headNode.append(scriptNode); 

Nó thêm thành công vào DOM nhưng nó không cho tôi một cảnh báo.

Ai đó biết vấn đề là gì?

+0

Bất kỳ lý do gì khiến bạn không chạy JS trực tiếp? –

+0

Javascript trong 'scriptNode' dưới sự kiểm soát của bạn? Bọc nó trong một chức năng và gọi nó sau khi gắn nó? Chỉ tìm thấy điều này - có vẻ thích hợp và có nhiều thông tin: http://stackoverflow.com/questions/610995/jquery-cant-append-script-element/3603496#3603496 –

+0

Thẻ đóng của bạn có thêm '\', nó phải là, không chắc chắn nếu điều này ảnh hưởng đến nó – sharpper

Trả lời

35

Tôi không biết cách hoạt động của hàm YUI Node.create(), vì vậy không có nhận xét về điều đó. Nhưng một kịch bản qua trình duyệt đơn giản là:

window.onload = function() { 
    var s = document.createElement('script'); 
    s.type = 'text/javascript'; 
    var code = 'alert("hello world!");'; 
    try { 
     s.appendChild(document.createTextNode(code)); 
     document.body.appendChild(s); 
    } catch (e) { 
     s.text = code; 
     document.body.appendChild(s); 
    } 
    } 

Khối try..catch là cần thiết vì hầu hết các trình duyệt như phương pháp đầu tiên nhưng một số thì không và ném ra một lỗi. Phương pháp thứ hai bao gồm những phương pháp đó. Bạn cũng có thể chỉ cần eval mã, tương đương nhiều hoặc ít hơn và một số thư viện làm gì.

+2

Bạn không thể đặt document.body.appendChild (s) theo mệnh đề cuối cùng? –

+0

Có, đó là tốt vì lỗi được gây ra bởi phụ thêm nút văn bản vào phần tử tập lệnh. – RobG

1

Tôi tìm thấy hàm này trong nguồn JQuery, có vẻ như làm những gì bạn muốn và cảm thấy sạch hơn một chút so với các cách tiếp cận khác với tôi. Nhưng sau đó một lần nữa tôi là một người mới bắt đầu JS và có lẽ không nhìn thấy các chi tiết. Dù sao, ai đó có thể lấy một cái gì đó hữu ích ra khỏi điều này.

function DOMEval(code, doc) { 
    doc = doc || document; 

    var script = doc.createElement("script"); 

    script.text = code; 
    doc.head.appendChild(script).parentNode.removeChild(script); 
} 
+0

Cuộc gọi removeChild là gì? Điều đó sẽ không xóa tập lệnh bạn vừa thêm? Có một mẹo tôi đang thiếu? – Danger

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