为什么jQuery parent()找不到我的元素?

时间:2013-03-11 12:51:49

标签: jquery jquery-selectors parent-child

我无法让这个(非常简单的)功能正常工作,parent()似乎找不到我想要的div并淡出它:(

$('.deleteButton').click( function() {

    var img = $(this).attr('href');
    img = "../"+img;

    var answer = confirm('Are you sure you want to delete this item? (This cannot be undone!)');
    if (answer) {

        $.ajax({
            url: 'scripts/deletePhoto.php',
            data: 'img='+img,
            type: 'POST',
            mode: 'abort',
            success: function(){
                $(this).parents("div.photo").fadeOut('fast');
            }
        });
    }
return false;
});

HTML

<div class="photo">
    <img alt="" src="../static/images/photos/tmp/1.jpg">
    <div class="overlay" style="opacity: 0;">
        <p class="process success message">
            <a href="process_photo.php?img=../static/images/photos/tmp/1.jpg">Process this photo</a>
        </p>
        <p class="delete error message">
            <a href="../static/images/photos/tmp/1.jpg" class="deleteButton">Delete image</a></p>
    </div>
</div>

我已尝试$(this).parents(".photo").fadeOut('fast');$(this).cloest("div.photo").fadeOut('fast');,但没有任何关联:(

4 个答案:

答案 0 :(得分:6)

这是一个范围问题。在来自ajax的success回调中,this并未引用您的想法 - 它实际上是指函数本身。

您应该在ajax调用之外缓存$(this)的副本,并使用:

$('.deleteButton').click( function() {
   var $img = $(this);

   //....//

   $.ajax({
        url: 'scripts/deletePhoto.php',
        data: 'img='+img,
        type: 'POST',
        mode: 'abort',
        success: function(){
            $img.parents("div.photo").fadeOut('fast');
        }
    });

   // ... //
}

答案 1 :(得分:3)

找不到对象的原因是因为$(this)未指向您认为指向的对象。 您在Ajax调用的回调函数中使用它,其上下文与click事件处理程序不同。

在进行Ajax调用之前将其粘贴到变量中,然后就可以了:

$('.deleteButton').click( function() {

    var img = $(this).attr('href');
    img = "../"+img;

    var answer = confirm('Are you sure you want to delete this item? (This cannot be     undone!)');
    if (answer) {

        var my_item = $(this);

        $.ajax({
            url: 'scripts/deletePhoto.php',
            data: 'img='+img,
            type: 'POST',
            mode: 'abort',
            success: function(){
                my_item .parents("div.photo").fadeOut('fast');
            }
        });
    }
return false;
});

答案 2 :(得分:2)

在click处理程序中,您必须保持对按下按钮的引用,否则{AJ}成功处理程序中将“覆盖”this

$('.deleteButton').click( function() {
    var img = $(this).attr('href'),
    $self = $(this);

    img = "../"+img;

然后,在成功处理程序中:

$self.parents("div.photo").fadeOut('fast');

顺便说一句,我建议在$.ajax电话中进行此更改:

data: 'img=' + encodeURIComponent(img),

这可以避免将错误的查询字符串发送到服务器端脚本。

答案 3 :(得分:1)

您需要缓存当前事件并使用这些变量。这是一个范围问题。

var currObj=$(this); cache the current event and use those variable. 

$('.deleteButton').click( function() {
var $currObj=$(this); // cache the current event. 
    var img = currObj.attr('href');
    img = "../"+img;

    var answer = confirm('Are you sure you want to delete this item? (This cannot be undone!)');
    if (answer) {

        $.ajax({
            url: 'scripts/deletePhoto.php',
            data: 'img='+img,
            type: 'POST',
            mode: 'abort',
            success: function(){
                $currObj.parents("div.photo").fadeOut('fast');
            }
        });
    }
return false;
});