2012-01-27 20 views
1

可能重複定位適當的元素:具有
$(this) doesn't work in a function

林在我的代碼針對右元素的問題。我在我的頁面上有一張縮略圖列表,當您點擊「我不喜歡這個」圖標時,目標視頻會更改爲另一張。

這裏的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> 

Ajax是:

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純紅」)不是「工作」。 (我嘗試了背景顏色和顏色)我沒有看到任何東西。

$(這個)是指「a」標籤,其中函數被調用的權利?所以即時通訊尋找他的父母叫videobox ...幫助?

這樣我就可以瞄準

回答

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討厭!未經測試/無保修。

+1

的問題是'this'撒謊。查看鏈接的副本。 – 2012-01-27 16:18:23

+0

Dunhamzzz,它不工作! :( – Lelly 2012-01-27 16:19:56

+0

@RébeccaO'Briennow now。 – Dunhamzzz 2012-01-27 16:30:26

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節「上下文」。

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