小探Unobtrusive Javascript的事件绑定

本文探讨了Rails框架中Unobtrusive Javascript如何处理DOM中不存在元素的事件绑定问题。通过分析Rails使用的jQuery和Prototype库的具体实现,揭示了live和on方法如何确保动态添加的元素也能响应事件。

这是看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风格,这点就见仁见智了。

 

提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值