将执行上下文从父框架更改为子框架

时间:2011-11-15 01:25:05

标签: javascript

我甚至不确定这是否可行,但无论如何设置执行上下文除了设置“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()">

感谢。

4 个答案:

答案 0 :(得分:2)

这使用了deprecated with statement和eval,但它可能是实现你想要的唯一方法。

function run() {
    with (window.iframe) {
        eval("(" + go.toString() + ")()");
    }
}

function go() {
    alert(window.location);
}

答案 1 :(得分:1)

如果您可以在别名 windowwindow.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.applyFunction.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 = "";
}