是否有一种很好的方法告诉jQuery不要在HTML的ajax请求上评估脚本

问题描述

|| 我正在使用jQuery发出ajax请求,并且一切正常。但是它在错误的上下文中评估脚本。 我有一个iframe(相同的域,在这里没有后顾之忧),我正在尝试使脚本在iframe的上下文中进行评估,而不是发出ajax请求的位置-例如。一个不同的框架。 我想我可以告诉Ajax不要评估脚本,而我会自己做工作以在正确的环境中评估脚本。有什么想法或禁用自动评估的方法吗? 编辑 因此,我对最初的问题有些不解。加载时不会评估脚本,而是将内容放入文档中时才评估脚本。您可以通过测试示例来了解这一点:
$(\'#some_element\').html(\'<span>content</span><script>alert(window)</script>\');
现在,当从不同的框架执行此操作时,评估将在调用的范围内进行,而不是要在其中插入内容的元素。 我最终在不使用jQuery的情况下设置了内容,然后查找/避开了任何脚本标签:
element.get(0).innerHTML = data;
element.find(\'script\').each(function() {
  otherWindow.eval(this.innerText);
});
最终更新 我最终将其跟踪到源,并从那里覆盖它。.以下是coffeescript,但是您可以理解。我选择覆盖它是因为对于我来说,它永远不会在顶部窗口中发生,但是应该在iframe内容中出现。
    $.globalEval = (data) -> (iframeWindow.execScript || (data) -> iframeWindow[\"eval\"].call(iframeWindow,data))(data) if (data && /\\S/.test(data))
    

解决方法

        这个问题显示了如何对脚本进行自定义评估: jQuery:在ajax响应中评估脚本 在下面的代码段中……**该代码来自另一个问题的答案**只是将其作为摘要即可:
  $(\"body\").append($(xml).find(\"html-to-insert\").eq(0));
  eval($(xml).find(\"script\").text());
eval
本身绑定到一个窗口,您可以将其定义为上下文:
windowObject.eval
-当仅调用eval(\'... \')时,它假设您正在这样调用:
window.eval(\'...\')
现在,您需要获取与要在其中执行eval的帧相对应的窗口,并执行以下操作:
myIFrameWindow.eval(\'...\')
当您执行此操作时,它将在该窗口的上下文中执行。只需查找与您现在想要的iframe关联的窗口即可。 要查找给定框架的窗口,请看一下这篇文章: 使用contentWindow获取IFRAME窗口(然后获取文档)引用     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...