2016-10-05 46 views
0

我很好奇的以下情形的影響:執行JavaScript的AJAX與jQuery

想我定義一個jQuery單擊事件,例如

$(function() 
{ 
    $('.someElement').click(function() { /*do something*/ }; 
}; 

其獲取一些隨意裝HTTP GET請求。
但是這個.someElement在請求時最初並不存在於DOM中。

現在,如果我也有一個異步AJAX調用其中插入一些片html確實有這個.someElement定義,例如

$.ajax(
{ 
    //options omitted for readability 
    success: function(responseData) 
    { 
     $('#elementToInsert').html(responseData); 
    } 
}); 

裝載和插入<div class="someElement"></div>到頁面中。
看起來,當點擊.someElement元素時,jQuery click事件中的腳本被執行。

它以某種方式錯誤地告訴我,這工作。有人會解釋我爲什麼這有效嗎?

也可以設想在下一個場景:

正如前面的例子中,我請求相同的任意HTTP GET。但是在這個請求中,點擊事件是而不是包括在內。包括雖然包括相同的ajax調用

現在在responseData的HTML看起來像這樣

<div class="someElement"></div> 
<script> 
    $(function() 
    { 
     $('.someElement').click(function() { /*do something*/ }; 
    }; 
</script> 

當我點擊.someElement,我得到了完全相同的行爲在第一個場景。這讓我更加害怕,所以有人也可以向我解釋爲什麼這會起作用?

一些注意事項:

  • 是被插入到DOM的responseData,就有點以前 jQuery庫。
  • 我不認爲它應該使用哪個服務器端框架,但在我的情況下,它將是ASP.NET MVC 5.
  • 這些方案在最新版本的以下瀏覽器中進行測試:IE, Firefox,Chrome。

總結我的問題:上述方案如何工作(例如,jQuery被執行)?

附:有趣的是,在答案this question,它解釋說,

的JavaScript插入爲DOM文本將不會執行。

雖然在我的情況下它執行。
它也指another question,它解釋了必須調用eval()才能執行javascript。
另外this article解釋了我的情況的相反,並提到使用eval()

+0

嘗試,而不是使用'click'這一點。 '('click',function(){/ * do something * /};' – pmahomme

+1

@pmahomme你甚至讀過這個問題嗎? – Adjit

回答

2

你看到的是預期的行爲。

如果您加載包含腳本標記的HTML,那麼在某些情況下將會執行這些腳本標記。
例如,如果數據類型爲htmlContent-type頭以這樣的方式設置jQuery的解析爲HTML服務器上,該documentation狀態

「HTML」:返回HTML純文本; 包含的腳本標記在插入到DOM中時被評估爲

在許多情況下,如果數據類型是沒有設置,並且沒有標題或MIME類型jQuery來推斷數據的加載,默認將最有可能是text,在沒有解析會做的類型,沒有腳本將被執行

「文本」:一個純文本字符串

即使jQuery的load()現在有這種行爲,該文檔明確指出

當使用URL不具有後綴選擇 表達主叫​​,內容被傳遞到.html()腳本是 除去之前。 這會在腳本塊被丟棄前執行腳本塊

所以,是的,jQuery將與阿賈克斯得到HTML內容執行腳本塊調用

+0

IIS Express是用在我的測試用例中(用ASP如上所述的.NET MVC 5),並且在瀏覽器的開發者標籤中檢查網絡標籤時,內容類型是「text/html」,因爲服務器在響應頭的內容類型中添加了「text/html」瀏覽器可以理解並評估javascript? – QuantumHive

+1

是的,因爲設置了正確的內容類型,即使未設置「dataType」選項,jQuery也能夠推斷數據類型,並將內容解析爲HTML並執行腳本標籤。 – adeneo