【问题标题】:Javascript not executed in Ajax responseTextJavascript 未在 Ajax responseText 中执行
【发布时间】:2017-04-05 23:02:42
【问题描述】:

以下不是我的实际项目,而是一个和我的项目有同样问题的例子。

这是主要的 HTML 页面 sn-p:

<div id="divExample">Before</div>
<script type="text/javascript">
    loadExample();
</script>

这是 javascript 文件 sn-p:

xmlhttp.onreadystatechange=function()
{
    if(xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        document.getElementById('divExample').innerHTML=xmlhttp.responseText;
    }
}
xmlhttp.open("GET","mypanel.html",true);
xmlhttp.setRequestHeader("If-Modified-Since", "Sun, 31 Dec 1899 23:59:59 GMT");
xmlhttp.send();

这是获取的 mypanel.html:

After
<script type="text/javascript">
    alert("Fetched script is working.");
</script>

当我加载主 HTML 页面时,AJAX javascript 运行良好。它获取 mypanel.html 并将其内容放入 divExample.innerHTML。 “After”一词正确显示,而不是“Before”。

但是,带有警报的脚本永远不会执行。我不想将警报脚本与 mypanel.html 分开。有什么想法可以在 AJAX 加载后执行吗?

我读过here 说这是可以做到的。

我读过here 说这是不可能的。

有什么想法可以实现吗?

【问题讨论】:

  • 您是否有理由将警报与响应一起存储?您最好将其放在响应处理程序中的行之后。响应实际上并未按照您对其进行编码的方式进行评估/执行。如果你运行 eval();在它将运行的响应上(没有脚本标签,您可能需要在响应中包含类似这样的内容:var reponseHtml = 'After'; 并在您的 innerHtml 代码中使用它)。祝你好运。
  • 好吧,真正的代码不是警报。这只是我的实际项目遇到的问题的一个例子。实际代码进行各种操作,我希望它与 HTML 保持一致。但是您对其进行评估的想法值得一试。也许我可以从响应中解析脚本,然后对其进行评估。这是一个有趣的方法。我会检查一下。谢谢!

标签: javascript ajax


【解决方案1】:

您可能需要注意防止运行任意代码,但类似的方法可能会起作用:

...
if(xmlhttp.readyState==4 && xmlhttp.status==200)
{
    var myDiv = document.getElementById('divExample');
    myDiv.innerHTML = xmlhttp.responseText;

    var myScripts = myDiv.getElementsByTagName("script");
    if (myScripts.length > 0) {
        eval(myScripts[0].innerHTML);
    }
}
...

【讨论】:

  • 这是一个很好的例子,chprpipr。你和 EvoD 的想法是一样的。我去看看。
  • 好吧,我试过了,似乎即使更新了divExample的innerHtml以包含mypanel.html的全部内容,但内容的脚本部分并没有将其放入文档对象中,并且因此,在上面的示例中,myScripts.length 为 0。我已验证 divExample.innerHTML 确实包含 mypanel.html 的完整内容。也许我只需要手动解析这些内容,然后评估脚本。那肯定是一种笨拙的方法,使用 DOM 会好得多,但我想不出任何其他方法来完成这项工作。有人想吗?
  • 更新:如果我使用 myScript.innerHTML 而不是 innerText,它会起作用。当我说脚本没有进入文档对象时,我错了。它们是,并且 myScripts.length 为 1,表明脚本确实存在。但是,我必须通过 innerHTML 而不是 innerText 访问脚本的内容。底线:这很好用。非常感谢!
  • 另一个更新:因为脚本的文本正在被评估,所以脚本中声明的任何函数都不会添加到全局命名空间中,除非您使用以下语法明确地将它们添加到全局命名空间中: myfunction = function(parm1,parm2) {...}
【解决方案2】:

万一还是想不通的人,

1- 检查您的xmlhttp 是否包含response 密钥。

2- 如果存在,则使用xmlhttp.response 而不是xmlhttp.responseText

** 如果 php 是您的后端服务器,则执行 print_r(javascrip_code_as_string); 然后 return;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2017-02-14
    • 2011-03-26
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多