Jquery - не может нацелиться на нужный элемент с помощью $(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... Помогите?
Так могу ли я нацелиться
3 ответа
Вы не должны использовать 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, и вы не используете противный клик! Не проверено / нет гарантии.
Почти. Для того, чтобы сделать эту работу, вам нужно пройти в 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 раздел "context" для более подробной информации.
Я считаю, что все, что вам нужно было изменить в исходном коде, - это получить ссылку на 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!
}
});