2011-01-11 2 views
0

これは私のコードなぜonclick関数はonclickで実行されますが、手動で呼び出すとどうなりますか?

// Register onclick 
var old_onclick = link.onclick; 

link.onclick = function() { 
    astr_track_action(param); 

    if(typeof(old_onclick) == "function") 
    old_onclick(); 
} 

されており、これは、HTML

<a onclick="alert('hello!');" href="http://www.google.com?acme=link&foo=bar">To google!</a> 

私はリンクをクリックすると、アラートがポップアップ表示

です。しかし私のJSコードでonclickをオーバーライドすると、 ではなくのポップアップが表示されます。

アイデア?


編集:私はちょうど私がデバッグとold_onclick()が実行されていることが確認されている、追加したいのですが、何の警告メッセージが現れません。


編集:ループ開始からの完全なコードです。私はそれが関連性の方法を見ていないが、それが要求されました:

for(var i = 0; i < document.links.length; i++) 
{ 
    var link = document.links[i]; 
    var eventlink = link.href.split("acme="); 

    if(eventlink.length > 1) 
    { 
     var param = eventlink[1].split("&")[0]; 
     var newlink = link.href; 

     // Register onclick 
     var old_onclick = link.onclick; 

     link.onclick = function() { 
      astr_track_action(param); 

      if(typeof(old_onclick) == "function") 
       old_onclick(); 
     } 
+0

と同じですか? 'param'はどこかで定義されていますか? 'astr_track_action'は成功したのでしょうか?この行をコメントするとどうなりますか? –

+0

これは実際のコードですか? jsfiddleの例を設定して私たちを見せてもらえますか? – lonesomeday

+0

@Felix Klingはい、私はデバッグして、old_onclick()がonclickで実行されていることを確認しました。 @lonesomedayはい、それはEclipseから直接コピーされた実際のコードです。 – Hubro

答えて

0

ループ内に関数を作成しています。 old_onclickは、ループした最後の要素のクリックハンドラをポイントします(実行時にループが既に終了したときにクリックハンドラがold_onclickにアクセスするため)。
たとえば、値をキャプチャする必要があります。

JavaScriptにはブロックスコープと機能スコープのみがあります。私。

for(...) { 
    var foo = something; 
} 

は `astr_track_action`が定義されている

var foo; 
for(...) { 
    foo = something; 
} 
0

それは、これまで私が言うことができるように、作業を行います。jsfiddleあなたがthisを使って何かをやっている場合、あなたはapplyを使用する必要があります、だけではなく、通常の関数を呼び出す、

注:

if (typeof(old_onclick) == 'function') { 
    old_onclick.apply(this, arguments); 
} 
関連する問題