停止特定事件处理程序的JQuery事件传播

停止特定事件处理程序的JQuery事件传播,jquery,javascript-events,Jquery,Javascript Events,我试图仅为特定事件处理程序停止事件传播,同时允许同一事件上的其他事件传播,以下是一个示例: function Control(parent) { this.Parent = $(parent); this.Parent.append('<div class="test"></div>'); this.Test = $('.test', this.Parent).last(); this.Test.bind('mousedown', this

我试图仅为特定事件处理程序停止事件传播,同时允许同一事件上的其他事件传播,以下是一个示例:

function Control(parent) {
    this.Parent = $(parent);
    this.Parent.append('<div class="test"></div>');
    this.Test = $('.test', this.Parent).last();
    this.Test.bind('mousedown', this, Control_All);
    this.Test.bind('mousedown', this, Control_Top);
}
function Control_All(event) {
    //this should bubble up through both c1 and c2
}
function Control_Top(event) {
    //this should stop at c2
}
Control.prototype.constructor = Control;
Control.prototype.All = Control_All;
Control.prototype.Top = Control_Top;

var c1 = new Control('body');
var c2 = new Control(c1.Test);
功能控制(父级){
this.Parent=$(Parent);
this.Parent.append(“”);
this.Test=$('.Test',this.Parent.last();
this.Test.bind('mousedown',this,Control\u All);
this.Test.bind('mousedown',this,Control\u Top);
}
功能控制\u所有(事件){
//这应该通过c1和c2向上冒泡
}
功能控制\u顶部(事件){
//这应该在c2停止
}
Control.prototype.constructor=控制;
Control.prototype.All=Control\u All;
Control.prototype.Top=Control\u Top;
var c1=新控制(“主体”);
var c2=新控制(c1.试验);
在上述示例中,c1.测试和c2.测试的尺寸相同。我正在尝试将mousedown事件称为这三个事件(我知道OO方法没有维护,状态是通过event.data保存的,但我使用OO表示法来简化,在我的实际用例中,所有和单个委托都是绑定变量顺序,仅在某些情况下,因此绑定顺序无法控制): c1.全部 c2.全部 c2.单身

我尝试了event.preventDefault()、event.stopPropagation()、event.stopImmediatePropagation()并在控件顶部的末尾返回(false),但没有任何操作可以像上面所述那样执行

编辑:帮助任何有兴趣帮助它的人


再次编辑:使用全局和额外绑定到正文解决。如果有人需要,mousedown将欢迎不使用全局或额外绑定的解决方案。

只需确认事件目标与您绑定事件的元素相等即可

功能控制(父项,名称){
this.Parent=$(Parent);
this.Parent.append(“”);
this.Test=$('.Test',this.Parent.last();
this.Test.bind('mousedown',this,Control\u All);
this.Test.bind('mousedown',this,Control\u Top);
}
功能控制\u所有(事件){
如果(event.target==此){
log(this.getAttribute('data-name')+'.All');
}
}
功能控制\u顶部(事件){
如果(event.target==此){
log(this.getAttribute('data-name')+'.Top');
}
}
Control.prototype.constructor=控制;
Control.prototype.All=Control\u All;
Control.prototype.Top=Control\u Top;
var c1=新控制(“主体”、“c1”);
var c2=新的控制(c1.测试,“c2”);
console.log('----------');

只需确认事件目标与您将事件绑定到的元素相等即可

功能控制(父项,名称){
this.Parent=$(Parent);
this.Parent.append(“”);
this.Test=$('.Test',this.Parent.last();
this.Test.bind('mousedown',this,Control\u All);
this.Test.bind('mousedown',this,Control\u Top);
}
功能控制\u所有(事件){
如果(event.target==此){
log(this.getAttribute('data-name')+'.All');
}
}
功能控制\u顶部(事件){
如果(event.target==此){
log(this.getAttribute('data-name')+'.Top');
}
}
Control.prototype.constructor=控制;
Control.prototype.All=Control\u All;
Control.prototype.Top=Control\u Top;
var c1=新控制(“主体”、“c1”);
var c2=新的控制(c1.测试,“c2”);
console.log('----------');

只有一个“事件”正在发生。事件气泡,而不是事件处理程序。如果停止事件传播,它将不会传播到任何一个处理程序。只需使处理程序更具体,以便它们只在您希望它们处理事件的点处处理事件。Kevin,我在您的响应后解决了它,并在编辑中发布了解决方案,在我的特定情况下是events实际上从两个不同的点绑定到一个控件(一个在内部应该冒泡,另一个在外部应该只调用一次,尽管事实上控件可以嵌套在彼此内部,但侦听页面中的每个控件).我提出的全局+额外绑定解决方案感觉有点笨拙,但它可以工作,我需要继续下一部分。这是你想要的吗?只有一个“事件”正在发生。事件气泡,而不是事件处理程序。如果停止事件传播,它将不会传播到任何一个处理程序。只需使处理程序更具体,以便它们只在您希望它们处理事件的点处处理事件。Kevin,我在您的响应后解决了它,并在编辑中发布了解决方案,在我的特定情况下是events实际上从两个不同的点绑定到一个控件(一个在内部应该冒泡,另一个在外部应该只调用一次,尽管事实上控件可以嵌套在彼此内部,但侦听页面中的每个控件)。我提出的全局+额外绑定解决方案感觉有点笨拙,但它可以工作,我需要继续下一部分。这是您想要的吗?
function Control(parent,name) {
    this.Parent = $(parent);
    this.Parent.append('<div class="test" data-name="' + name + '"></div>');
    this.Test = $('.test', this.Parent).last();
    this.Test.bind('mousedown', this, Control_All);
    this.Test.bind('mousedown', this, Control_Top);
}
function Control_All(event) {
  if ( event.target == this) {
    console.log(this.getAttribute('data-name') + '.All');
  }
}
function Control_Top(event) {
  if ( event.target == this) {
    console.log(this.getAttribute('data-name') + '.Top');
  }
}
Control.prototype.constructor = Control;
Control.prototype.All = Control_All;
Control.prototype.Top = Control_Top;

var c1 = new Control('body', 'c1');
var c2 = new Control(c1.Test, 'c2');

console.log('--------');