关联的 script 标签

作者:手气不错 发布时间:October 28, 2009 分类:JavaScript

从 James Padolsey 这里得到个好的点子。

在实际写脚本过程中可能有段 Javascript 和 HTML 非常相关(比如实例化 Slider 等这样组件),那么通常我们会将它紧放到 HTML 的后面。

“传统”的做法需要顾虑的点有很多。因为脚本是立即被执行的,所以要考虑例如调用的组件是否已经声明,以及如果有 Ajax 请求是否会堵死浏览器等等。

下面的代码就是本篇 Blog 提供的另个思路,但愿我看起来不是那么的火星:

<div id="some-div">
    <script type=":contextual">
        alert(this.id); // "some-div" is alerted
    </script>
</div>

原文作者的想法是改变 script 标签的 this 指向到父节点的 Element,从而关联上下文 HTML 结构。

看它的实现代码:

<script type="text/javascript">
~function() {
    var scripts = document.getElementsByTagName('script'),
        script, i = 0;
    while ((script = scripts[i++])) {
        if (/:contextual$/.test(script.type)) {
            (new Function(script.innerHTML)).call(script.parentNode);
        }
    }
}();
</script>

不过如原作者所说的外,其实还有很多顺带的好处

  1. 将 this 指向关联到父节点,遍历查找 DOM 非常的方便
  2. 相关的 script 标签和 HTML 结合紧密,很清楚就能明白这段脚本需要做什么
  3. 统一调用,可以考虑懒加载
  4. 方便复制粘贴 :^)

当然,上面的代码仅仅是个想法而已,在实际编码中还需谨慎应用。滥用此方法可以预料到的 些问题,比如:

  1. 脚本执行顺序改变
  2. 弄乱作用域,如果你的代码严重依赖 this ,那么将会是个噩梦(当然,这本身也不是个好习惯)
  3. 让不了解此机制的其他开发者迷惑

正如原作者所言,在我们写代码的时候能“Thinking outside the box”,那才是最重要的 :^)

-- EOF --

已有 8 条回复

  1. Queen October 28th, 2009 at 07:57 pm #1
    Queen

    阁下莫非就是传说中的:重构界的小辈 ???

  2. vapour October 29th, 2009 at 08:07 am #2
    vapour

    感觉正如James Padolsey所言“It’s incredibly obtrusive and probably shouldn’t be used at all but it’s still a pretty cool idea”

  3. bailuo October 29th, 2009 at 08:48 am #3
    bailuo

    javascript的世界里面还有with

  4. 手气不错 October 29th, 2009 at 10:25 am #4
    手气不错

    @Queen 客官是打尖还是住店?嘿嘿~ :^)

  5. benhuoer October 31st, 2009 at 05:21 pm #5
    benhuoer

    笑翻在一楼.....

    笑完还是得请教一个问题:

    function前那一飘(~)很好看,不知道具体有何作用?

  6. 手气不错 November 2nd, 2009 at 11:42 am #6
    手气不错

    @benhuoer 仅仅比 (function() {})() 这样少个字符且不用匹对括号而已,同时这样写不返回值

  7. bigCat November 4th, 2009 at 10:49 pm #7
    bigCat

    Thinking inside the box 应该就是想着闭包了,恩恩(假装很懂)

  8. reeze November 6th, 2009 at 11:25 am #8
    reeze

    @bailuo
    with 没办法实现这种上下文关联的效果吧。。

添加新回复

Yahoo 统计