在Safari中的提示符()之前,如何在JavaScript中显示文本节点?

在Safari中的提示符()之前,如何在JavaScript中显示文本节点?,javascript,text,safari,cross-browser,Javascript,Text,Safari,Cross Browser,我正在开发的基于JavaScript的游戏的代码使用appendChild()向内容区域添加文本元素,向玩家显示信息。然后,它会弹出一个prompt()对话框,请求播放器提供更多信息 最简单的形式如下: var content = document.getElementById("content"); var tval = document.createElement("nstring"); tval.innerHTML = "Example text"; content.appendChild

我正在开发的基于JavaScript的游戏的代码使用appendChild()向内容区域添加文本元素,向玩家显示信息。然后,它会弹出一个prompt()对话框,请求播放器提供更多信息

最简单的形式如下:

var content = document.getElementById("content");
var tval = document.createElement("nstring");
tval.innerHTML = "Example text";
content.appendChild(tval);
prompt("Do you see the example text?","");
当在IE8+、Chrome和Firefox下运行时,它的工作原理与预期一样。显示信息文本,然后显示提示对话框

但在Safari下,添加到内容区域的文本元素只有在播放器在提示对话框中单击“确定”或“取消”后才会显示。(一个区别是:在桌面Safari中,文本在按下提示后显示;在mobile Safari中,显示提示,但在整个游戏结束之前,屏幕上的文本永远不会显示。)这使得在桌面或iPhone/iPad Safari浏览器中都无法玩游戏

我创建了一个JSFIDLE来演示这一点:。加载小提琴,在初始提示中单击“确定”或“取消”,然后按小提琴结果窗格中的“清除屏幕”按钮

当您使用IE、Chrome和Firefox运行fiddle时,在显示提示符()对话框之前,结果窗格中会正确显示所有“之前”文本行。只有在单击“确定”或“取消”以关闭提示对话框后,“之后”文本行才会显示

但是,在Safari中运行小提琴,在按下提示对话框之前,不会显示任何文本行——“before”或“after”,然后它们都会显示出来

我的工作原理是,Safari与IE、Chrome和Firefox不同,它将屏幕写入推迟到完成所有I/O后的一段时间。然而,到目前为止,在So或其他地方进行的搜索都没有发现任何类似的问题或答案


我希望有人能给我指出一个合适的修改,告诉Safari(台式机和移动设备)立即显示文本元素。

你可以在短时间
setTimeout()
(允许Safari重新绘制屏幕)后显示提示,或者以非模式方式显示提示。@jfriend00,我查看了setTimeout(),但它似乎与使用prompt()不兼容。我需要在显示某些文本之后,但在其余处理之前显示提示(以获取用户输入)。将prompt()放在setTimeout()函数中意味着我必须找到其他方法暂停输出,直到播放机输入请求的信息。。。但这正是prompt()应该为我做的。我真的希望有一个标志或选项可以告诉Safari立即处理文本,但也欢迎其他建设性的建议。您可以在短时间
setTimeout()
后使用
prompt()
,这样可以显示文本。您只需将代码分成两部分,一部分在
setTimeout()
之前调用,另一部分在之后调用,显示
提示符()
,然后执行其余操作。这是一个小小的代码重组,但完全可行。演示:谢谢你的小提琴示例。我在我的简化提琴示例中尝试了它(值为50毫秒),它确实适用于桌面和移动Safari。不幸的是,将其应用于我现有的代码将意味着大量的重构——这个项目是我上一次编辑于1985年的PL/I游戏的JavaScript转换,它依赖于一个prompt()函数,该函数暂停用户输入而不消耗所有CPU(就像一个简单的while()循环所做的那样)。令人沮丧的是,我目前的解决方案适用于除苹果以外的所有浏览器。