jQuery - HTML中的脚本标记由jQuery解析而不执行

Jos*_*ose 33 javascript jquery

我有一个像这样的HTML页面:

<html>
<body>
<div id='something'>
    ...
    <script>
    var x = 'hello world';
    </script>
    ...
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在另一页上,我这样做:

$.ajax({
    url: 'example.html',
    type: 'GET',
    success: function(data) {
        $('#mydiv').html($(data).find('#something').html());
        alert(x);
    }
});
Run Code Online (Sandbox Code Playgroud)

然而,jQuery并没有在第一个文件中执行javascript,即使文档说它确实如此.我该怎么做呢?

编辑:不幸的是,在我正在处理的实际应用程序中,我无法控制"包含"页面的内容.我们在同一个域上,但我无法修改它输出的代码,因为它是我们的IT部门不会让我们修改的打包产品.

Jam*_*mes 45

正如Pointy 指出的那样(借口双关语),当你传递HTML时,jQuery会混淆SCRIPT标签$().它不会删除它们 - 它只是将它们添加到从HTML生成的DOM集合中.您可以像这样执行脚本:

$.ajax({
    url: 'example.html',
    type: 'GET',
    success: function(data) {

        var dom = $(data); 
        $('#mydiv').html(dom.find('#something').html());
        dom.filter('script').each(function(){
            $.globalEval(this.text || this.textContent || this.innerHTML || '');
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 如果jQuery公开它的`evalScript`实现会很好.然后你就可以完成`dom.filter('script').每个($.evalScript)`,它可以处理带有`src`属性的脚本,就像其他dom操作方法一样. (5认同)

gua*_*ari 31

作为@James回答的替代方法,可以$.parseHTML()通过注意添加包含脚本的布尔标志来解析HTML字符串true:

$.ajax({
    url: 'example.html',
    type: 'GET',
    success: function(data) {

        var content = $($.parseHTML(data, document, true)).find('#something');
        $('#mydiv').html(content);

    }
});
Run Code Online (Sandbox Code Playgroud)

以这种方式,可以执行嵌入在下载文本中的任何脚本.