人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【jQuery】思ったとおりに動きません。
ソースコードは
ヘッダに
<style type="text/css">
#hoge{color:#ff0000;}
#fuga{background-color:#00ff00}
</style>
<script type="text/javascript">
$(function(){
$("#hoge").click(function() {
window.alert("hoge");
$("#hoge").attr("id","fuga");
window.alert("hoge");
});
});
$(function(){
$("#fuga").click(function() {
window.alert("fuga");
});
});
</script>
ボディに
<p id="hoge">aaaa</p>
です。
クリックするとスタイルではたしかにaaaaのidはhogeからfugaになっています。
でも次のクリックでwindow.alert("fuga")が実行できません。
window.alert("hoge")が出ます。
window.alert("fuga")が出ないと困るんですけど、どうにかしてください。
$.readyを1つにまとめてもダメでした。
はずしてもダメです。

●質問者: alan_i_jp
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● rouge_2008
●100ポイント ベストアンサー
$(function(){
$("#hoge").live("click", function() {
window.alert("hoge");
$("#hoge").attr("id","fuga");
window.alert("hoge");
});

$("#fuga").live("click", function() {
window.alert("fuga");
});
});


・live(type, fn)
http://semooh.jp/jquery/api/events/live/type,+fn/

bindとほぼ同様の関数ですが、ハンドラ登録時にマッチする要素だけでなく、永続的にイベント発生時点でマッチする要素に反応する点が異なります。
例えばli要素に対してclickイベントを登録した場合、bindであれば、その時点でページ上に存在するli要素に対してイベントが登録されるだけでした。しかしliveでは、その後で動的にli要素が追加された場合も、そのli要素でのクリックに対してハンドラが実行されます。



【追記】

公式サイトの解説では、『jQuery1.7で.live()は推奨されなくなった。イベントハンドラを登録するには.on()を使用してください。古いバージョンのjQueryでは.delegate()を使用してください。』とありますので、使用しているjQueryのバージョンに合わせて選択してください。

http://api.jquery.com/live/

As of jQuery 1.7, the .live() method is deprecated. Use .on() to attach event handlers. Users of older versions of jQuery should use .delegate() in preference to .live().


それぞれ以下のようにすると同様の動作になります。

http://api.jquery.com/delegate/

// 1.4.3+
$(document).delegate("#hoge", "click", function() {
window.alert("hoge");
$("#hoge").attr("id","fuga");
window.alert("hoge");
});

$(document).delegate("#fuga", "click", function() {
window.alert("fuga");
});


http://api.jquery.com/on/

// 1.7+
$(document).on("click", "#hoge", function() {
window.alert("hoge");
$("#hoge").attr("id","fuga");
window.alert("hoge");
});

$(document).on("click", "#fuga", function() {
window.alert("fuga");
});


alan_i_jpさんのコメント
詳しくどうもありがとうございました。 質問内容は、動的に生成されたものに対して、$().clickは使えないか?ということで、答えは.liveだと使えて、新しいバージョンだと.delegateや.onが推奨されるということでした。.liveで対応してなかったsubmitイベントに.delegateや.onでは対応してるみたいです。

rouge_2008さんのコメント
ご報告ありがとうございます。 .live()についても、1.4でsubmit等の未対応のイベントに対応済みのようです。 簡単に試してみただけですが、確かに動作しました。 http://semooh.jp/jquery/cont/doc/release_1.4.0/ >> ほぼ全てのイベントがLive Events対応 readyとfocus(代わりにfocusin> 利用を推奨)、そしてblur (代わりにfocusout利用を推奨)を除き、bind()でバインドできる全てのイベ ントがliveイベントで使えるようになりました。 .live()で実行される下記イベントのクロスブラウザサポートも実装したことを報告します。(change, submit, focusin, focusout, mouseenter, mouseleave) 前述の通り、focusとblurはバブリング処理に対応していないので、focusイベントを利用する場合は、focus/blurではなくfocusin/focusoutを使ってください。 << http://tech.kayac.com/archive/jquery-1.4-new.html >> 13. live()が全イベントに対応 以前までのバージョンのlive()はsubmitやfocusなど、対応してないないイベントもありましたが、今回全てのイベントに対応したようです。ただしfocus、blurはfocusin、focusoutを指定する必要があります。 <<
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ