【挑战极限】最短的javascript: 地址栏载入脚本

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 20:41 点击:

 

 相信大家都在地址栏里用javascript:的形式执行过脚本。这种方法简单实用,测试比较短的脚本时经常用到。并且可以添加到收藏夹里,随时点击调用。

 

 

 

  不过脚本比较长的时候,需要复制密密麻麻一大段到地址栏里,显得很不美观,而且脚本修改起来也很不容易。因此一般先把脚本写在单独一个文件里,然后用javascript: 的形式动态载入脚本到页面中。不少网页插件都是用这个方法载入。

 

 

 

  平时,我们用最简单的代码实现动态载入:

 

javascript:var o=document.createElement('script');o.src='...';document.body.appendChild(o);void(0)  当然,这对于载入插件来说足够OK了。但是不久前看到一个稍有修改的方法,让我开始琢磨这段代码究竟可以压缩到多短!

 

 

 

  他的代码大致相同,只是更严谨:

 

javascript:(function(o){o.src='...';document.body.appendChild(o)})(document.createElement('script'));void(0)  虽然代码比先前的还长,但是将变量置于闭包中,避免潜在的冲突。并且将  document.createElement作为闭包的参数,巧妙的节省了一个var单词。

 

  闲来无事,于是考虑起这代码能否精简再精简。顺便复习下js里面的各种特性。

 

  

 

  当然,首先默认了几个地址栏载入脚本要遵循的规则:

 

  1. 不引入全局变量

 

  2. 兼容主流浏览器

 

  3. 载入过程不影响页面

 

  

 

  > 不影响全局变量,我们需要使用闭包来隐藏我们的私有变量;

 

  > 兼容主流浏览器,就必须使用标准的方法,兼容性判断只会增加代码长度;

 

  > 如果简单的使用innerHTML添加元素,就有可能导致存在的元素刷新;

 

  

 

  于是我们开始逐步分析。www.2cto.com

 

  显然,最先想到的就是匿名闭包的调用。

 

  通常我们都是用:  (function(){})()  的形式调用一个匿名闭包。注意红色的优先级括号是必不可缺的,否则就是一个错误的语法。

 

  但也可以使用另一种形式:+function(){}() 前面的+号可以换成-!~等等一元操作符。不过这仅仅是1字节之差。

 

 

 

  另一个显然的,就是可以把void(0)的参数替换成闭包调用的表达式。void虽然只是个关键字,但有类似函数的功能,对于任何参数都返回undefined。如果没有void,在地址栏执行了javascript:后,页面就变成了脚本表达式返回值,大家应该都见过。

 

  

 

  于是经过显而易见的观察,略微减少了3个字符。

 

javascript:void(+function(o){o.src='...';document.body.appendChild(o)}(document.createElement('script')))  

 

  不过上面都是浅层次的观察。现在我们来仔细的分析。

 

  

 

  我们为什么要使用闭包,就是为了防止我们的变量和页面里的冲突。那么可以不使用变量吗?想要不出现变量,唯一办法就是使用链式的连等操作:利用上个操作的返回值作为下个操作的参数。这段代码共有3个操作:创建脚本元素/脚本元素src赋值/添加脚本元素。仔细参考下W3C的手册,DOM.appendChild不仅可以添加元素,并且返回值也是此元素。而src赋值和元素添加的顺序可以互换。因此我们可以用链式操作,从而彻底告别闭包和变量:

 

javascript:void(document.body.appendChild(document.createElement('script')).src='...')  这一步,我们精简了19个字符!

  

 

  我们继续观察。上面的代码里出现了2个document。我们如果用一个短变量代替的话又可以减少字数。但使用了变量的话又会出现冲突的问题,于是又要用到闭包。。。仔细的回忆下,js里有个我们平时不推荐使用的东西:with。没错,使用他就可以解决这个问题。我是只需with(document){...}即可。因为只有一行代码,所以那对大括号也可以去掉。于是又减少了4个字符:

 

javascript:with(document)void(body.appendChild(createElement('script')).src='...')  值得注意的是,void不再套在最外层了,因为with和if, for他们一样,不再是表达式,而是

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Gb2312转utf-8编码的方法(vbs+js)
      • 如何使用Ajax技术开发Web应用程序(1)
      • js跳转路径问题
      • JavaScript模仿桌面窗口
      • 用js检测两个线段是否相交
      • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
      • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
      • 我是如何去了解jquery的(六),案例之幻灯片轮换
      • Jquery封装幻灯片效果
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1