为什么"这个"具有与命名选择器不同的行为

时间:2014-03-16 08:53:51

标签: jquery

我不是jquery的专家,我已经使用了几个星期。所以,对不起,如果我的问题对您来说显而易见。

我创建了一个工作正常的jquery脚本。

<script>
    $(document).ready(function() {
        $("#comment<?php echo $data['id']; ?>").click(function(e) {

            $("#comment<?php echo $data['id']; ?>").prop('disabled', true);

            if ($("#comment<?php echo $data['id']; ?>").val() == 'Comment') {

                $.ajax({
                    type: "POST",
                    url: "<?php echo Yii::app()->createUrl('comment/create', array('post_id' => $data['id'])); ?>",
                    success: function(data) {
                        $("#comment<?php echo $data['id']; ?>").after(data);
                        $(".form").slideDown(2000);
                    }                          
                });
            } else {

                $.ajax({
                    type: "POST",
                    url: "<?php echo Yii::app()->createUrl('comment/delete', array('post_id' => $data['id'], 'user_id'=> Yii::app()->user->id)); ?>",
                    success: function(data) {
                        $("#comment<?php echo $data['id']; ?>").prop('disabled', false);
                    }
                });
            }
</script>

我想替换
所有$("#comment<?php echo $data['id']; ?>") $(this).

当我这样做时,它不能按预期工作。例如,在if语句中,

$("#comment<?php echo $data['id']; ?>").val() == 'Comment'

它转到else部分并运行delete操作而不是create

*新信息

html页面中的按钮包含以下内容

<p><input type ="button" id="comment<?php echo $data['id']; ?>" 
     value="<?php echo isset($comment_exist) ? 'Comment' : 'Cancel my Comment'; ?>"></p>

提前感谢您的帮助

2 个答案:

答案 0 :(得分:1)

要了解$(this),请先了解this

函数this内的

是对该函数的对象上下文的引用。在任何函数之外,它指的是全局范围,在Web浏览器中,它是window对象。

那么,

$(this)只是this的jquery包装器。

您在功能上下文的内部和外部使用this

1)您的第一个案例没有任何功能背景 - 您已进入全球范围,this无法满足您的需求 - 所以您和&#0} #39;我需要做这样的事情:

 $('[id^="comment"]').click(function(e) {...

然后,这将为任何ID为&#34; comment&#34;,like,&#34; comment_23&#34;的元素设置一个点击处理程序。或&#34;评论A&#34; ......

2)第二种用法,就在点击处理程序中,应该可以使用简单的替换 - 您只需要对单击的对象进行引用。在点击处理程序中,this

if ($(this).val() == 'Comment') { ...

3)现在,ajax成功回调中的用法是另一个问题。在那里,设置了一个新的对象上下文 - this引用了ajax对象。因此,在进入ajax函数之前声明对外部this的引用:

var $thisClicked = $(this);

然后在成功回调中使用此引用,例如:

   var $thisClicked = $(this);

   $.ajax( ....

                success: function(data) {
                    $thisClicked.after(data);
                    $(".form").slideDown(2000);
                }

答案 1 :(得分:0)

正如其他用户所提到的,可能无法正常工作

我花了一些时间来了解范围和闭包如何在javascript上运行。看看http://jsfiddle.net/L5qna/,它可能会对你的道路有所启发。

在你的情况下,我会做类似

的事情
<script>
    $(document).ready(function() {
        var myElement = $("#comment<?php echo $data['id']; ?>");
        $(myElement).click(function(e) {

您应该可以在 ready 功能中的任何位置使用 myElement ;和在其中定义的函数