有没有人知道jquery .load()解决从外部内容加载的脚本标签的工作?
有很多文件证明这种情况发生了,但是经过4个小时搜索网络后我找不到合适的方法吗?
我正在加载动态生成的div - 类似于搜索结果页面 - 并且需要将.click()绑定到每个动态生成的div中的元素.我有一个PHP文件,它执行html生成并返回所有html作为字符串但是我不能绑定jquery .click(),因为包含jquery函数的脚本标记被剥离.
这是通过调用php文件加载外部内容的代码...
$("#titles_wrap").load("m_scripts/m_php/titles_loader.php", function(){
$..some code
});
Run Code Online (Sandbox Code Playgroud)
这里是生成div的php文件的循环(这很好用)...
$tag1='<script type="text/javascript">';
$tag2='</script>';
while($result_array = mysql_fetch_array($result)) {
if($i2<=($titles_total)){
$_SESSION['titles_string'] .= '<li id="listItem_'.$i2.'">
<div id="titles_list_item">
<div id="titles_list_image_box" style="background-image: url(../../images/thumbs_test/'.$result_array[0].'); background-repeat: no-repeat; ">'.($i2+1).'</div>
<div id="title_php_loader"></div>
<div id="title_info_wrap">
<div id="title_current"><span class="title_current_grey" >current title: </span><br>'.$result_array[1].'
</div>
<div id="title_form_wrap">
<span class="title_current_grey" >new title: </span><br><input name="title_input_'.$i2.'" id="title_input_'.$i2.'" type="text" class="title_input"></input>
<div id="title_send" class="title_send_'.$i2.'">GO</div>
</div>
</div>
'.$tag1.'
$(".title_send_'.$i2.'").click(function(){$("#title_php_loader").load("m_scripts/m_php/title_sender.php")})
'.$tag2.'
</div>
</li>';
$i2++;
}
}
Run Code Online (Sandbox Code Playgroud)
对不起,如果第二个代码块有点"矫枉过正" - 让我知道简化的摘录是否更有用.也就是说,你可以在php代码的最后一行的第8行看到应该用动态分配的选择器写入每个div的jquery函数.
当然,可能是代码中还有其他错误,但是我不能测试它,直到我可以让.load()停止捣乱它!
如果有人找到了解决方案 - 甚至是有限恩典的解决方案 - 太棒了!
提前致谢,
干杯,
斯科特
编辑 - 编辑 - 编辑 - 编辑 - 编辑 - 编辑 - 编辑 - 编辑
@TJ Crowder @Frug
谢谢你的帮助!
我刚刚对你演示中涉及的页面进行了很好的审视,是的,我看到你已经开始工作了.看起来很惊人 - 那些脚本标签,那里有很多人无法让它工作 - 不幸的是我就是其中之一!
我在演示和代码情况之间看到的唯一区别是
1)开始脚本标签中没有类型声明,
2)你正在加载一个带有脚本标签的页面作为DOM的一部分,而我正在加载php字符串输出(我真的不认为这很重要',呃?当它击中客户端时它全部来到了同样的事,没有?)
3),你的.load调用是整个页面,而我的只返回元素.我已经改变了输出字符串以包含所有和标签,但grrrrrr ...我仍然无法得到dem该死的脚本标签显示在DOM中.
有什么建议?我不知道有什么负荷可能是什么!谢谢S.
Asp*_*ped 23
立即更新,您可以在jQuery doc站点上找到它:
只有在使用特定后缀选择器调用load时才会删除标签.
脚本执行
使用不带后缀选择器表达式的URL调用.load()时,在删除脚本之前将内容传递给.html().这将在丢弃之前执行脚本块.但是,如果使用附加到URL的选择器表达式调用.load(),则在更新DOM之前会删除脚本,因此不会执行脚本.两种情况的示例如下所示:
这里,作为文档一部分加载到#a的任何JavaScript都将成功执行.1
$('#a').load('article.html');
Run Code Online (Sandbox Code Playgroud)
但是,在下列情况下,加载到#b的文档中的脚本块将被删除而不执行:1
$('#b').load('article.html #target');
Run Code Online (Sandbox Code Playgroud)
ale*_*kop 14
这个线程现在有点老了,但我找到了一个解决方案,我想分享$.load
+选择器+ <script>
问题/功能.也许这对某人有帮助.而不是$.load
,我用这个:
$.ajax({
url: '/some/url',
success: function(html) {
var content = $('<div />').html(html).find('#my-custom-selector');
$('#container-to-place-html-in').html(content);
}
});
Run Code Online (Sandbox Code Playgroud)
干杯,亚历克斯
jQueryload
不会删除脚本标签(示例),并且从 PHP 脚本返回的内容中没有脚本标签。有一些 JavaScript,但它没有正确嵌入script
标签中,因此浏览器无法识别它。
如果你想要 JavaScript:
...
'.$tag1.'
$(".title_send_'.$i2.'").click(function(){$("#title_php_loader").load("m_scripts/m_php/title_sender.php")})
'.$tag2.'
...
Run Code Online (Sandbox Code Playgroud)
要被识别为 JavaScript,请将其放入script
标签中。
...
'.$tag1.'
<script>"$(".title_send_'.$i2.'").click(function(){$("#title_php_loader").load("m_scripts/m_php/title_sender.php")})</script>
'.$tag2.'
...
Run Code Online (Sandbox Code Playgroud)
script
...或者更好的是,在内容末尾使用单个标签来连接事物,或者在load
函数上使用回调。
更新:重新编辑:
1)开始脚本标签中没有类型声明,
没关系,请参阅这个更新的示例。浏览器script
根据其始终应用的相同规则来解释标签。
2)你正在加载一个带有脚本标签作为 DOM 一部分的页面,而我正在加载 php 字符串输出(我真的不认为这很重要,是吗?当它到达客户端时,所有内容都到达了同样的事情,不是吗?)
是的,一旦到达浏览器,一切都会发生同样的事情。
3),您的 .load 调用正在获取整个页面,而我的仅返回元素。我已经更改了输出字符串以包含所有 , 和 标签,但是 grrrrrrr...我仍然无法让该死的脚本标签显示在 DOM 中。
我的示例只是加载一个片段,而不是整个页面。
我不知道为什么你的不起作用。我想知道它是否与循环中输出的多个脚本元素有关,或者与您连接click
处理程序的事实有关,但它不是其中任何一个。
没有什么可以做的,只能拿你的非工作示例并一点一点地剥离层,直到找到当你删除它时让它开始工作的部分。从根本上讲,并不是说使用load
会使脚本不起作用(不管你发现有多少人认为是这种情况;世界很大,有很多人几乎有任何想法)。您必须放弃认为这与 jQueryload
函数对脚本执行任何操作有关的想法;可能不是。
调试这种事情的关键实际上是简化、简化、简化。确保服务器为 ajax 调用返回的 HTML 看起来像您想象的那样(没有奇怪的引号或其他东西)。尝试用静态页面来做。ETC。