2

我需要为其父级的弹出窗口设置一些 contextData。我试试这个:

var some contextData = {};
$(function() {
    $('#clickme').click(function() {
        var w = window.open('http://jsfiddle.net');

        w.contextData = contextData            
        //w.context data is null in the popup after the page loads - seems to get overwritten/deleted
    });
});

它不起作用,所以我的下一个想法,等到内容加载

var some contextData = {};
$(function() {
    $('#clickme').click(function() {
        var w = window.open('http://jsfiddle.net');
        w.onload = function() {
            //Never Fires
            w.contextData = contextData;

        }
    });
});

看到这个小提琴。我的 onload 方法永远不会触发。

这有效:

var some contextData = {};
    $(function() {
        $('#clickme').click(function() {
            var w = window.open('http://jsfiddle.net');
            setTimeout(function(){
                if(w.someVariableSetByThePageBeingLoaded) {
                    w.contextData = contextData;
                }
                else{
                    setTimeout(arguments.callee, 1);
                }

            }, 1);
        });
    });

但有明显的优雅问题(但目前正在解决)。

我知道您可以采用另一种方式(将弹出窗口调用回打开器/父级上的方法,但这迫使我保持​​某种查找上下文的方式(并且我必须将上下文的密钥传递给弹出窗口)查询字符串)。当前的方法让我可以在闭包中捕获上下文,使我的弹出窗口成为一段更可重用的代码。

我不想做这个跨域 - 父级和弹出窗口都在同一个域中,尽管父级是一个 iframe(很难用 jsfiddle 测试)。

建议?

4

1 回答 1

1

如果您使用 iframe 执行此操作,请尝试这种方式

HTML

<button id="clickme">Click Me</button>

<iframe id="framer"></iframe>

​</p>

Javascript

$(function() {
    $('#clickme').click(function() {
        $("#framer").attr("src","http://jsfiddle.net");
        $("#framer")[0].onload = function(){
            alert('loaded');
        };
    });
});​

我更新了你的 jsfiddle http://jsfiddle.net/HNvn3/2/

编辑 由于上述完全错误,这可能会为您指明正确的方向,但需要在真实环境中尝试以查看它是否有效。

frames应该设置全局变量,如果你

window.open("http://jsfiddle.net","child_window");

frames["child_window"]可能参考另一个窗口

在 jsfiddle 中尝试时出现 javascript 访问错误 - 所以这可能是正确的轨道

编辑2

在我的本地开发盒上试用,我能够完成这项工作

var w = window.open("http://localhost");
w.window.onload = function(){
    alert("here");
};

发生alert()在父窗口中

于 2012-11-17T01:17:20.173 回答