这是看Railscasts 229 Polling For Changes时想到的一个问题,就是Rails的Unobtrusive Javascript如何去为一个不存在于DOM树中的对象去绑定事件。
举个例子:
我有一个列表,就是用Rails的scaffold生成的那种,每行显示一个产品信息,后面有三个按钮(显示,编辑,和删除),整个列表用 table 标签,每一行用 tr 标签。以下是一行的例子。为了方便我只写了Delete按钮,因为只有它才绑定了JS。
<tr class="product">
<td>iPhone</td>
<td>
<a rel="nofollow" data-method="delete" data-confirm="Are you sure?" href="/products/1">Destroy</a>
</td>
</tr>
我们知道Unobtrusive Javascript的做法,是在整个页面加载之前,搜索DOM树,然后为特定的标签去绑定Javascript函数。比如上面的html中的 a 标签,它有 data-confirm 属性,Rails的Unobtrusive Javascript会为它绑定特定的函数,让我们点击这个按钮时,弹出 “Are you sure ?” 的提示信息。
现在设想一种情况,我们用Ajax来实时更新这个列表,比如每隔几秒钟去读一下,然后把新的product增量添加到列表的最下面。这时,因为新增加的那一列是在页面加载完成之后才添加进DOM树的,按道理这时是不会为新那一列的Delete按钮绑定事件的。但实际上,Rails很好的处理了这种情况,无论是通过什么方法去修改或替换DOM节点,那些特殊节点的事件都会正确执行。
于是我想知道Rails是如何处理事件绑定的,因为我那个Railscast的例子中用的 jquery-rails 这个gem,所以我查看了它提供的rails.js文件。发现它处理 data-confirm 的。
$('a[data-confirm],input[data-confirm]').live('click', function () {
var el = $(this);
if (el.triggerAndReturn('confirm')) {
if (!confirm(el.attr('data-confirm'))) {
return false;
}
}
});
这里它是用 live 方法来为找到的DOM节点(实际上应该叫jQuery包装集)绑定事件的。再去查查 jQuery的文档,发现它对 live 方法的描述如下:
Attach a handler to the event for all elements which match the current selector, now or in the future.
大概意思是说,live 方法可以为选择器找到的对象绑定事件处理函数,不管这个对象是已有的,还是以后要添加进来的。
关于如何做到这点,jQuery的文档中也有详细的介绍,大致就是:jQuery并不是把Javascript函数绑定到选择器查找出来的节点,而是绑定到html文档的根节点。当我们触发子节点的事件后,通过事件冒泡,来调用绑定到根节点上的Javascript函数。有兴趣的可以看看jQuery的文档说明,说得还是很详细的。
因为我原来写过一个基于Prototype的JS列表,用处和上面说的差不多。而我当时没找到Prototype有类似jQuery的live函数。所以我又看了下Prototype版本的 rails.js 文件。发现Prototype是这样处理的:
document.on("click", "*[data-confirm]", function(event, element) {
var message = element.readAttribute('data-confirm');
if (!confirm(message)) event.stop();
});
Prototype是用 on 方法来处理的,原理和jQuery差不多,就不多说了。有兴趣的可以看看Prototype的文档说明(这个就太简洁了)。不过从语法可以比较明显的看到,函数是直接绑定给document节点的。相对而言,我更喜欢 jQuery 的API风格,这点就见仁见智了。
分享到:
相关推荐
萤火虫UJS Firebug 扩展,用于显示绑定到 DOM 元素的 Unobtrusive Javascript。 more documentation coming soon
2. **自动绑定**:在ASP.NET MVC环境中,无侵入式插件会自动将服务器端验证规则绑定到对应的客户端验证,无需额外的JavaScript代码。 3. **增强的用户体验**:通过与ASP.NET MVC的集成,开发者可以实现前后端验证的...
3. **事件处理**:掌握如何绑定事件监听器、触发事件以及取消事件绑定。 4. **动态CSS**:学会如何使用JavaScript动态地修改元素的样式和类名,从而实现动态效果。 5. **表单操作**:探索如何使用JavaScript来验证...
ASP.NET MVC3是微软开发的一款基于模型-视图-控制器(Model-View-Controller)模式的Web...通过Razor视图引擎、NuGet包管理器、Unobtrusive JavaScript等特性,ASP.NET MVC3成为了一个更为强大且易用的Web开发框架。
在"Creating a MVC 3 Application with Razor and Unobtrusive JavaScript"的案例中,我们将深入探讨如何使用这些特性来构建一个高效且用户友好的Web应用。 1. **MVC架构** - **模型(Model)**:负责业务逻辑和数据...
- data-ajax="true":这是开启unobtrusive Ajax绑定的标志。 - data-ajax-mode:它指定了Ajax操作更新内容的方式,有BEFORE、AFTER和默认的覆盖方式(无值)。 - data-ajax-update:指明需要更新的页面元素,通常是...
8. **AjaxHelper和Unobtrusive JavaScript**:了解ASP.NET MVC中的AjaxHelper如何帮助创建无刷新的AJAX操作,以及如何配合Unobtrusive JavaScript实现更干净的代码结构。 9. **错误处理和调试**:学习如何在ASP.NET...
总的来说,ASP.NET MVC3作为一个强大的Web开发框架,集成了许多现代Web开发的最佳实践,如Razor视图引擎、Unobtrusive JavaScript、依赖注入以及增强的模型绑定和验证。这些特性使得开发者能够构建出高效、可维护且...
在ASP.NET MVC 3中,JavaScript与DOM元素的交互采用Unobtrusive方式,即通过HTML5的数据属性和事件监听器实现,而不是依赖于内联的JavaScript或HTML标签的`onclick`等属性。这种方式使得页面代码更加整洁,易于维护...
- **DOM元素创建**:jQuery提供了一个简单的接口来创建新的DOM元素,并允许立即添加样式或绑定事件。 - **Extending jQuery**:jQuery的插件机制允许开发者扩展其功能,通过自定义方法或组件来满足特定需求。 - **与...
因此,JavaScript代码应尽量避免侵入到HTML结构中,采用“Unobtrusive JavaScript”原则,通过事件监听和数据绑定来实现页面交互,而不是依赖于内联的`onclick`等属性。 二、模块化和组织结构 为了保持代码的清晰...
6. jQuery和Unobtrusive JavaScript:ASP.NET MVC3默认包含jQuery库,并通过unobtrusive JavaScript模式与JavaScript交互,使得页面行为更加分离,更易于维护。 7. 异步控制器:在ASP.NET MVC3中,开发者可以创建...
8. ** jQuery UI和Unobtrusive JavaScript**:MVC3集成了jQuery UI库,并默认使用无侵入式JavaScript(Unobtrusive JavaScript)来处理客户端事件,使代码更易于维护和测试。 9. ** 更好的测试支持**:ASP.NET MVC3...
6. **jQuery**和**Unobtrusive JavaScript**:MVC3鼓励使用Unobtrusive JavaScript,这是一种在HTML中嵌入JavaScript的非侵入式方式,通常配合jQuery库使用,可以实现优雅的页面交互和异步更新。 7. **单元测试**:...
另外,ASP.NET MVC3引入了“Unobtrusive JavaScript”,提倡分离关注点,通过HTML5 data属性和jQuery插件实现JavaScript行为的绑定,使得JavaScript代码更加独立于HTML结构,提高了代码的可维护性。 在部署方面,...
在使用jquery.validate.unobtrusive时,需要在项目中安装NuGet包Microsoft.jQuery.Unobtrusive.Validation,该包包含了必要的JavaScript和CSS文件,以及一些默认的验证器适配器。通过安装这个包,开发者可以轻松地在...
6. **jQuery和Unobtrusive JavaScript:**MVC3鼓励使用Unobtrusive JavaScript,将JavaScript逻辑与HTML标记分离,通过数据属性和事件绑定实现。默认集成了jQuery库,简化了客户端脚本的编写。 7. **单元测试和模拟...
在无刷新上传中,jQuery用于处理DOM操作、事件绑定和异步通信,使代码更简洁高效。 **3. jQuery.uploadify插件** jQuery.uploadify是一个流行的jQuery插件,用于实现文件上传功能,特别是无刷新上传。它支持多文件...
4. **Unobtrusive JavaScript**:为了提高可维护性和减少HTML中的JavaScript代码,MVC3支持无侵入式JavaScript,通过数据属性实现客户端验证和事件绑定。 5. **改进的模型绑定**:模型绑定功能得到增强,支持更多...
2. **Unobtrusive JavaScript**:MVC3鼓励使用非侵入式JavaScript,通过数据属性和事件绑定,将JavaScript与HTML分离,提高了代码的可维护性。 3. **Dependency Injection(依赖注入)支持**:MVC3内置对依赖注入的...