请不要过于依赖 JavaScript

May 20th, 2009 Add Comment

JavaScript 是很好的发明, 它让网页动了起来. 大家都喜欢这样的那样的页面效果, 所以 JS 的使用日益广泛, 甚至被依赖. 但你务必提醒自己, 绝大多数的浏览器都支持 JavaScript, 但不是全部.

上一篇文章中我简单地讲解了如何使用 JavaScript 实现滑动置顶效果. 那段调用 JS 代码的 HTML 片段曾经被我修改过两次. 这次我们将会以它为例, 讲解为什么不能完全依赖 JavaScript 并如何进行处理.

1. 最初版本

清晰, 简洁, 也可以实现滑动效果

<a href="javascript:goTop();">Top</a>

因为操作的动作会被暴露在浏览器的状态栏中, 如果函数很多参数或者很多动作, 那么就会看到很长的一串, 看起来别扭而不美观.

2. 修改版本 1

于是我将代码修改了一下, 将真正被调用的 JS 方法隐藏起来, 代码如下:

<a href="javascript:void(0);" onclick="goTop();">Top</a>

解决了上一个问题, 状态栏只会显示 "javascript:void(0);" 字样, 而同样存在滑动效果. 处理流程如下:

从流程中, 我们可以看到另一个问题, 两个事件都是 JavaScript 动作, 如果 JS 被禁用或者浏览器不支持, 那么点击按钮后一点反应都没有.

3. 修改版本 2

为了兼顾没有 JavaScript 支持的浏览器, 我又修改了一下代码:

<a href="#" onclick="goTop();return false;">Top</a>

我们得了解一下链接的被点击后的处理顺序, 首先 onclick 事件会被触发, 接着是转跳到 href 指向的链接, 我在 onclick 的最后加上 return false; 就是为了中断处理, 不转往 href 指定链接处.

如果浏览器支持 JavaScript, 滑动到顶部后中断处理; 如果浏览器不支持 JavaScript, 则不会执行 onclick 方法, 直接转跳链接的锚回到顶部 (没有滑动效果, 但却是能回到顶部). 处理流程如下:

现在已照顾得算比较周全了, 但还是不够完美. 更极限一些其实我们可以将 JavaScript 代码和页面代码分离, 在 document ready 或者 onload 的时候加载页面代码.

4. 未来版本

我准备在新的模板中将 JS 完全分离出来, 日后我会专门起贴讨论这种做法, 包括什么应该在 document ready 时加载, 什么在 onload 时加载. 代码我暂时就不提供了, 示意的流程如下:

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: 请不要过于依赖 JavaScript

  1. http://0.gravatar.com/avatar/0d4d69100b093b7f7f9a08155fa5a7ac?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    初学Js,研究中。谢谢分享!

  2. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @HK
    祝福什么? 我本來 PR7 的.

  3. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @嗰個人
    我沒聽說過這個, 不過不在標簽上寫 onclick 應該是想在 document ready 的時候添加 events. 但有些時候當內容全部加載再觸發就太遲了.

  4. http://1.gravatar.com/avatar/9d2b4d63d962a9af3900b0bb94a05883?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    Leeiio :我覺得未來的瀏覽器肯定會更好的支持js並使其有更好的解析,我認為js是未來的一大趨勢。

    呵呵,未來,是指多遠?還有AS呢。不知道RIA在未來會不會代替傳統形式的PAGE網頁。....或許等某大搜索引擎全完支持搜索FLASH裏面的内容 :lol:

  5. http://1.gravatar.com/avatar/9d2b4d63d962a9af3900b0bb94a05883?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    聽過一個術語“無入侵”。
    不完全了解,大概是不贊成在標籤上寫 onclick,不知博主是否在以後的JS代碼中,都做到無入侵的?等待你的文章。 :smile:

  6. http://0.gravatar.com/avatar/ea5ea22f005b6815e2282e22fce637ad?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个主意很好,很强大,喜欢。

  7. http://1.gravatar.com/avatar/3d94daac60750850d3de18fc89b4f989?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    从没没听过呀。

  8. http://1.gravatar.com/avatar/1ec4717231e96f16618449f9ebb32c5c?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  9. http://1.gravatar.com/avatar/bb3664adbe5be014683bfa0c1d5c1b56?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    年发生的一场政治风暴

  10. http://0.gravatar.com/avatar/8bc5a10d6cd90aec2d2e24b53042856f?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    JS挺强大的。另外祝贺一下,你的博客PR为5了,据说是今天早上更新的 :razz:

  11. http://1.gravatar.com/avatar/b2a4a8583709521e13d79f8519b07954?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    评论框框有多了一些东东啦~

  12. http://1.gravatar.com/avatar/7b033fe01f5e97ab5437c8d7a4ebe606?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    过来捧捧场,写得有摸有样啊!呵呵

  13. http://1.gravatar.com/avatar/ffa60157af668384f5325116efd02385?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我覺得未來的瀏覽器肯定會更好的支持js並使其有更好的解析,我認為js是未來的一大趨勢。

  14. http://0.gravatar.com/avatar/857cf6dcb85bbffb35cd56ed924bdcdd?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我R, 在网上找到了,英德市英红镇的。 太恐怖了。 应该离 MG 不远啊。

  15. http://0.gravatar.com/avatar/857cf6dcb85bbffb35cd56ed924bdcdd?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    2009 年发生的一场政治风暴 ??? 没听过呀。

  16. http://1.gravatar.com/avatar/70a2291293cd289ae0573b6cdb7d791e?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    玩笑~...joke...摆脱别继续,next topic :razz:

  17. http://1.gravatar.com/avatar/518dee831d748e7854aa439443e5e521?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    [由于评论内容涉及 2009 年发生的一场政治风暴, 已被删除]

Comment pages