javascript - 如何用 AJAX 请求替换弹出窗口的内容?

标签 javascript jquery dom popup

我不知道弹出窗口的 DOM 树以及它们在打开窗口中的操作是如何工作的。实现我想要做的事情的正确方法是什么(如下所述)?

我有一个普通的浏览器窗口,其中 JavaScript 函数收集选定的元素并从中创建 POST 数据字符串。 然后,我打开一个包含占位符内容的弹出窗口,将一个函数绑定(bind)到执行 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);
}

当使用 Chrome 开发者工具或 Firefox+FireBug 在 $(mv.document).find("html").html(data); 处中断时,我注意到暂时显示了结果,但是在 JQuery 调用堆栈展开后(在 $.post('MailFile.do', queryParams, callback); 之后),原始空白页面再次显示。

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

这里肯定发生了一些有趣的事情。

最佳答案

我实际上正在寻找解决这个问题的方法。我猜测出于安全原因浏览器会阻止访问修改子窗口的 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 中真正测试过这一点。此外,即使设置标签也不会改变弹出窗口的标题。这不是一个完美的解决方案,但它适用于我的情况。

关于javascript - 如何用 AJAX 请求替换弹出窗口的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1769180/

相关文章:

javascript - 如何将 if/else 语句放入对象键中?

javascript - Javascript 循环对象时未定义

javascript - 未捕获错误 : Reference. 推送失败:

javascript - 仅替换 iframe src 的一部分

javascript - 浏览器计算器将数字附加到错误屏幕

javascript - 从函数内部声明一个全局变量

Javascript ES6 'let' 和 'var' - 参数名称与重新声明的变量匹配的函数内部出现意外行为

jQuery幻灯片跳转页面

jquery - 如何在 jquery 中分配、清除和获取隐藏字段的值?

JavaScript 按属性对所有其他子元素进行排序,但 (this)