3

单击按钮时,我正在打开一个新窗口,然后将此窗口中的内容附加到已打开的窗口中,我正在使用的 jquery 代码是:

    $(".printBtn").on("click", function () {
        var w = window.open("", "Purchase Report", "width=800, height=1100");
        var wi = $(window);

        $(w.document.body).append(wi.find("#datatable_example"));

        return false;
    });

问题是,确实打开了一个新窗口,但父窗口中的内容并未附加到新打开的窗口中。然后我尝试追加wi.find("#datatable_example").html(),但这也不起作用。

任何人都可以看看并告诉我我在这里做错了什么吗?

更新

从“重复问题”中尝试了以下内容,但没有奏效:

    $(".printBtn").on("click", function () {
        var w = window.open("", "Purchase Report", "width=800, height=1100");

        $(w.document).ready(function () {
            $(w.document.body).contents().append($(window).find("#datatable_example"));
        });

        return false;
    });
4

2 回答 2

1

问题是,我使用var wi = $(window)的是var wi = $(window.document). 这是工作代码:

$(".printBtn").on("click", function () {
    var w = window.open("", "Purchase Report", "width=800, height=1100");
    var wi = $(window.document);

    $(w.document.body).append(wi.find("#datatable_example"));

    return false;
});
于 2013-08-12T13:13:23.713 回答
0

您的问题的根源是同源策略不允许您观察外部域的加载事件。如果您在浏览 SO 时在开发人员控制台中尝试此操作,一切都很好:

var child = window.open( 'http://stackoverflow.com' );

child.onload = function() { 
   alert( 'Popup loaded!' ); // Fired!
};

但是,如果您尝试从其他域打开页面,则会失败:

var child = window.open( 'http://stackexchange.com' );

child.onload = function() { 
   // It's not gonna be fired unless you run it from stackexchange.com.
   alert( 'Popup loaded!' ); 
};

当您调用window.open()window.open( '' )尝试加载about:blank超出您域范围的页面时,也会发生同样的事情,这就是您的浏览器不会触发附加事件的原因(对于 也是如此child.addEventListener( 'load' ))。另请注意,协议也必须匹配。

解决方法介绍setTimeout了在单独的 JS 线程中运行回调,希望足够晚以在那时准备好 DOM:

var child = window.open();

setTimeout( function() {
    var doc = child.document,
        p = doc.createElement( 'p' );

    p.innerHTML = 'Hello world!';
    doc.body.appendChild( p );
} );

它在最新的 Chrome 中对我有用,但是在这种边缘情况下,不同的浏览器有时会做一些奇怪的事情,所以如果在你的情况下失败,你可能需要以更大的延迟、顺序检查或其他方式调整此代码。

所以继续告诉我们它是否对你有用,因为我很好奇这种解决方法是否适用于生产代码;)

于 2013-08-12T12:18:20.243 回答