【创作】document.write的替用方案,“Über Write”
2010-08-25 19:23 Nana's Lich 阅读(5517) 评论(11) 编辑 收藏 举报前几天我在博文中提到了在网页中使用document.write时遭遇的奇怪问题,在文末我说编写了一个替用函数,正在测试。
经过几天断断续续的调试,我已经可以底气十足地把它拿出来给大家看了。
如果你想要经过瘦身的代码,可以点击这里下载,如果你想要未经瘦身的含注释的原始文件,可以从这个页面上找到(或者直接点击这个链接,注释用的是英文,不过我英语不太好)。
(你可能会在项目网站上找到我写的其它东西,不过它们未必对你有用。我也不建议你下载我没有放在release中的源代码,因为它们大部分都是只写了一半。)
如果你不喜欢我写在文件开头的著作说明,你也可以根据WTFPL授权把它们直接删掉:)
这个函数的用法跟document.write一样,比方说:
urite("Hello!");
或者:
document.urite("LOL!");
也都可以。
如果你没法把其它脚本文件中的document.write替换掉,你也可以这样做:
document.write = urite; document.write("blah blah blah ... ");
我试过IE6、IE8、IE9平台预览4、Firefox、Google Chrome、Safari和Opera,在这些浏览器中用urite代替document.write都能按照理想的顺序呈现和执行代码。
身边没有用IE7的机器,所以只用IETester看了一下,似乎也正常。
document.write出现问题的原因在于:
作为参数传递进去的内容会被立即解释,并在浏览器中呈现出来;
在正常情况下浏览器遇到“</script>”的时候是会等待其中的内容执行完毕才开始呈现接下来的内容,而遇到引用自外部的脚本文件的时候浏览器会等待下载完毕再执行;
问题在于如果一起解释的内容中同时含有引用自外部的脚本文件和嵌入在HTML中的脚本代码,很多浏览器在解析的时候并不会在第一时间意识到外部引用脚本的存在,只有当经过一个解释步骤之后浏览器才会开始从外部加载脚本,而在这个时候其后的内容——包括内嵌的脚本代码就已经被执行了,所以执行顺序就出了问题。
Über Write的原理就是识别出每一个“</script>”,然后一点一点地把它们write到文档流中去解释,这样就不会导致一次性解析并呈现过多的内容了。
Über Write的副作用是每一个“</script>”之后都会多出来一个script元素,不过我想这应该不是什么大问题。