我正在使用 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);
});
最终更新
我最终追踪到了它的源头,并从那里覆盖了它..以下是coffescript,但你可以明白这个想法。我选择覆盖它,因为就我的使用而言,这种情况永远不会发生在顶部窗口中,但应该出现在 iframe 内容中。
$.globalEval = (data) -> (iframeWindow.execScript || (data) -> iframeWindow["eval"].call(iframeWindow, data))(data) if (data && /\S/.test(data))
请您参考如下方法:
这个问题展示了如何对脚本进行自定义评估:
jQuery: Evaluate script in ajax response
在下面的代码中... **此代码来自另一个问题的答案**只是将其作为片段获取:
$("body").append($(xml).find("html-to-insert").eq(0));
eval($(xml).find("script").text());
eval 本身绑定(bind)到一个窗口,您可以将其定义为上下文:
windowObject.eval - 当仅调用 eval('...') 时,它假设您像这样调用:window.eval('...')
现在您需要获取与要在其中执行 eval 的帧相对应的窗口,并执行如下操作:
myIFrameWindow.eval('...')
当您执行此操作时,它将在该窗口的上下文中执行。只需找到与您现在想要的 iframe 关联的窗口即可。
要查找给定框架的窗口,请查看这篇文章:
Getting IFRAME Window (And Then Document) References With contentWindow
