2009-11-20 102 views
1

我不知道如何弹出窗口的DOM树和它们从opener窗口的操作工作。什么是正确的方式来实现我想要做的事情(如下所述)?如何用AJAX请求替换弹出窗口的内容?

我有一个正常的浏览器窗口,其中JavaScript函数收集所选元素并从中创建POST数据字符串。 然后我打开一个带有占位符内容的弹出窗口,将一个函数绑定到执行AJAX请求的window.ready,然后尝试用AJAX结果替换弹出窗口中的HTML。

在代码中,这是在JavaScript中运行的开启器窗口:


function showMessages(queryParams, width, height) { 
    var mailWindow = window.open('html/blankwithdoctype.html', 'foo', 'resizable=yes,scrollbars=yes,height='+height+',width='+width); 
    var params = queryParams.substring(1); 
    $(mailWindow.document).ready(function() { 
     doPostRequest(params, mailWindow); 
    }); 
    return mailWindow; 
} 

function doPostRequest(queryParams, mailWindow) { 
    function callback(data, textStatus) { 
     var mv = mailWindow; 
     $(mv.document).find("html").html(data); 
    }; 
    $.post('MailFile.do', queryParams, callback); 
} 

$(mv.document).find("html").html(data);与Chrome开发者工具或Firefox +萤火打破,我注意到,暂时结果显示,但JQuery的调用栈展开($.post('MailFile.do', queryParams, callback);后)后,再一次显示的原始空白页。

如果没有调试器,我注意到结果页面的渲染至少已经启动,但它很快被原始占位符页面替换。

有趣的是肯定会在这里。

回答

0

我怀疑jQuery库没有加载到弹出窗口中。然后,当执行弹出窗口中就绪事件之后的代码时,$函数是未知的,导致错误。我可能是错的,我从来没有在一个交叉窗口的方式使用ready()(总是在document,而不是window)

编辑:你也可以做(而不包括jQuery的,在打开的窗口)什么是替代每个$在打开的窗口中与window.opener.$。但这是相当丑陋的,现在,不是吗?;-)

+0

不加载jQuery库不是问题的根源。我原来的问题没有解释,所有这些操作都是在opener窗口中完成的,因此在打开的窗口中缺少JQuery应该不成问题。 – Eonwe 2009-11-20 10:00:12

+0

我意识到这一点。但是,如果我没有弄错,传递给打开窗口的'ready()'的匿名函数会在打开的窗口的全局上下文中执行。这就是为什么我认为可能存在可视性问题。你真的尝试过了吗?可能是因为关闭,'$'可见,但是,我不太确定。 – 2009-11-20 11:21:29

0

我实际上正在寻找一种方法来解决这个问题我自己。我猜测浏览器出于安全原因阻止访问修改子窗口的DOM。 (我希望它给了某种错误,但我从来没有得到一个)

在任何情况下,我不需要一个已经存在的页面打开,我的应用程序确实需要一个单独的弹出,但适应多个屏幕。

window.open(null, null, "...options...")打开弹出窗口后,我简单地调用了document.write("...FULL HTML FOR POPUP..."),并基本上从头开始构建了整个弹出窗口。从那时起,我可以访问任何我想从父窗口执行的DOM操作。

这里就是我谈论的例子:

// using null for the URL (defaults to about:blank in some browsers) 
// using null for the Window Name (allowed me to have multiple popups) 
var popup = window.open(null, null, "width=600,height=600"); 

// overwrite the entire document with our own HTML 
popup.document.write('<!DOCTYPE html><html><head></head><body></body></html>'); 

// Using jQuery for DOM manipulation here 
var $popup = $("body", popup.document); 

我才真正在Chrome和Firefox测试这一点,很遗憾。而且,即使设置标签也不会改变弹出窗口的标题。这不是一个完美的解决方案,但它适用于我的情况。