jQuery live() - 功能丢失 - live()没有点击:但输入密钥?

时间:2012-05-03 20:00:31

标签: jquery

我对jQuery的live()函数有疑问。

我正在编写一个论坛。一旦有人发布了某些内容并且点击了输入,jQuery会附加其他帖子,并为注释插入一个textarea,以下事件处理程序适用于:

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

然后调用发表评论的功能 - 至少它应该是。对于旧帖子,它可以正常工作,但不适用于刚发布和附加的帖子。

我知道可以使用live()函数保留功能。但是,正如您所看到的,在点击输入时提交帖子,没有涉及按钮。所以我想知道如何组合这些东西,即使用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()必须是实时的。 我现在有以下两个功能:

//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));
    }
});

但它不起作用 - 怎么样? commentsDiv是commenttext的父元素,它是注释textarea。我需要用id来解决它吗?

谢谢:)

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

未经测试,但我怀疑......应该......工作吗?

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