1

可能重复:
$(this) 在函数中不起作用

我在我的代码中定位正确的元素时遇到问题。我的页面上有一个缩略图列表,当您单击“我不喜欢这个”图标时,目标视频会更改为另一个。

这是HTML

<li class="videoBox recommended">
   <div class="spacer" style="display: block;"></div>
   <div class="features">
       <div>
          <a class="dislike_black" title="I dislike this" onclick="ThumbsDown(30835, 'relevance', '1');"></a>
       </div>
   </div>
   <a href="...">
   <h1>...</h1>
   <div class="information">...</div>
</li>

阿贾克斯是:

function ThumbsDown(id,sort,page) {
$.ajax({
    url: "/change/videos/"+id+"/thumbsdown/",
    type: "POST",
    data: {
        "sort": sort?sort:"",
        "page": page?page:""
    },
    success: function(data) {
        //$("#content .videoList ul li.videoBox").html(data); // THIS IS WORKING, but replaces ALL the divs
        $(this).parent("li.videoBox").html(data); // Cant get this to work!
    }
});

我在做什么错?甚至 $(this).css("border","1px solid red") 都不是“工作”。(我尝试了背景颜色和颜色)我什么也没看到。

$(This) 指的是调用函数的“a”标签吗?所以我正在寻找他的父母名为 videobox... 帮助?

所以我可以定位吗

4

3 回答 3

2

你不应该使用onclick,你应该将它绑定到一个事件,特别是如果用户没有 ajax,你可以很容易地让它降级。

<a>将您的标签更改为:

<a href="/change/videos/1/thumbsdown/"
    data-sort="sort"
    data-page="page"
    class="dislike_black"
    title="I dislike this"></a>

jQuery 事件:

$('.dislike_black').click(function(e) {
    e.preventDefault(); // Prevent link from clicking

    var $aTag = $(this); // I use $aTag to denote a jq object

    $.ajax({
        url: $aTag.attr('href'),
        type: "POST",
        data: {
            "sort": $aTag.data('sort'), // data-sort attr value
            "page": $aTag.data('page') // data-page attr value
        },
        success: function(response) {
            $aTag.closest(".videoBox").html(response);
        }
    });
});

现在它可以在没有 javascript 的情况下工作,而且你没有使用讨厌的 onclick!未经测试/无保修。

于 2012-01-27T16:17:30.190 回答
2

几乎。为了完成这项工作,您需要将 传递context.ajax()调用。

$.ajax({
    url: "/change/videos/"+id+"/thumbsdown/",
    type: "POST", 
    context: document.body, // for instance
    data: {
        "sort": sort?sort:"",
        "page": page?page:""
    },
    success: function(data) {
        //$("#content .videoList ul li.videoBox").html(data); // THIS IS WORKING, but replaces ALL the divs
        $(this).parent("li.videoBox").html(data); // Cant get this to work!
    }
});

上面的代码会导致所有 ajax 处理程序都this指向document.body. 所以你需要document.body用你正在寻找的元素替换。因此,例如,如果您以某种方式调用您的函数,click handler您只需调用即可context: this,魔术就完成了。

有关更多详细信息,请参阅jQuery Ajax Doc部分“上下文”。

于 2012-01-27T16:19:32.570 回答
0

我相信您需要更改原始代码的所有内容就是获取对this成功函数之外的引用,如下所示:

function ThumbsDown(id,sort,page) {
    var self = this
    $.ajax({
        url: "/change/videos/"+id+"/thumbsdown/",
        type: "POST",
        data: {
            "sort": sort?sort:"",
            "page": page?page:""
        },
        success: function(data) {
            //$("#content .videoList ul li.videoBox").html(data); // THIS IS WORKING, but replaces ALL the divs
            $(self).parent("li.videoBox").html(data); // Cant get this to work!
        }
    });
于 2012-01-27T17:40:24.827 回答