0

タスクはこの投稿と同じ です。リンクのクリックをキャプチャし、ブラウザのデフォルトの動作を防ぎます。そこで出された答えはこうでした。

テンプレート:

<a on-click='sayHello' href="#">Activate!</button>

JS:

ractive.on( 'sayHello', function ( event ) {
  event.original.preventDefault();
  alert( 'Hello world!' );
});

問題は、sayHelloイベント ハンドラーが元のイベントが何であったかを認識できないことです。プロキシの要点は、イベント ハンドラが元のイベントのタイプを気にする必要がないことです。たとえば、リンクをボタンに変更すると、preventDefault.

したがって、私の質問は、イベント プロキシを起動する前または後に preventDefault を呼び出す方法です。

適切な解決策は、複数のイベント プロキシを連続して起動することです (可能であれば)。

テンプレート:

<a on-click='preventDefault;sayHello' href="#">Activate!</button>

J:

ractive.on( 'preventDefault', function ( event ) {
  event.original.preventDefault();
});
ractive.on( 'sayHello', function ( event ) {
  alert( 'Hello world!' );
});

これはどういうわけか可能ですか?または、他の良い解決策はありますか?

4

3 に答える 3

1

1 つの方法は、デフォルトを防止するかどうかを決定する引数を渡すことです。

テンプレート:

<a on-click='sayHello:true' href="#">Activate!</a>
<button on-click='sayHello'>Activate!</button>

コード:

ractive.on( 'sayHello', function ( event, shouldPreventDefault ) {
  if ( shouldPreventDefault ) {
    event.original.preventDefault();
  }
  alert( 'Hello world!' );
});

または、ブール値のトラップを回避したい場合は...

<a on-click='sayHello:{preventDefault:true}' href="#">Activate!</a>

...など。

イベントの連鎖は興味深いアイデアです。それがライブラリに属しているとは確信していませんが、確かに次のようなことができます

テンプレート:

<a on-click='multiple:["preventDefault","sayHello"]' href='#'>Activate!</a>

コード:

ractive.on( 'multiple', function ( event, sequence ) {
  var eventName, i, len;

  len = sequence.length;
  for ( i = 0; i < len; i += 1 ) {
    this.fire( sequence[i], event );
  }
});

必要に応じて、このパターンを拡張して引数を含めることができます。

于 2014-02-21T21:34:06.170 に答える
0

この方法で解決しましたが、完全に満足していません。

テンプレート:

<a on-click='pd_and:sayHello' href="#">Activate!</button>

J:

ractive.on( 'pd_and', function ( event, next ) {
  event.original.preventDefault();
  var i = args.indexOf(':'), arg;
  if (i === -1) {
    type = next;
    arg = undefined;
  } else {
    type = next.substr(0, i);
    arg = next.substr(i + 1);
  }
  return ractive.fire(type, event, arg);

});
于 2014-02-10T20:44:21.130 に答える