0

我有一个关于 jQuery 的 live() 函数的问题。

我正在编写一个论坛。一旦有人发布内容并点击回车,jQuery 就会附加其他帖子并插入一个用于评论的文本区域,以下事件处理程序适用于该文本区域:

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

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

我知道使用 live() 函数可以保留功能。但是,如您所见,点击回车时帖子被提交,没有涉及任何按钮。所以我想知道如何结合这些东西,即使用 live() 但没有 click: ?

仅供参考,发布内容的功能如下所示:

//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 的父元素,即comment textarea。我需要用id来解决吗?

谢谢 :)

4

2 回答 2

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 中删除,如果它被删除,事件也会被删除)。

PSe.which在 jQuery 中被规范化,这意味着它对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 回答