2012-05-03 11 views
0

jQueryのlive()関数に関する質問があります。jQuery live() - 機能の損失 - クリックなしのライブ():enter key?

私はフォーラムをプログラミングしています。すぐに誰かのポスト何かとヒットを入力すると、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'); 

      } 
     }); 
    } 
} 

UPDATE 1:FYI

は、何かを投稿する機能は、このようになります私は罰金これに何か、記事を投稿するイベントハンドラを変更した

、まだ機能がありますではないが:

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

はUPDATE 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)); 
    } 
}); 

をそれが正常に動作しますが、また、コメントを()で使用する方がよいでしょう。私はこれを試しました:

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

しかし、それは動作しません - どのように? commentsDivはcommenttextの親要素であり、コメントテキストエリアです。私はIDでそれに対処する必要がありますか?

+1

FYIでは、jQueryはすでにイベントオブジェクトを正規化しているので、 '(e.keyCode || e.which) 'は必要ありません。ちょうど 'e.which'を使用してください。 More at http://api.jquery.com/category/events/event-object/ – Esailija

+0

'$(document).on( 'keyup'、 '.commenttext'、function(e){' –

+0

@Rocket – weltschmerz

答えて

2

.live :)

おかげであなたが望む任意のイベントだけでなく、click(でもカスタムイベント)で使用することができます。

$('.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から削除されないようにする必要があり、イベントがあまりにも削除されます)を使用する必要があります。

P.S. e.whichはjQueryで正規化されています。つまり、e.keyCode || e.whichです。

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

+0

投稿のテキストエリアはdiv #postDivにあるので、$( '#postDiv')。on()にする必要がありますか? – weltschmerz

+0

@Dennis:そうです、 –

+0

あなたが言ったようにコードを追加しました。(質問編集を参照してください)、それはうまく機能しますが、機能は追加されません... – weltschmerz

0

はテストされていないが、私は、これは... ...動作するはず疑いますか?

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

私はそれを試してみましたが、それはうまくいっていますが、機能を追加しませんでした... – weltschmerz

関連する問題