我甚至不确定这是否可行,但无论如何设置执行上下文除了设置“this”的值之外?
我主要指的是在另一帧的上下文中从一帧执行代码,这样当我从frame1中定义的函数访问全局对象(例如:window,document ...)时,它将在frame2环境中执行。
如果无法做到这一点,有哪些解决方法?请不要说“只是在子框架中定义函数”,我正在处理一个更大的应用程序框架,如果我不得不加载整个框架的两个实例,那么它将毫无意义且内存效率低下。
编辑:这是一些代码,应该展示我想要做的事情。运行时,它应显示一条警告,如果找到解决方案,则会在位置字符串的末尾显示“iframe.html”。
<script>
function run() {
go.call(window.iframe);
}
function go() {
alert(window.location);
}
</script>
<iframe src="iframe.html" name="iframe" onload="run()">
感谢。
答案 0 :(得分:2)
这使用了deprecated with statement和eval,但它可能是实现你想要的唯一方法。
function run() {
with (window.iframe) {
eval("(" + go.toString() + ")()");
}
}
function go() {
alert(window.location);
}
答案 1 :(得分:1)
如果您可以在别名 window
到window.iframe
的闭包中“构建”您的“集成”代码,那么您可以实现您想要的目标:
(function(window) {
// your integration code...
// the whole code you want to frame...
alert(window.location);
})(window.iframe);
但是,你必须“框架”你想要与之交互的所有代码。
此外,您可以通过传递其他“上下文”对象来公开“集成”功能,以便您从“外部”调用:
var context = {};
(function(window, context) {
// your integration code...
context.f = function() { ... };
// the whole code you want to frame...
alert(window.location);
})(window.iframe, context);
context.f();
答案 2 :(得分:0)
使用Function.apply和Function.call。
function foo(x, y, z) {
console.log(this === someFrame); // true
}
foo.call(someFrame, 1, 2, 3);
修改强> 根据您的代码示例和下面的评论,答案是否定的。脚本无法改变全局范围。
答案 3 :(得分:-1)
在两个框架中包含代码。然后,在另一帧中调用该函数。假设有一个名为doWork()
的顶级全局函数。
您在第2帧中按下按钮,并且您想在第1帧中执行某个功能(其中frame1
是表示第1帧的window
个对象)。假设它们位于同一个域中并通过same-origin tests,您只需访问frame1
并在该框架中调用doWork()
:
frame1.doWork();
这是有效的,因为所有顶级javascript全局变量和函数都是该浏览器窗口/框架的窗口对象的属性。每个窗口/框架都有自己的顶级属性集。如果您在同一个域中并且可以获得相应的窗口对象,则可以在该窗口中调用javascript。 javascript必须出现在该窗口中。您无法在另一个窗口的内容中从您的窗口执行javascript,但如果您将代码放在两个窗口中,则可以通过从右window
对象开始在任一窗口中执行它。
如何为特定帧获取正确的窗口对象取决于帧的结构。
再次假设这些帧在同一个域中并传递通常的same-origin tests,也可以在frame2中编写一个对frame1内容进行操作的javascript函数。例如,您可以在frame2中使用此代码:
frame1.document.getElementById("foo").value = "";
所以,你可以在frame2中编写一个可以在frame1上运行的函数。但是,您不能只在frame1的内容中执行frame2中的函数,而不必将其写入以了解在不同帧上的操作。
例如,您可以编写一个这样的函数,它可以使用所需的窗口进行操作:
function clearValue(id, win) {
win.document.getElementById(id).value = "";
}