iOS9下打开窗口使用document.write

Posted

技术标签:

【中文标题】iOS9下打开窗口使用document.write【英文标题】:Using document.write in an opened window under iOS9 【发布时间】:2015-11-23 16:07:43 【问题描述】:

我们最近在升级到 ios 9 后的 iPad 代码中遇到了问题。由于各种原因,我们打开一个空窗口并在文档可用时开始写入文档。这通常可以正常工作,并且我们针对不同的浏览器行为等进行了各种测试,但 iOS 中的新问题似乎有问题。

当您使用 window.open 打开一个新窗口时,返回的引用立即有一个文档,并且使用文档写入工作没有错误。您可以检查内容等。一切正常。 然后 iOS 决定用一个新文档替换该文档。由于我们首先设法成功写入,因此我们不会再次尝试写入,因此用户会看到一个空白页面。 写入新文档按预期工作,并且实际上正在向用户显示。只是随机检查文档是否已更改或检测用户代理似乎是一个 hacky 解决方案,所以问题是:

有没有更好的方法来处理这个(任何被触发的事件)文档/窗口引用上的任何差异以进行检查。或者有谁知道为什么 iOS9 会这样做?

这是一个带有 iOS 9 http://codepen.io/anon/pen/epapGL 工作/不工作代码的代码笔

    function openWindow(twice) 
        win = window.open('about:blank', '_blank', 'width=500,height=700');
        if (win.document) 
            originalDocument = win.document;
            win.document.write('<div>This should appear in the opened window.</div>');
            noticeDiv.innerhtml = 'First write successful';
        
        if (twice) 
            setTimeout(writeAgain, 0);
        
    

    function writeAgain() 
        if (win.document !== originalDocument) 
            win.document.write('<div>This is the second try. The document was replaced.</div>');
            noticeDiv.innerHTML = 'Second write successful';
        
    

编辑:这不是关于添加一般内容,而是关于 iOS 9 特定行为。

编辑 2:我现在已经为此向 Apple 打开了一个错误报告。我看看他们怎么说。

【问题讨论】:

您是否尝试过使用data URL 方案?类似data:text/html,&lt;div&gt;Hello world!&lt;/div&gt; Add content to a new open window的可能重复 我不认为这是重复的,因为问题不在于写入本身,而是在窗口打开后对文档的引用发生了变化。我将研究数据 uri,但听起来它不适用于 IE caniuse.com/#feat=datauri,而且我不想不必要地维护两个解决方案。 【参考方案1】:

我发现了类似的东西。 解决问题的方法似乎是修改这个:

win = window.open('', '_blank', 'width=500,height=700');

这意味着,省略“about:blank”,将其留空。 也适用于您在 codepen 上的代码示例。

我不知道为什么,而且我的编程技能有限。但是我在某些论坛软件上遇到了同样的问题,并设法将其查明。

干杯, 托马斯

【讨论】:

这似乎可以解决问题。奇怪的问题,我可能会将 url 更改为 iOS 的空字符串。 嗨,Vertity!看起来今天(2015 年 12 月 12 日)的新 iOS 9.2 更新解决了这个问题。我在 Codepen 上检查了您的示例,它似乎正确地打开了第一次尝试。即使没有对您的代码进行任何修改。你能确认一下吗?

以上是关于iOS9下打开窗口使用document.write的主要内容,如果未能解决你的问题,请参考以下文章

webBrowser.Document.Write() 不规则性能

document.write的用处!

document.write 向文档中写内容,包括文本脚本元素之类的,但是它在什么时候执行不会覆盖当前页面内容尼?

弹框,滚动窗口,定时器,history对象

弹框,滚动窗口,定时器,history对象

JavaScript·BOM