2014-09-12 46 views
0

我已經插入到DOM這個網站片,使用jQuery(「身體」)追加(elementBelow):jQuery的:globalEval正在呼籲腳本插入

<div>...</div> 
<script type="..."> 
    // and this is being executed through jQuery.globalEval() 
</script> 

爲什麼不處理的瀏覽器本身當它插入到DOM中時應該執行它?爲什麼jQuery執行這段代碼?

如果jQuery是執行這個,爲什麼不也當添加到DOM執行該代碼?間接法EVAL是在globalEvent方法所使用的一個:

// Evaluates a script in a global context 
globalEval: function(code) { 
    var script, 
     indirect = eval; 

    code = jQuery.trim(code); 

    if (code) { 
     // If the code includes a valid, prologue position 
     // strict mode pragma, execute code by injecting a 
     // script tag into the document. 
     if (code.indexOf("use strict") === 1) { 
      script = document.createElement("script"); 
      script.text = code; 
      document.head.appendChild(script).parentNode.removeChild(script); 
     } else { 
     // Otherwise, avoid the DOM node creation, insertion 
     // and removal by using an indirect global eval 

      // !!!!!!!!!!! ENDING UP HERE HERE!!!!!!!! 
      indirect(code); 
     } 
    } 
}, 

我只是想了解這一切是如何工作的,因爲它正在EVAL:編輯和插入DOM。

+0

我不確定我是否理解這個問題。你在問爲什麼jQuery會對腳本進行處理,即使瀏覽器將其添加到DOM中也會對其進行評估嗎? – 2014-09-12 16:20:04

+0

@FelixKling是的,有點。但是由於某些原因,儘管被添加到dom中,代碼並沒有運行兩次。 – momomo 2014-09-12 16:47:19

+1

我相信因爲https://github.com/jquery/jquery/blob/master/src/manipulation.js#L60-L75,這裏應用:https://github.com/jquery/jquery/blob/master/ SRC/manipulation.js#L504。 'type'屬性被臨時改變,以致'script'元素不被解釋。 – 2014-09-12 16:49:25

回答

1

爲什麼瀏覽器本身不能處理執行,因爲它應該插入到dom中?爲什麼jQuery執行這段代碼?

因爲當您通過innerHTML插入DOM時,瀏覽器不會執行script元素。所以,因爲這經常是人們真正想要的東西,所以jQuery爲你做了。

+1

但是當你簡單地附加一個'script' DOM元素時,瀏覽器*會執行它。所以,我認爲這個問題仍然存在,爲什麼jQuery爲你評估腳本? – 2014-09-12 17:00:25

+0

@FelixKling我同意,如果你使用body.innerHTML =「」; jQuery不會做任何魔術。無論如何。這只是感覺執行完全兼容執行腳本的方式可能較慢。這至少應該是一個禁用的選項。我正在使用這個jQuery 2.x,這應該是針對較新的瀏覽器 – momomo 2014-09-12 17:07:27

+0

只是檢查doManip功能,似乎做了很多東西 – momomo 2014-09-12 17:11:50