这似乎只是与Safari相关的问题。我在Mac上尝试了4次,在Windows上尝试了3次,但我仍然没有运气。
我正在尝试加载外部HTML文件并使嵌入的JavaScript执行。
我正在尝试使用的代码是:
$("#myBtn").click(function() {
$("#myDiv").load("trackingCode.html");
});
trackingCode.html
看起来像这样(现在很简单,但如果我开始工作,会扩展一次):
<html>
<head>
<title>Tracking HTML File</title>
<script language="javascript" type="text/javascript">
alert("outside the jQuery ready");
$(function() {
alert("inside the jQuery ready");
});
</script>
</head>
<body>
</body>
</html>
我在IE(6&amp; 7)和Firefox(2&amp; 3)中看到了两条警报消息。但是,我无法在Safari中看到这些消息(我需要关注的最后一个浏览器 - 项目要求 - 请不要进行火焰战争。)
有关Safari为什么忽略trackingCode.html
文件中的JavaScript的想法?
最终我希望能够将JavaScript对象传递给此trackingCode.html
文件,以便在jQuery ready调用中使用,但我想确保在我失败之前在所有浏览器中都可以使用那条路。
答案 0 :(得分:55)
您正在将整个HTML页面加载到div中,包括html,head和body标记。如果您执行加载并在加载的HTML中只有开始脚本,关闭脚本和JavaScript代码会发生什么?
这是驱动程序页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jQuery Load of Script</title>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("jquery", "1.3.2");
</script>
<script type="text/javascript">
$(document).ready(function(){
$("#myButton").click(function() {
$("#myDiv").load("trackingCode.html");
});
});
</script>
</head>
<body>
<button id="myButton">Click Me</button>
<div id="myDiv"></div>
</body>
</html>
以下是trackingCode.html的内容:
<script type="text/javascript">
alert("Outside the jQuery ready");
$(function() {
alert("Inside the jQuery ready");
});
</script>
这适用于Safari 4。
更新:添加了DOCTYPE和html命名空间以匹配我的测试环境中的代码。使用Firefox 3.6.13进行测试,示例代码可以正常工作。
答案 1 :(得分:38)
$("#images").load(location.href+" #images",function(){
$.getScript("js/productHelper.js");
});
答案 2 :(得分:23)
之前的John Pick's solution的另一个版本,这对我来说很好用:
jQuery.ajax({
....
success: function(data, textStatus, jqXHR) {
jQuery(selecteur).html(jqXHR.responseText);
var reponse = jQuery(jqXHR.responseText);
var reponseScript = reponse.filter("script");
jQuery.each(reponseScript, function(idx, val) { eval(val.text); } );
}
...
});
答案 3 :(得分:13)
我意识到这是一篇较旧的帖子,但是对于那些来到此页面寻找类似解决方案的人来说......
http://api.jquery.com/jQuery.getScript/
jQuery.getScript( url, [ success(data, textStatus) ] )
url
- 包含请求发送到的网址的字符串。
success(data, textStatus)
- 请求成功时执行的回调函数。
$.getScript('ajax/test.js', function() { alert('Load was performed.'); });
答案 4 :(得分:9)
如果您将HTML字段加载到动态创建的元素中,这似乎不起作用。
$('body').append('<div id="loader"></div>');
$('#loader').load('htmlwithscript.htm');
我看看firebug DOM,根本没有脚本节点,只有HTML和我的CSS节点。
有人遇到过这个吗?
答案 5 :(得分:2)
在trackingCode.html中测试:
<script type="text/javascript">
$(function() {
show_alert();
function show_alert() {
alert("Inside the jQuery ready");
}
});
</script>
答案 6 :(得分:2)
我尝试为html加载函数制作一个jquery插件。请参阅以下链接。
http://webtech-training.blogspot.in/2010/10/dyamic-html-loader.html
请建议我进一步改进。
谢谢, 莫汉
答案 7 :(得分:2)
你几乎得到了它。告诉jquery你只想加载脚本:
$("#myBtn").click(function() {
$("#myDiv").load("trackingCode.html script");
});
答案 8 :(得分:0)
嗯我有同样的问题,似乎只发生在Firefox上,除了.load()之外我无法使用另一个JQuery命令,因为我在exisitng PHP文件上修改了前端...
无论如何,在使用.load()命令后,我将JQuery脚本嵌入到已加载的外部HTML中,并且它似乎有效。我不明白为什么我在主文档顶部加载的JS不能用于新内容...
答案 9 :(得分:0)
我可以通过将$(document).ready()
更改为window.onLoad()
来解决此问题。
答案 10 :(得分:0)
我遇到了脚本只能加载一次但重复调用无法运行脚本的情况。
使用.html()显示等待指示符,然后在其后链接.load()成为问题。
// Processes scripts as expected once per page load, but not for repeat calls
$("#id").html("<img src=wait.gif>").load("page.html");
当我分别调用它们时,我的内联脚本每次都按预期加载。
// Without chaining html and load together, scripts are processed as expected every time
$("#id").html("<img src=wait.gif>");
$("#id").load("page.html");
为进一步研究,请注意,有.load()的两个版本
简单的.load()调用(URL后没有选择器)只是使用dataType:“ html”调用$ .ajax()并获取返回内容并调用.html()放置这些内容的简写在DOM中。并且dataType:“ html”的文档明确指出“插入到DOM中时,将评估包含的脚本标签”。 http://api.jquery.com/jquery.ajax/因此.load()正式运行内联脚本。
复杂的.load()调用具有选择器,例如load(“ page.html #content”)。如此使用时,jQuery会有目的地过滤掉脚本标记,如在这篇文章中所讨论的:https://forum.jquery.com/topic/the-load-function-and-script-blocks#14737000000752785在这种情况下,脚本永远不会运行,甚至不会运行。
答案 11 :(得分:0)
关注@efreed答案...
我使用.load('mypage.html #theSelectorIwanted')
通过选择器从页面调用内容,但这意味着它不执行内部的内联脚本。
相反,我可以更改标记,以便'#theSelectorIwanted'
成为自己的文件,并且我使用了
load('theSelectorIwanted.html`, function() {});
,它运行内联脚本就好了。
并不是每个人都有这个选择,但这是一种快速的解决方法,可以到达我想要的位置!
答案 12 :(得分:0)
如果要同时加载HTML和脚本,这是一种同时使用[A-Za-z0-9_@]
和$(selector).load()
的自动化方式。此特定示例从jQuery.getScript()
加载ID为“ toLoad”的元素的HTML内容,将HTML插入ID为“ content”的元素,然后加载并运行ID为“ toLoad”的元素中的所有脚本
content.html
此代码在要加载的内容中找到所有脚本元素,并循环遍历每个元素。如果元素具有$("#content").load("content.html #toLoad", function(data) {
var scripts = $(data).find("script");
if (scripts.length) {
$(scripts).each(function() {
if ($(this).attr("src")) {
$.getScript($(this).attr("src"));
}
else {
eval($(this).html());
}
});
}
});
属性,这意味着它是来自外部文件的脚本,则我们使用src
方法来获取和运行脚本。如果该元素没有jQuery.getScript
属性,这意味着它是一个内联脚本,我们只需使用src
来运行代码。如果找不到脚本元素,它将仅将HTML插入目标元素,而不尝试加载任何脚本。
我已经在Chrome中测试了此方法,并且可以正常工作。请记住在使用eval
时要小心,因为它可能运行潜在的不安全脚本,通常被认为是有害的。为了避免必须使用eval
,您可能希望避免使用内联脚本。