jej*_*s0n 5 ajax iframe jquery
我正在使用jQuery发出ajax请求,并且一切正常。但是它在错误的上下文中评估脚本。
我有一个iframe(相同的域,这里没有后顾之忧),我正在尝试使脚本在iframe的上下文中进行评估,而不是发出ajax请求的位置-例如。不同的框架。
我想我可以告诉Ajax不要评估脚本,而我会自己做工作以在正确的环境中评估脚本。有什么想法或禁用自动评估的方法吗?
编辑
因此,对于最初的问题,我有些不对。加载时不会评估脚本,而是将内容放置在文档中时才评估脚本。您可以通过测试示例来了解这一点:
$('#some_element').html('<span>content</span><script>alert(window)</script>');
Run Code Online (Sandbox Code Playgroud)
现在,当从不同的框架执行此操作时,评估将在调用的范围内进行,而不是要在其中插入内容的元素。
我最终在不使用jQuery的情况下设置了内容,然后查找/避开了任何脚本标签:
element.get(0).innerHTML = data;
element.find('script').each(function() {
otherWindow.eval(this.innerText);
});
Run Code Online (Sandbox Code Playgroud)
最终更新
我最终将其跟踪到源,并从那里覆盖它。.下面是coffeescript,但是您可以理解。我选择覆盖它是因为对于我来说,它永远不会在顶部窗口中发生,但是应该在iframe内容中出现。
$.globalEval = (data) -> (iframeWindow.execScript || (data) -> iframeWindow["eval"].call(iframeWindow, data))(data) if (data && /\S/.test(data))
Run Code Online (Sandbox Code Playgroud)
这个问题展示了如何对脚本进行自定义评估:
在下面的代码中... **此代码来自另一个问题的答案**只是将其作为片段获取:
$("body").append($(xml).find("html-to-insert").eq(0));
eval($(xml).find("script").text());
Run Code Online (Sandbox Code Playgroud)
eval本身绑定到一个窗口,您可以将其定义为上下文:
windowObject.eval- 当仅调用 eval('...') 时,它假设您像这样调用:window.eval('...')
现在您需要获取与要在其中执行 eval 的帧相对应的窗口,并执行如下操作:
myIFrameWindow.eval('...')
当您执行此操作时,它将在该窗口的上下文中执行。现在只需找到与您想要的 iframe 关联的窗口即可。
要查找给定框架的窗口,请查看这篇文章:
使用 contentWindow 获取 IFRAME 窗口(然后是文档)引用
| 归档时间: |
|
| 查看次数: |
3351 次 |
| 最近记录: |