jquery load()剥离脚本标签 - 解决方法?

Sco*_*ark 8 tags jquery load

有没有人知道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站点上找到它:

http://api.jquery.com/load/

只有在使用特定后缀选择器调用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)

  • 到目前为止我看到的最完整答案. (3认同)
  • 现在应该将其标记为正确答案. (2认同)

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)

干杯,亚历克斯


T.J*_*der 3

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。