3

我有一个textarea附加的模糊事件。如果用户单击页面上的特定内容,我不希望运行模糊事件span.dontClick。但是,如果用户单击除span.dontClick我确实希望运行模糊事件之外的任何内容。我找到了一种方法来做到这一点,但它看起来很糟糕,感觉很hackey,我猜那里有更好的解决方案。这是我想出的:

if (event.type === 'focusout') {
  if (
    typeof event.originalEvent !== 'undefined' &&
    typeof event.originalEvent.currentTarget !== 'undefined' &&
    typeof event.originalEvent.currentTarget.activeElement !== 'undefined' &&
    typeof event.originalEvent.currentTarget.activeElement.className !== 'undefined' &&
    event.originalEvent.currentTarget.activeElement.className === 'dontClick'
  ) {
    // abort the code for the blur event (in effect, do nothing)
  }
  else {
    // run code for when a user blurs by not clicking on span
  }

可能应该注意该event对象来自 jQuery 事件处理程序。我不确定它是否与原生event对象不同或相同。

还应该注意的是,对于大多数浏览器来说,这会静默失败,但如果我没有为每个对象一直指定“未定义”状态,我会在 IE 中得到一个调试窗口......

如果有人有更优雅的解决方案,我将不胜感激。谢谢!

4

1 回答 1

7

您不需要与undefined. 做一个真实的测试。className也不需要测试。比较将===涵盖它。

 if (
    event.originalEvent &&
    event.originalEvent.currentTarget &&
    event.originalEvent.currentTarget.activeElement &&
    event.originalEvent.currentTarget.activeElement.className === 'dontClick'
  ) {

但是无论如何,您所做的工作比需要的要多,因为 jQuery 为您提供了可靠的currentTarget.

 if (
    event.currentTarget.activeElement &&
    event.currentTarget.activeElement.className === 'dontClick'
  ) {

或者,如果您在处理程序中,只需使用this.

 if (this.activeElement && this.activeElement.className === 'dontClick') {
于 2012-10-31T21:22:28.693 回答