关于我和document.write那点不得不说的事
一直用document.write()方法向浏览器中显示数据用,把它当做Alert()使用, 看来这样用有些大材小用了,下面说说它的主要用处。
document.write()方法可以用在两个方面:
1.页面载入过程中,用脚本加入新的页面内容。
2.用延时脚本创建本窗口或新窗口的内容。
该方法需要一个字符串参数,它是写到窗口或框架中的HTML内容。这些字符串参数可以是变量或值为字符串的表达式,写入的内容常常包括HTML标记语言。如下面代码,教务系统框架载入子页
1 <!--将框架放入单元格中--> 2 <span style="font-size:18px;"> 3 <td class="index-table-middle-center" valign="top" id="content-container"> 4 <div id="loading"> 5 //加载效果图标 6 <img src="images/loading.gif" alt="loading" border="0" /> 7 </div> 8 <script type="text/javascript"> 9 //调用JS的OutputIFrame函数,形成框架 10 Index.OutputIframe(); 11 </script> 12 </td> 13 </span>
1 <span style="font-size:18px;">//输出框架 2 Index.OutputIframe = function () { 3 var scrolling = $.isIE6 == true ? 'yes' : 'auto'; 4 document.write('<iframe id="content" width="100%" height="100%" class="hide" marginwidth="0" marginheight="0" frameborder="0" scrolling="' + scrolling + '" onload="$(\'#loading\').hide();$(this).show();" src=""></iframe>'); 5 }; 6 </span>
在载入页面后,浏览器输出流自动关闭。在此之后,任何一个对当前页面进行操作的document.write()方法将打开—个新的输出流,它将清除当前页面内容(包括源文档的任何变量或值)。因此,假如希望用脚本生成的HTML替换当前页面,就必须把HTML内容连接起来赋给一个变量,使用一个document.write()方法完成写操作。
关于document.write()方法还有一点要说明的是它的相关方法document.close()。脚本向窗口(不管是本窗口或其他窗口)写完内容后,必须关闭输出流。在延时脚本的最后一个document.write()方法后面,必须确保含有document.close()方法,不这样做就不能显示图像和表单。并且,任何后面调用的document.write()方法只会把内容追加到页面后,而不会清除现有内容来写入新值。
为了演示document.write()方法,我们提供了同一个应用程序的两个版本。一个向包含脚本的文档中写内容,另—个向—个单独的窗口写内容。
示例1创建一个按钮,它为文档组合新的HTML内容,包括新文档标题的HTML标记和标记的颜色属性。
示例中有一个读者所不熟悉的操作符+=,它把其右侧的字符串加到其左侧的变量中,这个变量用来存放字符串,这个操作符能很方便地把几个单独的语句组合成—个长字符串。使用组合在newContent变量中的内容document.write()语句可以把所有新内容写到文档中,完全清除示例1中的内容。
然后需要调用document.close()语句关闭输出流。当载入该文档并单击按钮时,可以注意到浏览器标题栏中的文档标题因此而改变。当回到原始文档并再次单击该按钮时,可以看到动态写入的第二个页面的载入速度甚至比重载原始文档还要快。
示例1 在当前窗口使用document.write()。
1 <html xmlns="http://www.w3.org/1999/xhtml"><title>Writing to Same Doc</title> 2 3 <script language="JavaScript"> 4 //重新写入函数 5 function RepeatWrite(){ 6 // 保存写入的内容 7 var newContent = "<html><head><title>A New Doc</title></head>" 8 newContent += "<body bgcolor='aqua'><h1>This document is brand new.</h1>" 9 newContent += "Click the Back button to see original document." 10 newContent += "</body></html>" 11 // 写入新的内容 12 document.write(newContent); 13 document.close(); 14 } 15 16 </script> 17 </head> 18 <body> 19 <form> 20 <!--单击按钮调用写入函数--> 21 <input type="button" value="Replace Content" onClick="RepeatWrite()"> 22 </form> 23 </body> 24 </html>
示例2中,情况有点复杂,因为脚本创建了一个子窗口,整个脚本生成的文档都将写入该窗口中。为了使新窗口的引用在两个函数中保持激活状态,我们将newWindow变量声明为全局变量。
页面载入时,onLoad事件处理调用makeNewWindow()函数,该函数生成一个空的子窗口。另外,我们在window.open()方法的第三个参数中加入一个属性,使子窗口的状态栏可见。
页面上的按钮调用subWrite()方法,它执行的第一个任务是检查子窗口的closed属性。假如关闭了引用窗口,该属性(只在较新的浏览器版本中存在)返回true。如果是这种情况(假如用户手动关闭窗口),该函数再次调用makeNewWindow()函数来重新打开那个窗口。
窗口打开后,新的内容作为字符串变量组合在一起。与示例1一样,一次性写入内容(虽然对单独的窗口没有必要),接下来调用close()方法。但是注意一个重要的区别:write() 和 close()方法都明显地指定了子窗口。
1 <html xmlns="http://www.w3.org/1999/xhtml"><title>Writing to Subwindow</title> 2 <script language="JavaScript"> 3 //生命一个全局变量 4 var newWindow; 5 //打开一个新的窗口 6 function makeNewWindow(){ 7 newWindow = window.open("","","status,height=200,width=300") 8 } 9 //判断新窗口是否关闭,如果关闭重新打开 10 function subWrite(){ 11 // make new window if someone has closed it 12 if(newWindow.closed){ 13 makeNewWindow() 14 } 15 // 是新窗口获得焦点 16 newWindow.focus() 17 //保存写入内容 18 var newContent = "<html><head><title>A New Doc</title></head>" 19 newContent += "<body bgcolor='coral'><h1>This document is brand new.</h1>" 20 newContent += "</body></html>" 21 // 将HTML代码写入新窗口中 22 newWindow.document.write(newContent) 23 newWindow.document.close() // close layout stream 24 } 25 </script> 26 </head> 27 28 <body onLoad="makeNewWindow()"> 29 <form> 30 <input type="button" value="Write to Subwindow" onClick="subWrite()"> 31 </form> 32 </body> 33 </html>
总结:
最近在写一个静态资源加载器, 其中有用到document.write, 在经历过一翻折腾后, 发现document.write还是有点内容的,所以决定折腾点东西记录下,同时也算是给自己积累点东西.