为啥 *** 使用 javascript 动态绑定用户操作?

Posted

技术标签:

【中文标题】为啥 *** 使用 javascript 动态绑定用户操作?【英文标题】:Why *** binds user actions dynamically with javascript?为什么 *** 使用 javascript 动态绑定用户操作? 【发布时间】:2010-09-13 19:32:36 【问题描述】:

检查我看到的问题的 html 源代码:

<a id="comments-link-xxxxx" class="comments-link">add comment</a><noscript>&nbsp;javascript is needed to access comments.</noscript>

然后在javascript源码中:

// Setup our click events..
$().ready(function()     
        $("a[id^='comments-link-']").click(function()  comments.show($(this).attr("id").substr("comments-link-".length)); );    
);

好像所有的用户点击事件都是这样绑定的。

这种方法的缺点对于不使用 javascript 浏览网站的人来说是显而易见的,但是使用 javascript 动态添加事件比直接声明它们有什么优势?

【问题讨论】:

【参考方案1】: 您不必在 HTML 中一遍又一遍地键入相同的字符串(否则会增加要调试的拼写错误的数量) 您可以将 HTML/CSS 交给不需要任何 javascript 技能的设计师 您可以通过编程方式控制调用哪些回调以及何时调用 它更优雅,因为它符合布局和行为之间的概念分离 更容易修改和重构

最后一点,假设您想在模板的其他位置添加“显示 cmets”图标。将相同的回调绑定到图标会非常容易。

【讨论】:

【参考方案2】:

通过事件 API 而不是在标记中附加事件是不显眼的 javascript 的核心。欢迎您阅读this wikipedia article,全面了解为什么不显眼的 javascripting 很重要。

与将样式与标记分开的方式相同,您也希望将脚本与标记分开,包括事件。

【讨论】:

我会说它更像是一个不显眼的 JavaScript 的推动者。唉,Stack Overflow 忽略了不显眼的 JavaScript 的真正核心,即创建适用于所有人的网站,无论他们是否有 JavaScript 可用或启用。 您在技术上是正确的,但我相信迎合 javascript 禁用用户的日子即将结束。与支持 IE6 一样,这是阻碍网络发展的另一个遗留问题。【参考方案3】:

我认为这是优秀软件开发的基本原则之一:

表示和逻辑的分离。

HTML/CSS 本质上是一种表示语言。 Javascript用于创建逻辑。如果可能,最好将任何逻辑与演示文稿分开。

【讨论】:

【参考方案4】:

这样您就可以拥有一个轻量级的页面,您可以在其中通过 javascript 处理您的所有操作。不必使用嵌入到页面中的大量不同的 url 和操作,只需编写一个 javascript 函数来查找链接并将其连接起来,无论您在页面上的哪个位置转储该“评论”链接。 这节省了 loads 的重复 html :)

【讨论】:

【参考方案5】:

我看到的唯一优势是页面大小减小,因此带宽需求降低。

编辑:由于我被否决了,让我们再解释一下我的答案。

我的观点是,将链接用作空锚点只是一种不好的做法,仅此而已!当然,将 JavaScript logic 从 HTML 中分离出来是很棒的。当然,重构和调试更容易。但在这里,它违反了不显眼的 JavaScript 的主要原则:Gracefull 退化

一个好的解决方案是必须调用 cmets:一个通过 REAL 链接指向一个显示评论的简单页面,另一个只返回 cmets(以 JSON 表示法或类似格式),并带有目的是通过AJAX调用直接注入到主页面。

这样做,使用 AJAX 方法的方法还应该注意取消其他调用,以避免用户被重定向到简单页面。那将是不显眼的 JavaScript。这里只是将 JavaScript 放在了一个误用的锚标记上。

【讨论】:

不知道为什么你会因此而被否决 - 没有最终用户会从所做的事情中受益,正如你所提到的,如果没有 JavaScript,这些链接是完全没用的。

以上是关于为啥 *** 使用 javascript 动态绑定用户操作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我js动态添加的a标签相应的js会失效

为啥我不能在动态 SQL 的 DDL/SCL 语句中使用绑定变量?

jQuery动态创建的元素为啥不能绑定事件

为啥动态组件创建中的属性绑定不起作用?

为啥 Castle Windsor 拦截器会破坏 C# 动态对象上方法的运行时绑定?

动态创建的Repeater为啥绑定数据只显示一条