2016-10-05 45 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