46

インライン javaScript 呼び出しの要素ソースを取得する方法はありますか?

次のようなボタンがあります。

<button onclick="doSomething('param')" id="id_button">action</button>

ノート:

  • ボタンはサーバーから生成されます
  • 生成プロセスを変更できない
  • ページにいくつかのボタンが生成されますが、クライアント側でのみ制御できます。

私が試したこと:

function doSomething(param){
    var source = event.target || event.srcElement;
    console.log(source);
}

firebugでイベントが定義されていません

編集:いくつかの回答の後、jQuery を使用したイベント処理のオーバーライドは非常に受け入れられます。私の問題は、関数名を知らずに、元のパラメーターを使用して元の onClick 関数を呼び出す方法です。

コード:

<button onclick="doSomething('param')" id="id_button1">action1</button>
<button onclick="doAnotherSomething('param1', 'param2')" id="id_button1">action2</button>.
<button onclick="doDifferentThing()" id="id_button3">action3</button>
.
.
and so on..

したがって、オーバーライドは次のようになります。

$(document).on('click', 'button', function(e) {
  e.preventDefault();
  var action = $(this).attr('onclick');
  /**
   * What to do here to call
   * - doSomething(this, 'param'); if button1 is clicked
   * - doAnotherSomething(this, 'param1', 'param2'); if button2 is clicked
   * - doDifferentThing(this); if button3 is clicked
   * there are many buttons with many functions..
   */
});
4

6 に答える 6

33

HTMLは次のようになります。

<button onclick="doSomething" id="id_button">action</button>

そして、input-paramterの名前をこのようなイベントに変更します

function doSomething(event){
    var source = event.target || event.srcElement;
    console.log(source);
}

あなたの問題を解決するでしょう。

ちなみに、jQueryと控えめなJavaScriptを見てみることをお勧めします

于 2012-05-03T09:31:16.500 に答える
12

生成されたHTMLを変更して、インラインJavaScriptを使用せず、addEventListener代わりに使用する必要があります。

HTMLを変更できない場合は、使用する属性、関数、引数を取得し、代わりにハンドラーを削除してイベントリスナーを使用onclickすることで、控えめなJavaScriptに「変換」できます。onclick

属性から値を取得することから始めます

$('button').each(function(i, el) {
    var funcs = [];

	$(el).attr('onclick').split(';').map(function(item) {
    	var fn     = item.split('(').shift(),
        	params = item.match(/\(([^)]+)\)/), 
            args;
            
        if (params && params.length) {
        	args = params[1].split(',');
            if (args && args.length) {
                args = args.map(function(par) {
            		return par.trim().replace(/('")/g,"");
            	});
            }
        }
        funcs.push([fn, args||[]]);
    });
  
    $(el).data('args', funcs); // store in jQuery's $.data
  
    console.log( $(el).data('args') );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button onclick="doSomething('param')" id="id_button1">action1</button>
<button onclick="doAnotherSomething('param1', 'param2')" id="id_button1">action2</button>.
<button onclick="doDifferentThing()" id="id_button3">action3</button>

これにより、属性によって呼び出されるすべてのグローバルメソッドの配列とonclick、渡される引数が得られるため、複製することができます。

次に、すべてのインラインJavaScriptハンドラーを削除します

$('button').removeAttr('onclick')

独自のハンドラーをアタッチします

$('button').on('click', function() {...}

これらのハンドラー内で、保存されている元の関数呼び出しとその引数を取得し、それらを呼び出します。
インラインJavaScriptで呼び出される関数はグローバルであることがわかっているwindow[functionName].apply(this-value, argumentsArray)ので、で呼び出すことができます。

$('button').on('click', function() {
    var element = this;
    $.each(($(this).data('args') || []), function(_,fn) {
        if (fn[0] in window) window[fn[0]].apply(element, fn[1]);
    });
});

そして、そのクリックハンドラー内に、元の関数が呼び出される前または後に必要なものを追加できます。

実例

$('button').each(function(i, el) {
    var funcs = [];

	$(el).attr('onclick').split(';').map(function(item) {
    	var fn     = item.split('(').shift(),
        	params = item.match(/\(([^)]+)\)/), 
            args;
            
        if (params && params.length) {
        	args = params[1].split(',');
            if (args && args.length) {
                args = args.map(function(par) {
            		return par.trim().replace(/('")/g,"");
            	});
            }
        }
        funcs.push([fn, args||[]]);
    });
    $(el).data('args', funcs);
}).removeAttr('onclick').on('click', function() {
	console.log('click handler for : ' + this.id);
  
	var element = this;
	$.each(($(this).data('args') || []), function(_,fn) {
    	if (fn[0] in window) window[fn[0]].apply(element, fn[1]);
    });
  
    console.log('after function call --------');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button onclick="doSomething('param');" id="id_button1">action1</button>
<button onclick="doAnotherSomething('param1', 'param2')" id="id_button2">action2</button>.
<button onclick="doDifferentThing()" id="id_button3">action3</button>

<script>
	function doSomething(arg) { console.log('doSomething', arg) }
    function doAnotherSomething(arg1, arg2) { console.log('doAnotherSomething', arg1, arg2) }
    function doDifferentThing() { console.log('doDifferentThing','no arguments') }
</script>

于 2012-05-03T09:39:55.093 に答える
3

クロスブラウザ ソリューション

@slipset による解決策は正しかったと思います。jQuery は必要ありませんが、クロスブラウザー対応ではありませんでした。

Javascript.infoによると、イベント (マークアップ イベントの外部で参照される場合) は、次の単純な行で定義されていることを確認すると、クロスブラウザー対応になりますevent = event || window.event

したがって、完全なクロスブラウザー対応関数は次のようになります。

function logMySource(param){
  event = event || window.event;
  var source = event.target || event.srcElement;
  console.log("sourceID= "+source.id,"\nsourceTagName= "+source.tagName,"\nparam= "+param);
}
<button onclick="logMySource('myVariable')" id="myID">action</button>

それを試してみてください!ソースの有用な情報のリターンを含めました。

于 2016-10-17T19:37:02.040 に答える
1

次のようなことを試してください:

<html>
  <body>

    <script type="text/javascript">
        function doSomething(event) {
          var source = event.target || event.srcElement;
          console.log(source);
          alert('test');
          if(window.event) {
            // IE8 and earlier
            // doSomething
           } else if(e.which) {
            // IE9/Firefox/Chrome/Opera/Safari
            // doSomething
           }
        }
     </script>

    <button onclick="doSomething('param')" id="id_button">
      action
    </button>

  </body>      
</html>
于 2012-05-03T10:47:56.607 に答える
1

this関数を呼び出すときに渡すことができます

<button onclick="doSomething('param',this)" id="id_button">action</button>

<script>
    function doSomething(param,me){

    var source = me
    console.log(source);
}
</script>
于 2012-05-03T09:32:44.220 に答える
-1

USE .live()

 $(selector).live(events, data, handler); 

jQuery 1.7以降、.live()メソッドは非推奨になりました。.on()を使用して、イベントハンドラーをアタッチします。

$(document).on(events, selector, data, handler);  
于 2012-05-03T09:30:03.377 に答える