2013-03-24 72 views
2

所以我在這裏有點困惑。我不明白爲什麼腳本在與jQuery的.html()放置時執行,但不與innerHTML。我查看了jQuery的.html的源代碼,它似乎仍在使用innerHTML。誰能解釋這種行爲?爲什麼腳本會使用jquery的html運行,但不能使用innerHTML?

我在ajax響應中遇到了這個問題。我回來的HTML和一個script標籤與一些JavaScript的,我通常使用html,但由於某種原因使用innerHTML這一次認爲沒有什麼區別。

據我所知,這可能似乎是本地化的,所以我做了一個jsFiddle,其行爲與ajax響應類似,以突出問題。

jsFiddle demonstrating the behavior

+1

HTML標準明確提到'script'元素在通過'innerHTML'設置時沒有被評估(http://www.w3.org/TR/2008/WD-html5-20080610/dom.html#dynamic0): *「注意:使用'innerHTML'插入的腳本元素在插入時不會執行。」* – 2013-03-25 00:01:10

+0

@FelixKling - 感謝您的鏈接。不知道爲什麼我不這樣想。 – 2013-03-25 00:07:38

回答

3

據我可以從一個位breakpointin的,jQuery將嘗試使用innerHTML,但是,做不到這一點,它會回落到排空目標元素,告訴我們,通過DOM追加新內容。

更新:請參閱下面的Felix Kling的評論;基本上,如果字符串的內容中插入包含腳本或樣式/鏈接標籤,jQuery將不會直接出現這種情況時使用innerHTML

- 它在你的情況不 - 的內容經過了一個名爲domManip功能,我不要求完全理解,但它確實專門查找和評估腳本。

所以簡短的回答是:jQuery的畢竟不使用innerHTML。希望我能夠更好地一步一步地瞭解發生了什麼,但我不知道我的方式是否足夠好。我只是設置了一個斷點(在jQuery-1.9.1.js中的第6074行; jQuery決定使用innerHTML而不是而不是)並繞過源碼一點。

+0

+1 - 良好的分析。我注意到它也經歷了一個有趣的過程,但不能在我的生活中找到在源代碼中使用「eval」的地方。這個答案:http://stackoverflow.com/a/1197585/1026459,似乎表明''eval'也在腳本中使用。 – 2013-03-25 00:01:00

+1

@TravisJ是的,腳本內容被傳遞到'globalEval()'(見行597),確實使用'eval' – Flambino 2013-03-25 00:02:40

+1

測試發生在https://github.com/jquery/jquery/blob/1.9.1 /src/manipulation.js#L230。 '!rnoInnerhtml.test(value)'計算爲'false'。在文件開頭,它被定義爲'rnoInnerhtml =/<(?:script | style | link)/ i',即它測試'script'標籤。然後用'.append'來代替,這就是你所解釋的(我沒有更深入的研究它)。 – 2013-03-25 00:03:06

相關問題