这个例子中的JavaScript事件处理有什么问题? (使用click()和hover()jQuery方法)

时间:2010-03-08 00:39:50

标签: javascript jquery events javascript-events event-handling

我正在为一个近似于Firebug的检查工具的项目进行一种概念验证。有关详细信息,请参阅this related question

以下是示例页面。我只在Firefox中测试过它:

http://troy.onespot.com/static/highlight.html

这个想法是,当你将鼠标悬停在任何可以包含文本的元素上时,它应该用“浅灰色”背景“突出显示”以指示该元素的边界。然后,当您单击该元素时,它应警告()与其匹配的CSS选择器。

这在上面链接的示例中有所帮助。但是,有一个基本问题。当从页面顶部鼠标悬停到底部时,它会拾取段落,< h1>但是,它没有得到包含这些段落的< div> s。但是,例如,如果你“偷偷”上< div>其中包含两个段落“区域已经确定......”和“奥斯汀被选中......” - 从页面的左边缘向下追踪并输入< div>就在这两段之间(见this screenshot) - 然后就可以了。我认为这与我没有将事件处理程序附加到< body>这一事实有关。 element(如果您从左侧输入,则输入< div>),但我已将处理程序附加到< p> s(如果您来自顶部或底部,则从中输入)。

还有其他问题包括进出元素 - 背景颜色“坚持”等 - 我认为这也是相关的。

正如上面发布的相关问题所示,我怀疑有一些关于事件冒泡的事情我不明白会导致意外行为。

有人能发现我的代码有什么问题吗?在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

一个。 if(this!== event_object.target){//由于事件冒泡而被调用;不要处理             返回;           }

你确定不仅如此吗?

另见http://api.jquery.com/event.stopPropagation/

如果你想要停止传播,你可以尝试返回false。

尝试在firebug中的A上放置一个断点,以查看悬停时元素的含义

答案 1 :(得分:1)

解决了!

http://troy.onespot.com/static/highlight_fixed.html

不要问我怎么样(这一定是由于事件冒泡的另一个复杂问题,我还没有完全掌握),但我改变了这一行:

$(content_elements[x]).click(select_element).hover(highlight, remove_highlight);

到此:

$(content_elements[x]).click(select_element).mouseover(highlight).mouseout(remove_highlight);

从我收集的内容来看,hover()方法在大多数情况下都是可取的,但显然不是这个。

我也意识到可能发生的事情是,在某些情况下,鼠标光标留下一个元素(例如< p>)和“输入”另一个元素(例如父< div>的那个) < p>),但它实际上并没有“进入”后者 - 它已经存在于它中(通过在嵌套元素中),它只是因为:

if (this !== event_object.target) { }

条件。因此,当我假设应该使用时,hover()方法的“mouseover”组件没有被调用。希望这是有道理的,也许可以帮助有人在路上。