2010-09-10 81 views
3

我使用$.get()從遠程服務器檢索HTML代碼段並將該代碼段插入到DOM中。該片段包含幾個基本的HTML元素和一個腳本元素。所有基本元素都被插入,但腳本元素不會。

例片段:

<p>This is a paragraph</p> 
<script type="text/javascript"> 
// JavaScript that will work with the HTML in the snippet 
</script> 

我已經驗證腳本元素是在檢索到的片段通過查看Chrome的Web檢查檢索到的資源。那麼,爲什麼$.get()插入腳本元素,並有可能做我想做的事情?

編輯:

爲了澄清,我正在檢索HTML片段與$.get()並將其與$().html(data)插入到DOM。

+1

爲什麼你需要腳本元素?通常你只需要它來執行,你的情況是不同的? – 2010-09-10 15:42:54

+0

該腳本包含處理代碼片段中包含的表單元素的函數。這些函數將被綁定到諸如選擇更改值和正在提交的表單之類的東西。沒有發生這種情況。 – 2010-09-10 15:51:13

回答

1

應該插入腳本元素,就像靜態內容一樣 - 腳本不會執行。當您使用html()插入html時,它會映射到每個元素的內部屬性。歷史上,瀏覽器不會執行以這種方式插入的腳本元素(IE in certain circumstances除外)。

這也反映在HTML 5規範草案definition of innerHTML

注:腳本元素的innerHTML使用插入時,他們不執行插入。

如果要執行該腳本,你可以查找的元素和的eval()它的文本,或創建一個從文本的新腳本元素,並將其插入到DOM正常。

1

執行此操作時,腳本元素未綁定到文檔。 您需要自己插入腳本。

要做到這一點的一種方法是通過調用一個回調函數來分析您的返回html並手動插入腳本。像這樣的: `

_insertScripts: function(html) { 
     var sfrag = '<script[^>]*>([\\S\\s]*?)<\/script>'; 
     var matchAll = new RegExp(sfrag, 'img'); 
     var matchOne = new RegExp(sfrag, 'im'); 
     if(html.match(matchAll)) { 
      $.map(html.match(matchAll), function(script) { 
       eval((script.match(matchOne) || ['', ''])[1]); 
      }); 
     } 
    } 

`

我已經看到了一些解決方案,還可以使用實時()函數的jQuery,但我不知道它是如何工作的。

相關問題