0

jQueryのlive()関数について質問があります。

私はフォーラムをプログラミングしています。誰かが何かを投稿してEnterキーを押すとすぐに、jQueryは他の投稿を追加し、コメント用のテキストエリアを挿入します。これには、次のイベントハンドラーが適用されます。

//Comment on a post
$('.commenttext').keyup(function(e) {
    if (((e.keyCode || e.which) == 13) && !event.shiftKey) {
        comment($(this));
    }
});

次に、コメントを投稿する関数が呼び出されます-少なくともそうあるべきです。古い投稿の場合は正常に機能しますが、投稿して追加したばかりの投稿の場合は機能しません。

live()関数を使用して機能を保持することが可能であることを私は知っています。ただし、ご覧のとおり、Enterキーを押すと投稿が送信され、ボタンは必要ありません。だから私はこれらのものをどのように組み合わせるのか、つまりlive()を使用してクリックせずに:?

参考までに、何かを投稿する関数は次のようになります。

//Function to post
function post()
{
    //Get posttext and preserve line breaks
    var posttext=$('#posttext').val();

    //Ajax if posttext is not empty
    if(posttext!="")
    {
        $.ajax({
            //blablabla
            success: function(postid){

                //Prepend posts with the new post
                var newpost=posttext+'<br/><textarea id="commenttext'+postid+'" class="commenttext" placeholder=" Comment..."></textarea>';
                $(newpost).hide().prependTo('#postsDiv').fadeIn('slow');

            }
        });
    }
}

更新1:

これに何かを投稿するようにイベントハンドラーを変更しました。これは正常に投稿されますが、それでも機能はありません。

//Post something
$('#postDiv').on('keyup', '#posttext', function(e) {
    if ((e.which == 13) && !event.shiftKey) {
        post($(this));
    }
});

更新2:

今のところは機能します:)comment()とpost()の両方がライブである必要があることを知りませんでした。私は今、次の2つの機能を持っています:

//Post something
$('#postDiv').on('keyup', '#posttext', function(e) {
    if ((e.which == 13) && !event.shiftKey) {
        post($(this));
    }
});

//Comment on a post
$('.commenttext').live('keyup', function(e) {
    if (e.which == 13 && !event.shiftKey) {
        comment($(this));
    }
});

正常に動作しますが、コメントにはon()も使用することをお勧めします。私はこれを試しました:

$('.commentsDiv').on('keyup', '.commenttext', function(e) {
    if ((e.which == 13) && !event.shiftKey) {
        post($(this));
    }
});

しかし、それは機能しません-どうしてですか?commentDivは、コメントテキストエリアであるcommenttextの親要素です。IDで対処する必要がありますか?

ありがとう :)

4

2 に答える 2

2

.liveclick(カスタムイベントも)だけでなく、任意のイベントで使用できます。

$('.commenttext').live('keyup', function(e) {
    if (e.which == 13 && !event.shiftKey) {
        comment($(this));
    }
});

注:jQuery 1.7以降を使用している場合は、を使用せず、代わりに.live使用する必要があります.on

$(document).on('keyup', '.commenttext', function(e) {
    if (e.which == 13) && !event.shiftKey) {
        comment($(this));
    }
});

の代わりにdocument、最も近い親を使用する必要があります(ただし、この要素はDOMから削除する必要はありませんが、削除するとイベントも削除されます)。

PSe.whichはjQueryで正規化されています。つまり、 PSは自動的に正規化さe.keyCode || e.whichれます。

ドキュメント:http ://api.jquery.com/category/events/event-object/

于 2012-05-03T20:04:12.040 に答える
0

テストされていませんが、これは...うまくいくはずです...

$('.commenttext').live('keyup', function(e) {
  if (((e.keyCode || e.which) == 13) && !event.shiftKey) {
    comment($(this));
  }
});
于 2012-05-03T20:05:29.227 に答える