本文探讨JavaScript中javascript:伪协议的运行机制,说明其如何将URL主体视为JS代码执行。重点分析语句分隔、返回值显示新文档的默认行为,以及利用void运算符防止页面被覆盖的技巧,确保代码仅执行动作而不改变当前视图。
javascript:伪协议的基本机制
在客户端嵌入JavaScript代码的一种方式是将其置于伪协议说明符javascript:之后的URL中。这种特殊的协议类型表明URL的主体包含任意JavaScript代码,并由JavaScript解释器执行。若javascript:URL中包含多条语句,必须使用分号将它们分隔开。示例如下:
javascript:var now = new Date(); "<h1>The time is:</h1>" + now;
浏览器加载此类URL时,会执行其中包含的JavaScript代码,并将最后一条JavaScript语句返回的字符串值作为新文档的内容显示。该字符串值可包含HTML标记,并经过格式化,其显示效果与加载其他浏览器文档完全一致。
javascript URL还可以包含仅执行操作但不返回值的JavaScript语句。例如:
执行动作与返回值处理
javascript:alert("hello world!")
加载此类URL时,浏览器仅执行其中的JavaScript代码。由于没有返回值作为新文档显示,因此当前显示的文档不会发生改变。
通常我们需要执行不改变当前显示文档的JavaScript代码。为此,必须确保URL中的最后一条语句没有返回值。一种方法是使用void运算符显式指定返回值为undefined,只需在javascript:URL末尾使用语句void 0;即可。例如:以下URL将打开一个新的空浏览器窗口,而不改变当前窗口的内容:
使用void运算符防止页面覆盖
javascript:window.open("about:blank"); void 0;
如果该URL未使用void运算符,window.open()方法的返回值将被转换为字符串并显示出来,当前窗口将被如下所示的文档覆盖。