2012-01-19 2 views
2

http://pastebin.com/1MGTtzij私の完全なHTMLドキュメントであり、以下の短いバージョンです:HTMLコードでjQueryのクリック()イベントが発生します)ここ

$(document).ready(function() { 
     $("#myDiv").append($("<input />", { 
          type : "button", 
          id : "myButton1", 
          value : "Click me first!" 
         })); 
     $("#myButton1").live("click", function() { 
      var a = 1; 
      $("#myButton2").click(function() { 
       alert(a); 
      }); 
     }); 
    }); 

<div id="myDiv"></div> 
    <input type="button" id="myButton2" value="Click me!" /> 

ページが停止して完全に表示されたら、2ボタンが表示されます私を最初にクリックしてください!私をクリック!、私の後にやります:

  1. click 私を最初にクリックしてください! - 何も起こらない - OK
  2. click 私をクリックしてください! - アラート1 - OK
  3. click 私を最初にクリックしてください! - 何も起こらない - OK
  4. click 私をクリックしてください! - アラート1 - アラート1 ????????????
    私はクリックすればそれを認識しました私を最初にクリックしてください! N回、(N + 1)アラートを取得します。どのように私はそれを修正できますか?

ありがとうございます!

答えて

2

クリックハンドラがボタン1で呼び出されるたびに、ボタン2に新しいクリックハンドラが追加されます。

$("#myButton1").live("click", function() { 
    var a = 1; 
    // Don't add a new handler here. Move this outside of the `live` call 
    $("#myButton2").click(function() { 
     alert(a); 
    }); 
}); 

私は両方のボタンのクリックハンドラによってアクセスできるようにvariableを移動させ、外部のクリックハンドラのセットアップを移動しました。作業exampleを参照してください。

+0

脇に: '.live()'はjQuery 1.7以降では非推奨です。 jQueryのバージョンが1.7以上であれば、 '.on()'を使うべきです。そうでなくても、 '.delegate()'は長い間、大いに軽蔑されました(しかし重く使用された!!!) '.live()'の優れた代替手段とみなされてきました。 –

0

myButton1をクリックするたびに、新しい.clickハンドラをmyButton2に追加します。

本当にこのようにしたい場合は、$("#myButton2").unbind('click');の前に$("#myButton2").clickコールを行うことができます。

-1

clickclick me first!ボタンをクリックすると、クリックハンドラがClick meボタンにアタッチされて追加されるためです。クリックイベントハンドラを外部にアタッチするコードを移動します。これを試してください

$(document).ready(function() { 
     $("#myDiv").append($("<input />", { 
          type : "button", 
          id : "myButton1", 
          value : "Click me first!" 
         })); 
     $("#myButton1").live("click", function() { 
      var a = 1; 

     }); 
     $("#myButton2").click(function() { 
       alert(a); 
     }); 
    }); 
関連する問題