Javascript Mouseenter或mouseover可防止主干/木偶应用程序中的点击触发

Javascript Mouseenter或mouseover可防止主干/木偶应用程序中的点击触发,javascript,jquery,backbone.js,marionette,Javascript,Jquery,Backbone.js,Marionette,首先,我只使用jQuery设置了下面的Fiddle来显示我想要完成的任务: 以下三个事件是有约束力的: $('.test li p').mouseenter(function() { var el = $(this), count = ++mouseenters[el.attr('id')]; el.find('.mouseenters .count').text(count); }); $('.test li p').mouseover(function(

首先,我只使用jQuery设置了下面的Fiddle来显示我想要完成的任务:

以下三个事件是有约束力的:

$('.test li p').mouseenter(function() {
    var el = $(this),
        count = ++mouseenters[el.attr('id')];

    el.find('.mouseenters .count').text(count);
});

$('.test li p').mouseover(function() {
    var el = $(this),
        count = ++mouseovers[el.attr('id')];

    el.find('.mouseovers .count').text(count);
});

$('.test li p').click(function() {
    function r() {
        return Math.floor(Math.random() * 256);
    } 
    $(this).css({'background-color': 'rgb(' + r() + ',' + r() + ',' + r()});
});
根据您使用的浏览器(我使用的是Chrome),我们可以看到jQuery弥补了浏览器供应商对mouseenter缺乏真正支持的不足。Mouseover在鼠标进入或离开子元素时激发,而mouseenter仅在鼠标进入绑定事件的DOM元素2时激发

然后我用主干线/木偶线写了以下内容:

事件在木偶中的绑定方式如下。项目视图:

events: {
    'mouseover p' : 'handleMouseOver',
    'mouseenter p' : 'handleMouseEnter',
    'click p' : 'handleClick'
},
我们在这里看到mouseenter和mouseover事件都表现得很糟糕(或者至少不像表现良好的jQuery版本),而且click根本没有触发。我的印象是主干网使用jQuery事件,但显然我错了,或者简单地说“主干网使用jQuery事件”并不能完全解决引擎盖下发生的事情

我只想说,我对这里发生的事情很困惑。为什么每次鼠标在主干版本中移动时都会触发mouseenter/mouseover?为什么点击根本就没有开火呢?如能提供解释或解决方法,将不胜感激。

更新的JSFIDLE:

我相信这些事件都是一样的。在主干版本中,每次模型更改时都会重新渲染整个视图。因此,每次鼠标移动时,它都会呈现一个新的div,因此它会注册一个新的“mouseenter”事件。这还可以防止“click”事件触发,因为单击down会在“mousedown”之后触发一个“mouseenter”,因此当发生“mouseup”事件时,它位于与单击down时不同的元素上。在jquery版本中,您只需更改相关属性,在本例中我也会这样做

    rerender: function() {      
             this.$('.mouseovers .count').html(this.model.get('mouseOverCount'));
             this.$('.mouseenters .count').html(this.model.get('mouseEnterCount'));
    },
更新的JSFIDLE:

我相信这些事件都是一样的。在主干版本中,每次模型更改时都会重新渲染整个视图。因此,每次鼠标移动时,它都会呈现一个新的div,因此它会注册一个新的“mouseenter”事件。这还可以防止“click”事件触发,因为单击down会在“mousedown”之后触发一个“mouseenter”,因此当发生“mouseup”事件时,它位于与单击down时不同的元素上。在jquery版本中,您只需更改相关属性,在本例中我也会这样做

    rerender: function() {      
             this.$('.mouseovers .count').html(this.model.get('mouseOverCount'));
             this.$('.mouseenters .count').html(this.model.get('mouseEnterCount'));
    },

如果可以的话,我会投你一票,内尔。非常感谢你的回答,这很有道理。如果可以的话,我会投你一票,ne8il。非常感谢你的回答,这很有道理。