Javascript 从.load()加载时,.getScript()不工作
您可以通过访问以下网站了解其工作方式: 即使用标准加载加载所有内容 您可以尝试在此处动态加载它:Javascript 从.load()加载时,.getScript()不工作,javascript,jquery,load,Javascript,Jquery,Load,您可以通过访问以下网站了解其工作方式: 即使用标准加载加载所有内容 您可以尝试在此处动态加载它: 然后单击“部件”链接。。。正如你所见,我没有任何警觉 我觉得这与检测何时启动getscript的能力有关,因为ondomready在动态加载时不会重新加载 以下是将加载内容的主脚本: $('#sub-navigation li a').click(function(){ var toLoad = $(this).attr('href')+' #content-container >
然后单击“部件”链接。。。正如你所见,我没有任何警觉 我觉得这与检测何时启动getscript的能力有关,因为ondomready在动态加载时不会重新加载
以下是将加载内容的主脚本:
$('#sub-navigation li a').click(function(){
var toLoad = $(this).attr('href')+' #content-container > *';
$('#content-container').hide('fast',loadContent);
var href = $(this).attr('href');
if (href == ".") {
window.location.hash = "";
} else {
window.location.hash = href;
}
// first remove the selected class from the active one
$('#sub-navigation li.selected').removeClass('selected');
// then find the parent li of the clicked element and add the selected class
$(this).parents('li').addClass('selected');
//$('#load').remove();
//$('#wrapper').append('<span id="load">LOADING...</span>');
//$('#load').fadeIn('normal');
function loadContent() {
$('#content-container').load(toLoad,'',showNewContent())
}
function showNewContent() {
$('#content-container').show('normal',hideLoader());
}
function hideLoader() {
//$('#load').fadeOut('normal');
}
return false;
});
编辑:12/18/2010-
我现在必须根据加载的“部件”页面动态加载不同的脚本。当然,我可以继续使用以前的解决方法,但我正在为此寻找更好的解决方案。我增加了一笔赏金来帮助你。
更新的解决方案:
通过使用get()模拟加载函数,我可以做我想做的事情:
这或多或少是杰森告诉我的;所以我给他赏金
更新的解决方案2:
find()命令将从1.4+开始删除所有脚本标记,因此我不得不这样做:
$.get(href, function(response){
var contents = $(response).find('#content-container > *');
$(response).filter('script[src=""]').each(function(){
contents.push(this);
});
$("#content-container").html(contents);
});
我仍然希望避免这种复杂的混乱局面,但这似乎是我必须面对的问题。下面是$.load中执行jQuery 1.4.2中插入的相关代码位(起始行4820):
//请求远程文档
jQuery.ajax({
url:url,
类型:类型,
数据类型:“html”,
数据:params,
完成:功能(恢复、状态){
//如果成功,将HTML注入到所有匹配的元素中
如果(状态==“成功”| |状态==“未修改”){
//查看是否指定了选择器
html(选择器?
//创建一个虚拟div来保存结果
jQuery(“”)
//在中插入文档内容,删除脚本
//避免IE中出现任何“权限被拒绝”错误
.append(res.responseText.replace(rscript,“”)
//找到指定的元素
.查找(选择器):
//如果没有,只需注入完整的结果
res.responseText);
}
如果(回调){
self.each(回调[res.responseText,status,res]);
}
}
});
如您所见,如果在要加载的内容中指定了选择器(您就是),jQuery将在将其插入页面之前从HTML中删除所有内联脚本块
为什么??动态创建DOM文档片段在不同浏览器之间根本不一致,并且没有真正的方法来控制脚本何时、如何执行,甚至是否执行
一个例子是:是否应该在创建片段时发生(就像jQuery在对其运行选择器之前发生的那样)?在这种情况下,运行脚本时,新内容实际上不会成为父文档的一部分
你怎么能解决这个问题?当然,您始终可以重新创建$.load()在内部执行的操作(基本上只需发出一个GET请求,从响应中创建一个jQuery对象,然后在追加/注入之前对其调用.find(selector)
)。但是,要小心。这可能是不可靠的,我不知道不同的浏览器对此会有什么反应
我记得不久前读过一篇关于这一点的长篇讨论——我现在找不到它,但当我找到它时,我会在这里添加一个链接。我可以通过使用get()模拟加载函数来实现我的目的:
这或多或少是杰森告诉我的;因此,我给了他赏金。是“在此处插入更多HTML”部分中的
#部分吗?是的。。我将包括HTML的其余部分。实际上,我仍然需要一个解决方案,显然这在1.3.2中可以很好地工作,但不是1.4+更多的研究:似乎.find()方法去除了脚本标记。
<h1>Parts</h1>
<table id=parts class=tablesorter style="width: 500px;">
<thead>
<tr>
<th>Part #</th>
<th>Part Description</th>
<th>Price</th>
<th>Additional<br>Shipping</th>
</tr>
</thead>
<tbody>
<tr>
<td>AM01</td>
<td>ECONOMY OARS (EACH)</td>
<td>$30.00</td>
<td>$3.00</td>
</tr>
<tr>
<td>AM02</td>
<td>DELUXE OARS (EACH)</td>
<td>$42.00</td>
<td>$3.00</td>
</tr>
<tr>
<td>AM03</td>
<td>OAR LOCKS (PAIR)</td>
<td>$10.00</td>
<td>$2.00</td>
</tr>
<tr>
<td>AM04</td>
<td>LAKER BOW CASTING</td>
<td>$25.00</td>
<td>$3.00</td>
</tr>
<tr>
<td>AM05</td>
<td>PRO BOW CASTING</td>
<td>$25.00</td>
<td>$3.00</td>
</tr>
<tr>
<td>AM06</td>
<td>OAR LOCK CASTING W/INSERT</td>
<td>$28.00</td>
<td>$3.00</td>
</tr>
<tr>
<td>AM07</td>
<td>REAR CORNER CASTING RIGHT</td>
<td>$25.00</td>
<td>$3.00</td>
</tr>
<tr>
<td>AM08</td>
<td>REAR CORNER CASTING LEFT</td>
<td>$25.00</td>
<td>$3.00</td>
</tr>
<tr>
<td>AM09</td>
<td>FISHERMAN BOW SET (3 PC.)</td>
<td>$25.00</td>
<td>$3.00</td>
</tr>
<tr>
<td>AM10</td>
<td>OAR LOCK INSERTS (EACH)</td>
<td>$4.00</td>
<td>$2.00</td>
</tr>
<tr>
<td>AM11</td>
<td>DRAIN PLUG (5/8 MODIFIED)</td>
<td>$5.00</td>
<td>$2.00</td>
</tr>
<tr>
<td>AC06</td>
<td>LIFT VEST TYPE III</td>
<td>$25.00</td>
<td>$2.00</td>
</tr>
<tr>
<td>AC07</td>
<td>1" DRIAN PLUG</td>
<td>$5.00</td>
<td>$2.00</td>
</tr>
<tr>
<td>AC09</td>
<td>5/8" DRAIN PLUG</td>
<td>$5.00</td>
<td>$2.00</td>
</tr>
<tr>
<td>AM11</td>
<td>TOUCH UP PAINT</td>
<td>$15.00</td>
<td>$2.00</td>
</tr>
<tr>
<td>AM69</td>
<td>CONSOLE (SUPER PRO 16)</td>
<td>$135.00</td>
<td>Please call</td>
</tr>
<tr>
<td>AM70</td>
<td>CONSOLE W/STEERING (SUPER PRO 16)</td>
<td>$430.00</td>
<td>Please call</td>
</tr>
</tbody>
</table>
function showNewContent() {
$('#content-container').show('normal',hideLoader);
if (href == "parts") {
$.getScript("/files/tablesorter/jquery.tablesorter.min.js", function() {
$("#parts").tablesorter();
});
}
}
$.get(href, function(response){
var contents = $(response).find('#content-container > *');
$("#content-container").html(contents);
});
$.get(href, function(response){
var contents = $(response).find('#content-container > *');
$(response).filter('script[src=""]').each(function(){
contents.push(this);
});
$("#content-container").html(contents);
});
// Request the remote document
jQuery.ajax({
url: url,
type: type,
dataType: "html",
data: params,
complete: function( res, status ) {
// If successful, inject the HTML into all the matched elements
if ( status === "success" || status === "notmodified" ) {
// 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(rscript, ""))
// Locate the specified elements
.find(selector) :
// If not, just inject the full result
res.responseText );
}
if ( callback ) {
self.each( callback, [res.responseText, status, res] );
}
}
});
$.get(href, function(response){
var contents = $(response).find('#content-container > *');
$("#content-container").html(contents);
});