4

我正在尝试编写一段将网页与外部系统集成的javascript。目前,我所拥有的是将脚本元素动态插入页面的非常少量的代码。

$(document).ready(function() {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = "http://example.com/example.php?arg1=1&arg2=2";
    document.body.appendChild(script);
});

外部系统返回的 JS 是一个大的单行 document.write 调用,它将表格写入页面。

document.write('<table><tr><td>blah</td></tr></table>');

当我将此脚本元素注入页面时,我可以使用 DOM 检查器看到它,但脚本似乎没有执行。如果我手动将脚本元素放入 HTML,则 javascript 执行得很好(所以它不是同源策略或格式错误的 html 错误......),但我希望它是动态的。

任何想法为什么javascript没有执行?

4

6 回答 6

2

在 DOM 准备好后使用document.write会将页面的内容替换为您正在编写的任何内容。

如果您想在页面中插入任何内容,我建议使用其中一种实际的 DOM 操作方法。

至于脚本没有执行,你确定它被正确连接了吗?您是否尝试在包含的脚本上设置一个 javascript 断点来验证是否是这种情况?

于 2012-08-22T12:25:07.100 回答
1

因为你只是包含它,而不是执行。当您使用 jQuery 时,请查看该$.getScript()函数。

http://api.jquery.com/jQuery.getScript/

它将满足您的需求。这个函数是一个 Ajax 函数,所以要小心,因为它的行为是异步的。使用它的回调来执行基于加载脚本的代码。

编辑: Felix 纠正了我关于脚本执行的问题,但我仍然认为你可以试试这个函数。

于 2012-08-22T12:24:09.480 回答
1

尝试使用此代码(它与 google 用于分析或 facebook 的用途相同)。

将其放在页面底部;)

<script type="text/javascript">
    (function() {
        var script = document.createElement('script'); 
            script.type = 'text/javascript'; 
            script.async = true;
        script.src = '/example.php?arg1=1&arg2=2';
        var s = document.getElementsByTagName('script')[0]; 
            s.parentNode.insertBefore(script, s);
    })();
</script>

或者正如davidbuzatto建议的那样,你必须使用 $.getScript() 这是一个简写的 $.ajax() 函数。

$(document).ready(function() {
    $.getScript("/example.php?arg1=1&arg2=2", function(data, textStatus, jqxhr) {
        console.log(data); //data returned
        console.log(textStatus); //success
        console.log(jqxhr.status); //200
        console.log('Load was performed.');
   });
});

编辑: 看到您可能有跨域限制,只需尝试使用相对 url "/example.php?arg1=1&arg2=2" 而不是包含的完整 url。或者,如果不是同一个 Web 服务器,请使用 cross-domain.xml 文件。

于 2012-08-22T12:53:25.777 回答
0

我认为您需要使用 JSONP 来实现这一点并使用回调函数将其附加到 body 标记

$(document).ready(function() {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://example.com/example.php?arg1=1&arg2=2&callback=showit(data)";
document.body.appendChild(script);
});

 function showit(data){document.write(data);}
于 2012-08-22T12:30:10.163 回答
0

我总是看到这样做更像:

document.write('<scr' + 'ipt>---scripthere---' + '</scr' + 'ipt>');

我假设它是出于类似的原因。试试这个,而不是创建一个“真实的”脚本元素。

于 2012-08-22T12:45:52.060 回答
0

为什么不将 JS 粘贴在一个单独的窗口/iframe 中,它会在其中正确执行和显示表格,然后使用 AJAX 将该表格拉到该页面?

JQuery AJAX 是最容易使用的 IMO:

http://api.jquery.com/jQuery.ajax/

于 2012-08-22T12:41:24.877 回答