4

我正在开发一个带有大量 AJAX 的大型 Web 应用程序,其事件处理已经失控。我正在尝试建立一个事件委托系统来管理所有这些,但我想知道是否有针对 IE 的非冒泡表单提交的解决方法(有很多通过 AJAX 插入/更新的表单)。我想出的最好的事情是每次我从 AJAX 调用得到响应时执行一些 javascript 来重新加载提交处理程序,但这看起来很难看。有任何想法吗?

此外,是否有人对哪些事件在不同版本的 IE 中没有正确传播有很好的参考?我很难找到好的信息(尽管这个其他问题有点)。


该站点的一个真实示例:对某些用户内容进行了就地编辑。进行事件委托时,我会让主体监听提交事件,然后查看是什么元素触发了事件并相应地处理它。由于提交不会在 IE 中冒泡,因此这是行不通的。5 美元的解决方案是对所有其他事件进行事件委托,并在 Prototype 中使用类似这样的东西处理提交:

// call this onload:
$$('form').invoke('observe', 'submit', function(event) { /*delegate*/ });

但这不适用于动态创建的表单(如上所述,我每次都必须重新实例化处理程序),如果我可以在 IE 中“制作”表单提交气泡和只需在任何地方进行简单的委托(没有特殊情况等)。

4

6 回答 6

3

您可以让表单返回 false 并在提交按钮上查找 CLICK 事件而不是表单提交事件吗?然后通过 AJAX 调用以编程方式提交表单。

于 2008-12-12T18:06:03.603 回答
2

Rails 3 rails.js 通过检测浏览器是否支持提交事件冒泡解决了这个问题,如果不支持,则将 onSubmit 方法绑定到表单的第一个焦点事件的处理程序。挺整洁的。

查看

http://github.com/rails/rails/commit/f61d923d284062b4e4864d81c603157020198d06

于 2010-06-30T01:05:52.363 回答
1

另一个需要考虑的选项可能是reglib

最新的中继版本有一个允许提交委托的实现

于 2009-01-21T18:24:53.880 回答
1

您可以尝试的一种技术是只有两个表单:“工作”表单和隐藏的“提交”表单,并且页面上只有这两个表单。

“工作”表单是向用户显示的内容——它只是一个容器,可以包含来自各种表单的元素。表单上的各种按钮实际上并不提交,而是在 JavaScript 中调用表单处理程序/验证例程。

处理程序/验证例程动态设置“提交”表单的操作,并将所需元素动态添加到该表单,以便可以提交。

这样您就不会从标签本身添加和删除,您只是更改两个主要标签的外观和行为,从而避免所有令人讨厌的事件操作。

于 2008-12-12T15:25:51.087 回答
1

Matt Kantor,我强烈建议你看看 NWEvents。正如您所说,它实际上强制在 IE 中冒泡,并以跨浏览器的方式使“事件委托”可用于任何其他事件。

NWEvents 源代码在GitHub 上

于 2010-11-06T20:02:41.013 回答
0

到目前为止我考虑过的选项:

  • 我在问题本身中发布的糟糕解决方案。
  • Inline Cop-out - 始终保证工作,并且开销相对较低,但令人难以置信的突兀。我必须调整这个想法以与 Prototype 一起工作(这并不难,我可能只是编写一个 Event.fix(event) 函数来停止事件然后重新触发它以以其快乐的方式传播)。
  • NWEvents - 我没有机会过多地摆弄这个,但据说这会迫使所有事件冒泡。查看源代码,我不确定这实际上是否适用于动态创建的元素。我得再玩一会儿。
于 2008-12-11T23:33:09.227 回答