非常有趣的jQuery加载行为,错误或解决方案?

我最近试图在某些脚本中找到一个错误,我在使用jQuery加载页面时发现了这个非常有趣的行为。

文件#1:Test1.htm

$(document).ready(function(){ $('#test').load('test2.htm #content',function(){ alert('done loading!'); }) })

文件#2:Test2.htm

 
howdy $(document).ready(function(){ alert('hello #1'); }) $(document).ready(function(){ alert('hello #2'); })

现在当我运行Test1.htm时,我得到以下内容:

  • 你好#2警报
  • 来自test2.htm的你好
  • 完成加载警报

正如您所看到的,唯一的区别是脚本标记大写为hello#2警报。 显示hello#1警报的脚本永远不会被激活…

到目前为止,我已经在Firefox 3.55,IE 8.0.6001.18702和Chrome 3.0.195.33中对此进行了测试,结果相似。

在过去,我想从加载的内容中提取javascript,类似于这个SO问题 。 所以我的问题是,这是一个错误还是一个解决方案?


更新:正如下面的Jitter所述,如果Test2.htm的脚本在我加载的内容之外,则会发生同样的事情。

 
howdy from test2.htm
$(document).ready(function(){ alert('hello #1'); }) $(document).ready(function(){ alert('hello #2'); })

实际上这似乎是jQuery中的一个错误。 你应该发一个错误票。 很好找到顺便说一句。

在jQuery 1.3.2第3270-3272行中我们有

 // inject the contents of the document in, removing the scripts // to avoid any 'Permission Denied' errors in IE .append(res.responseText.replace(//g, "")) 

很明显,这个正则表达式上的不区分大小写的标志丢失了。 因此,每个标记都不是像 …… ,并且不会被jQuery删除。

所以第3272行应该是这样的

 .append(res.responseText.replace(//gi, "")) 

此外,只有在load url test2.htm #content使用选择器才会触发此错误。 如果你把它留下并使用

 $('#test').load('test2.htm',function(){....}); 

test2.htm看起来如下所示它也将触发三个警报(无论你如何编写脚本标记)。 所以这也是一个角落案例的错误。

 howdy   

通过HTML注入脚本元素非常难以可靠地跨浏览器,因此在jQuery中以各种方式被破坏 。 它可以解决已知的浏览器问题,但最终可能会使问题变得更糟。

修复了jitter的错误(+1),你会发现根本没有插入脚本,试图避免这些问题。 即使使用此修复程序,此行仍然是恶劣且易碎的代码,尝试使用正则表达式处理HTML,如果字符串/script>包含在脚本块中(这非常有效),则会失败。 会失败。 等等。

所以请帮自己一个忙,并将从您打算动态加载的HTML内容中删除。 始终将要执行的任何脚本内容与HTML分开执行。