limu/magix

magix代理事件

Closed this issue · 1 comments

是否应该对所有事件代理

  1. 通过mxclick可以在模板上快速注册事件
  2. 通过events下的click与模板上注册的事件挂钩
  3. 这样的方式比较直观,也较动态绑定事件方便的多

但是这样的事件要求事件能冒泡,因为magix中,会把当前view中要用到的事件比如click,mousedown等在view的根节点中注册事件,如果事件不能冒泡,则无法在根节点捕捉得到,也就无法处理

常见的不冒泡的事件如focus,blur,change,submit等,而这些事件也不是在所有浏览器中都不冒泡,是有浏览器差异的(这块最好能把各浏览器版本的支持情况列举下)

通过阅读jQuery的事件部分和KISSY的事件部分,它们对于处理不冒泡的事件思路是一致的,以submit事件举例,在不支持冒泡的情况下,如果当前节点需要监听submit事件,则首先判断当前节点下是否有form表单(只有form表单才有submit),如果有,则给这个节点绑定click,keypress事件(既然submit无法冒泡,那么我们就监听能触发submit并且冒泡的事件),当click或keypress发生时,我们这时才去给form绑定submit事件,在submit监听中,再手工去进行冒泡(找parentNode,触发submit),直到最顶层。

另外对于change事件较复杂,blur,foucs需要兼容一下浏览器,不过原理上跟上面所提到的submit都是一样的。

对于需要处理的事件大致为以下事件:

  1. blur
  2. focus
  3. focusin
  4. focusout
  5. mouseenter
  6. mouseleave
  7. mousewheel
  8. valuechange(change?)
    参考KISSY事件部分得到的以上8个事件

如果做事件的代理,我们要注意的事情

  1. 应用中是否需要对这些不冒泡的事件都进行代理?(change较麻烦)
  2. 如果做代理需考虑这个场景:
    • view点击某个按钮弹出一个弹出层A,弹出层A中点某个按钮弹出弹出层B
    • 当鼠标点击在A外部时,A B都需要隐藏
    • 当鼠标点击在A内部B外部时,A不能隐藏,B需要隐藏
    • 当鼠标点击在B内部时,A B都不能隐藏
      *点击在A内部B外部时,仍需考虑A B都不隐藏的情况
  3. 对于2的应用场景,需要在冒泡这一块仔细考虑,那么我们是不是要对所有的事件进行手动冒泡才可以?

代理在body上,并且已对所有事件代理,不支持valuechange