3

好的,所以我下载了 IE10 并立即遇到了一些问题......

想象一下下面的情况。我们有一个包含 HTML 的父窗口:

<!DOCTYPE html>
<html>
    <head>
        <script>
            function doAction()
            {
                var win = window.open('child.htm', '', '');
            }
        </script>
    </head>
    <body>
        <a href="#" onclick="doAction();">Click here to open window</a>
        <div id="obj"><span>A new element should appear: </span></div>
    </body>
</html>

如果单击该链接,它将打开一个包含 HTML 的窗口:

<!DOCTYPE html>
<html>
    <head>
        <script>
        window.onload = function()
        {
            var span = document.createElement('span');
            span.innerHTML = 'it works!';
            try
            {
                window.opener.document.getElementById('obj').appendChild(span);
            }
            catch(e)
            {
                alert('Exception was thrown: ' + e);
            }
        };
        </script>
    </head>
    <body>
    </body>
</html>

我已经在很多浏览器(FF、Chrome、IE 等)中对此进行了测试。文本“它有效”出现,就像它应该的那样。除了 IE10,它会发出警报:

'Exception was thrown: HierarchyRequestError'

我的问题是,解决这个问题的最佳方法是什么?

我当然可以将孩子传递给 window.opener 中的函数,但这也不起作用。好像我只能将一个孩子添加到创建它的窗口中。正确的?

我也想知道为什么这已经改变了,很难找到关于这个异常的任何信息。

4

2 回答 2

1

到底是怎么回事?

Internet Explorer 10 似乎确实采取了额外的安全措施。至于DOMException.HIERARCHY_REQUEST_ERR错误,这与试图将对象放置在浏览器认为不属于它的某个地方有关。例如,以下代码也会引发此异常:

document.appendChild( document.createElement( "form" ) );

在这种情况下,我们不能将 a 附加formdocument,因此会出现错误。在您的特定情况下,将一个窗口中生成的对象添加到另一个窗口似乎存在问题。

DOM 异常错误代码参考将此错误描述为:

无法在请求的位置插入节点。从 Internet Explorer 10 开始,HierarchyRequestError改为返回错误代码字符串。

你如何绕过它?

您实际上已经确定了要进行的适当修改;从父窗口的上下文创建元素。为了避免冗长的代码行,您可以document在整个代码中创建对父级的引用:

var _doc = window.opener.document;

function addSpan () {
    _doc.body.appendChild( _doc.createElement("span") );
}

这可以防止代码随着window.opener.document.

于 2013-04-10T18:36:31.887 回答
0

我目前最简单的解决方案是替换:

var span = document.createElement('span');

和:

var span = window.opener.document.createElement('span');

但是,当然,这使我的答案的最后一部分仍未得到答复。

于 2013-04-09T14:59:27.283 回答