{{JS}}URL中的Javascript

将Javascript代码包含到客户端的一种方式是在一个URL后面跟上一个javascript:伪协议限定符。这种指定的协议类型说明了URL的内容是Javascript解释器将要运行的Javascript代码的一个任意的字符串。它被当作单独的一行代码对待,这意味着这条语句必须用分号隔开,并且只能使用/* */注释。

当浏览器载入一个Javascript URL时,它会执行URL中所包含的Javascript代码,并且使用最后一个Javascript语句或表达式的值,转换为一个字符串,作为新载入的文档的内容显示。这个字符串值可能包含HTML标记,并且像载入到浏览器中的其它文档那样格式化显示。

Javascript URL也可以包含执行操作但不返回值的Javascript语句,如
javascript:alert("hello world");
此时当载入这种类型的URL的时候,浏览器执行Javascript代码,但由于没有值作为新的文档来显示,所以它不会改变当前显示的文档。

通常,我们希望使用一个Javascript URL来执行某些Javascript代码而不改变当前显示的文档。要做到这点,只需保证URL中最后一条语句没有返加值即可。确保这一点的方式是,使用void运算符来显示指定一个未定义的值。只需要在Javascript URL的结尾使用void(0);或者在javascript:void(/* code */);即可。

在任何可以使用常规URL的地方都可以使用Javascript URL。使用这一语法的一种方便的方法是,直接在浏览器的地址栏里输入它,在这里可以直接测试任意的Javascript代码而不需要打开编辑器并创建一个包含代码的HTML文件。

javascript:伪协议可以和HTML属性一起使用,该属性的值也应该是一个URL。一个超链接的href属性就满足这种条件。当用户点击一个这样的链接,指定的Javascript代码就会执行。在这种情况下,Javascript URL本质上是一个onclick事件句柄的替代。(不提倡这种用法)一个Javascript URL可以用作一个<form>标记的action属性,这样当用户提交这个表单时,URL中的Javascript代码就会执行。

Javascript URL的一个重要应用场景是书签(Bookmarklets)。如Sogou云输入法使用Bookmarklets在当前页面中载入云输入法。其代码如下:
javascript:void((function(){var n=navigator.userAgent.toLowerCase();ie=n.indexOf('msie')!=-1?1:0;if(document.documentMode)ie=0;charset='';if(ie)charset=document.charset;src=ie&&charset=='utf-8'?'http://web.pinyin.sogou.com/web_ime/init2_utf8.php':'http://web.pinyin.sogou.com/web_ime/init2.php';element=document.createElement('script');element.setAttribute('src',src);document.body.appendChild(element);})())

{{JS}}URL中的Javascript