2011-06-21 96 views
10

我想添加一個元素到現有的DOM中以運行javascript代碼。將<script>元素添加到DOM並使javascript運行?

我這樣做與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); 

它成功添加到DOM,但它並沒有給我一個警告。

有人知道問題是什麼?

+0

爲什麼你不直接運行JS? –

+0

是否在'scriptNode'中的Javascript在你的控制之下?將它包裝在一個函數中並在追加後調用它?剛發現這個 - 似乎是適當的和內容豐富的:http://stackoverflow.com/questions/610995/jquery-cant-append-script-element/3603496#3603496 –

+0

您的結束標記有一個額外的'\',它應該是,不確定這是否會影響它 – sharpper

回答

35

我不知道YUI的Node.create()函數如何工作,所以沒有對此發表評論。但一個簡單的跨瀏覽器的腳本是:

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

在try..catch塊是必要的,因爲大多數瀏覽器,如第一種方法,但有些卻沒有,並拋出一個錯誤。第二種方法涵蓋那些。你也可以簡單地使用eval這個代碼,它或多或少是等價的,以及一些庫所做的。

+2

難道你不能把document.body.appendChild(s)放在finally子句下嗎? –

+0

是的,這很好,因爲錯誤是由將文本節點附加到腳本元素引起的。 – RobG

1

我在JQuery源代碼中找到了這個函數,這個函數看起來像做了你想要的,感覺比其他方法更清潔一些。但是,我又是一個JS初學者,可能沒有看到細節。無論如何,有人可能會從中得到一些有用的東西。

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

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

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

什麼是removeChild調用?這不會刪除剛剛添加的腳本嗎?有沒有我錯過的技巧? – Danger

相關問題