【问题标题】:Prototype Element.toggle on hover, disables with childElements原型 Element.toggle 悬停,子元素禁用
【发布时间】:2009-07-21 14:54:06
【问题描述】:

我遇到了以下情况:

我有一个这样的表结构:

<tr>
  <td>text</td>
  <td>text</td>
  <td>text</td>
  <td><a href="#"><img src="#" /></td>
  <td><span style="display:hidden"><a href="#">e</a> <a href="#">e</a></td>
</tr>

我对以下函数所做的是在表格行悬停时显示隐藏的跨度。但是,每当我将 childElements 悬停在 tr 内时,它就会出现问题:锚定图像和 span 本身。我该如何解决这个问题?

// Reveal item options on hover
$$('#financedata tr').invoke('observe', 'mouseover', function(event) {
    event.target.up().childElements()[4].childElements()[0].toggle();                   
}); 
$$('#financedata tr').invoke('observe', 'mouseout', function(event) {
    event.target.up().childElements()[4].childElements()[0].toggle();
}); 

【问题讨论】:

  • 你能澄清一下“它的怪癖”是什么意思吗?谢谢。
  • 对不起。每当我悬停一个 childElement 时,javascript 都会认为我悬停在父元素之外,因此它会隐藏跨度。但实际上我的光标仍在父元素(tr)中。

标签: hover prototypejs children


【解决方案1】:

尝试以下方法:

$$('#financedata tr').invoke('observe', 'mouseout', function(event) {
    this.up('tbody').childElements()[4].childElements()[0].toggle();
});

关键是使用“this”。使用 Prototype,“this”将始终是事件绑定到的元素,而 event.target(您不应该使用它,因为它不是跨浏览器)和 event.findElement() 将是事件的实际元素发生在。 .up('tbody') 只是个人偏好,并确保您选择父 tbody,仅此而已。不管有没有都试试。

阅读:http://www.prototypejs.org/api/event/observe,了解有关事件冒泡如何工作的更多信息和示例。

【讨论】:

  • P.S.根据您的 DOM 标记,您可能需要将 tbody 更改为 table。
  • 另请注意,某些浏览器 (Firefox) 会在您未指定 tbody 时将其隐式添加到您的 DOM,因此请注意这一点。
  • 非常感谢!它有效:) 我将阅读更多关于事件冒泡和在观察者中使用的信息。我实际上不必使用 up() ,因为正如你所说,事件绑定到 .
  • 顺便说一句,我发现 Firefox 中的 thead 和 tbody 有很多错误。你碰巧知道我的 Firefox 其他问题的解决方案吗? stackoverflow.com/questions/1111337/…
猜你喜欢
相关资源
最近更新 更多
热门标签