3

現在のコード

<a onclick="callMe1()">Click Me</a>
<a onclick="callMe2()">Click Me 2</a>

function callMe(){
   //anything
}

function callMe2(){
   //anything
}

など... 何百もの onclick イベント関数があります。

onclickイベント関数の前に呼び出す必要があるこの関数を追加したいと思います。

function callBeforeAnyOnClick(){
//This should be executed before callMe() and callMe2().
//once execution is complete, it should call a function as per onclick event,callMe() or callMe2().
}

解決策はありますか?jquery bind はここで動作しますか?

4

3 に答える 3

0

DOM + JS の仕組みでは、ライブラリ (jquery) のイベント処理とインライン スクリプトのイベント処理を混在させたり一致させたりするときに、実行順序を「ハイジャック」することはできません。次の 2 つのことが思い浮かびます。

  1. クリック イベントの前に発生するマウスダウン/アップ イベントを使用します。
  2. 読み込み後に jquery で DOM を変更/操作して、より詳細に制御できるようにします。

オプション #2 の疑似例:

$(function()
{

  $('a[onclick]').click(function() { /* your normal on click here */ });

  // now modify the DOM to convert the onclick attr into a function call
  $('a[onclick]').each(function()
  {
    var clickFunction = $(this).attr('onclick');

    // remove the attr
    $(this).attr('onclick', '');

    // might be a better way than calling eval on the inline function, but this serves its purpose for the demo
    $(this).click(function() { eval(clickFunction); });
  });
});

したがって、上記の例では、onclick 属性を削除して jquery クリック イベント ハンドラーに変換します。最初ではなく 2 番目に実行するため、新しく挿入された pre-onclick 関数の後に発生します。

于 2012-12-04T13:04:24.467 に答える
0

呼び出す必要がある実際の関数を渡す「ディスパッチャー」関数を呼び出すことができます。

<a onclick="callfun(f1)">Click Me</a>
<a onclick="callfun(f2)">Click Me 2</a>

function f1 { console.log("Hello f1"); }
function f2 { console.log("Hello f2"); }

function callfun(f){
   /* do something before */

   if ('function' === typeof f) {
     f();
   }
}
于 2012-12-04T13:00:34.273 に答える
0

あなたが探しているのは、オブザーバー パターンの古典的な例です。これは、特に JS と jQuery が混在している場合、またリッスンしたいものがイベント (それ自体、既にオブザーバー) であるため、javascript で実現するのは非常に困難です。ドキュメントにリスナーを追加し、要素に onclick 関数が定義されている場合にのみ実行します (注: jQuery から .on を使用してイベント リスナーを追加すると、これは機能しません)。

function observerMethod(e) {
  if (e.target.onclick) {
    ... do your thing here ...
  }
}

document.addEventListener("click", observerMethod, false);
于 2012-12-04T13:20:36.197 に答える