我在S.O.上找到了其他几个问题。 (以及一般的网络)大致提出同样的问题,但答案似乎总是建议其他方法来构建代码,避免解决这个潜在问题的需要。
例如,许多人建议(并且我同意这是一个很好的建议)将代码放在jquery load方法的回调中,在调用页面而不是被调用页面上。但是我有一些可能出现在某些资源中的独特脚本,因此我不想为每次加载都这样做,也不一定知道这些脚本会是什么。
这是一个测试设置,用于演示我正在尝试做什么。 简短摘要是,当我从partial.htm
加载main.htm
时,其脚本无法启动。
main.htm中:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>main file</title>
</head>
<body>
<ul id="links">
<li><a href="somepage1.php">some page1</a></li>
<li><a href="somepage2.aspx">some page 2</a></li>
<li><a href="partial.htm">some other partial page</a></li>
</ul>
<div id="panel" style="display:none; padding:20px; background-color:#CCC;">
LOADED CONTENT WILL GO HERE
</div>
<script type="text/javascript" src="/path/to/jquery-1.3.2.min.js"> </script>
<script type="text/javascript">
$(function(){
$('#links a').click(function() {
var $panel = $('#panel');
$panel.show();
$panel.html('Please wait...');
var href = $(this).attr('href');
$('#panel').load(href + ' #content');
return false;
});
});
</script>
</body>
</html>
好的,此页面上的功能非常简单。想象一下,还有更多的链接,其中一些可能需要编写脚本,而其他链接则不需要。
这是 partial.htm :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>partial file</title>
</head>
<body>
<div id="content">
<p>Hey, I am the partial file!</p>
<script type="text/javascript">
alert('I am some JS in the partial file! But sadly I do not execute...');
</script>
</div>
<div>
I am some other content on the page that won't be included by jquery.load()...
</div>
</body>
</html>
请注意,partial.htm
中的脚本无法触发。所以,我的问题仍然是:如何解决这个问题,排除任何答案,告诉我把它放在.load()方法的回调中。 (这可能是因为我可能不知道这些部分页面可能包含或需要哪些脚本!)
谢谢!
<小时/> 更新#1:
我认为一个可接受的答案就是“你做不到”。但是,我想知道这是否确实如此。我还没有找到任何正式陈述的东西。
此外,当我之后使用firebug检查panel
区域时,根本没有脚本元素。就像它被load
解析出来一样。
<小时/> 更新#2:
当使用选择器作为href的一部分时,我已将其缩小为仅的问题。加载整个"somepage.html"
将执行脚本,但加载"somepage.html #someregion"
则不会。
$panel.load('somepage.html'); // my script fires!
$panel.load('somepage.html #someregion'); // script does not fire
我将尝试寻找为什么在jquery源中可能出现这种情况......
答案 0 :(得分:4)
好吧,这似乎是设计的。显然让IE变得快乐,我们其余的人都受苦了。这是jquery源代码中的相关代码:
// See if a selector was specified
self.html( selector ?
// Create a dummy div to hold the results
jQuery("<div/>")
// inject the contents of the document in, removing the scripts
// to avoid any 'Permission Denied' errors in IE
.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
// Locate the specified elements
.find(selector) :
// If not, just inject the full result
res.responseText );
我想知道,我是否可以修改jquery源代码以便以其他方式包含它们使IE变得快乐,而不仅仅是剥离脚本?我还没有在网上找到其他任何讨论此事的内容,我敢肯定我不是唯一一个被这个难过的人?
答案 1 :(得分:0)
我之前遇到的问题是IE没有运行不包含defer属性的注入<script>
。此讨论主题包含有关该主题的一些有用信息:innerHTML and SCRIPT tag