0

特定のイベントハンドラーに対してのみイベントの伝播を停止しようとしていますが、同じイベントの他のユーザーが伝播できるようにしています。例を次に示します。

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);

上記の例では、c1.Testとc2.Testは同じサイズです。私はこれらの3つのイベントをマウスダウンイベントで呼び出そうとしています(OO方法論が維持されておらず、状態がevent.dataを介して保持されていることを認識していますが、単純化のためにOO表記を使用しています。実際のユースケースでは、Allと単一のデリゲートはバインドされた可変順序であり、一部のインスタンスでのみバインドされるため、バインドされる順序を制御できません):c1.All c2.All c2.Single

Control_Topの最後でevent.preventDefault()、event.stopPropagation()、event.stopImmediatePropagation()、return(false)を試しましたが、上記のように機能するものはありません。

編集:これは、それを支援することに興味のある人を支援するためのJSFiddleリンクです。

もう一度編集:グローバルおよびbody.mousedownへの追加のバインドを使用して解決しました。これは、誰かが必要とする場合に、グローバルまたは追加のバインドを使用しないソリューションを歓迎します。

4

1 に答える 1

3

イベント ターゲットが、イベントをバインドした要素と等しいことを確認するだけです。

http://jsfiddle.net/cvmEz/2/

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('--------');
于 2013-01-11T18:41:13.050 に答える