2017-04-04 16 views
2

ボタンをクリックすると、IDを変更して、クラスtoMenuを追加して新しいスタイルを適用します。私がしたかったのは、新しいID menuのボタンをクリックすると、別のクラスmenuTransitionが追加されたということです。しかし、今のところ、古いID #buttonのボタンをクリックするとクラスmenuTransitionが既に追加されています。しかし、新しいID #menuのボタンがクリックされるまで、クラスmenuTransitionを追加しないでください。ここ
は私のコードです:jQuery .on()がクリックで即座に起動しません。

$(document).ready(function() { 
    $("#button").click(function(){ 
       $("#button").addClass("toMenu") 
       $("#button").attr("id","menu"); 
    }); 
}); 
$(document).on("click", "#menu", function() { 
     $("#menu").addClass("menuTransition"); 
}); 
+3

をなぜなら、このコードの目的は何ですか? – David

+0

ええ、あなたのコードは意味がありません。 ..最初からIDとしてメニューを持っていて、何の問題もありません。 – TGarrett

+0

まず、ボタンはメニューではなく、左にスライドして個々のスタイルを取得し、 'menu'というIDを取得します。 –

答えて

1

あなたが見ているどのような競合状態のビットです。ボタンのクリックイベントハンドラでは、ボタンにクラスとIDを追加します。次に、デリゲートされたイベントハンドラを使用して、子孫要素からバブルアップしたものであっても、ドキュメント上のクリックを探し、そこにクラスを追加します。これを処理する1つの方法は、通常はあなたのサンプルコードで発生するこのレースを短絡するために、小さな(約1ミリ秒)遅延を加えることです。 1ミリ秒の遅延を追加することにより

$(document).ready(function() { 
 
    $("#button").click(function() { 
 
    $("#button").addClass("toMenu") 
 
    setTimeout(function() { 
 
     $("#button").attr("id", "menu"); 
 
    }, 1) 
 
    }); 
 
}); 
 
$(document).on("click", "#menu", function() { 
 
    $("#menu").addClass("menuTransition"); 
 
});
.toMenu { 
 
    font-weight: bold; 
 
} 
 
.menuTransition { 
 
    color: red; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button id="button"> 
 
    button 
 
</button>

は、IDは、文書イベントハンドラに達しているボタンをクリックした後に添加するだけで火災ボタンを最初にクリックした後、そのイベントハンドラので、 。

+0

ありがとう。それはうまくいった。私は既にidが早すぎるかもしれないと思っていましたが、私が試みたのは動作しなかった '.delay(1)'を追加することでした。あなたの答えは完全にthoを働いています:) –

+0

@TobiasGlausしないでください、これをしないでください。 IDを変更しないようにコードを修正してください。それは長期的にはより良いでしょう。 – Alnitak

-1

IDを変更しないでください。要素IDは静的であることを意図しています。あなたは、ボタン/メニューの現在の状態をタグ付けするためにクラスを使用し、それに応じて動作させる(そして同時に$(document)上の非効率的な委任イベントハンドラを回避することができます(これはおそらく非常に簡単になり

$(document).ready(function() { 
    $("#menubutton").on('click', function() { 
     var $this = $(this); 
     if ($this.hasClass('toMenu')) { 
      $this.addClass('menuTransition'); 
     } else { 
      $this.addClass('toMenu'); 
     } 
    }); 
}); 
関連する問題