使用EXT的mouseenter停止在子元素上触发事件

时间:2010-09-07 19:29:24

标签: extjs

问题: 我有一个带有类名'hasChildren'的锚标记,后者又有一个包含文本的span元素。当在锚标记上使用EXT的.on('mouseenter',function())时,它会在span和/或anchor标记上触发事件。

预期结果: 将鼠标悬停在span或锚标记上,该类应该单独添加到锚标记

当前结果: 将鼠标悬停在span或anchor标记上,该类将被添加到首先获得焦点的元素中。

在JS中你会看到我尝试了悬停功能,但结果相同。

HTML:

<a class="hasChildren" href="#"><span>web 2.0</span></a>

CSS:

.hasChildren {
  display:block;
  width:100px;
  background-color:#333;
}
.hasChildren span {
  background-color:#EEE;
  display:block;
  line-height:40px;
  margin-left:10px;
  padding:0 20px 10px 10px;
}

JavaScript:

function over(e,t){
    Ext.get(t).addClass('red');
}
function out(e,t){
    Ext.get(t).removeClass('red');
}
Ext.onReady(function() {
    //Ext.select('.hasChildren').hover(over,out,this);
    Ext.select('.hasChildren').on('mouseenter',over);
    Ext.select('.hasChildren').on('mouseleave',out);
});

仅供参考:我正在使用ext-core-3.1.0我可以通过使用jQuery来实现这一点但是当首席开发人员要求我只使用extJS时,我希望能够使用它没有添加另一个JavaScript库。

3 个答案:

答案 0 :(得分:1)

使用Ext.Element的这个函数:addClassOnOver()。因此,对于您的情况,它将是:

Ext.onReady(function() {    
    Ext.select('.hasChildren').addClassOnOver('red');
});

它会自动切换CSS类。

答案 1 :(得分:0)

尝试在div中包围你的锚标签,然后在div上附加监听器。我想你想在这种情况下尝试将事件附加到最外层的容器中。

答案 2 :(得分:0)

我最终找到了我想要的东西。 javascript函数应该更改为如下所示:

function over(e,t){
    Ext.get(e.getTarget('a')).addClass('red');
}
function out(e,t){
    Ext.get(e.getTarget('a')).removeClass('red');
}

解释:以前我尝试将类添加到't',就像get(t)一样,它可以是父元素或子元素。但是通过使用(e.getTarget('a'))我告诉它选择锚标记并将该类仅应用于该元素。

这个方法给出了一个控制传播,有趣的是下面的内容也适用于'out'函数,它会完全相同(理论上):

function out(e,t){
    Ext.get(e.getTarget('span')).parent().removeClass('red');
}

我发现了另一件事: Ext.onReady函数也可以写成:

Ext.select('.hasChildren').on( { mouseenter: { fn: over } } );

这种方式可以更容易地向目标元素添加更多事件

Ext.select('.hasChildren').on( { mouseenter: { fn: over } },  { mouseleave: { fn: out } });