2012-03-29 2 views
8

У меня есть DIV так:JQuery: Получить родительский элемент идентификатор кликнутого элемента

<div id="popupDiv1" class="popupDivClass"> 
    <a id="popupDivClose" class="popupCloseClass">x</a> 
</div> 

Когда я нажимаю на «х» (я хочу, чтобы запустить функцию JQuery под названием disablePopup(id);, где идентификатор является идентификатор coresponding popupDiv (у меня есть много popupDiv каждый со своей собственной кнопки X.

для того, чтобы сделать это, я осуществил следующие

$(".popupCloseClass").click(function (event) { 
    var buttonID = $(event.target).attr("id"); 
    var id = $(buttonID).closest("div").attr("id"); 
disablePopup(id); 
}); 

basicaly я получаю идентификатор popupCloseCl задница нажата, тогда я получаю идентификатор его родителя (соответствующий popupDiv) с помощью ближайшего метода. то я вызываю disablePopup.

Но это не работает.

Я даже попытался использовать метод var buttonID = $(buttonID).parent().attr("id");, но не работал.

Я также попытался var id = this.id;

Любая помощь очень ценится

Благодаря

+0

'buttonID' будет содержать строку' "popupDivClose" '. Если вы передадите это в jQuery, он будет искать все элементы с ** тегом name ** 'popupDivClose'. Селекторы идентификаторов начинаются с символа '#'. Но поскольку 'event.target' (или даже' this') уже указывает на нужный элемент, просто используйте '$ (event.target) .closest (...) ...' или '$ (this) .closest (...) ... '. Я рекомендую прочитать еще несколько учебников jQuery ... –

ответ

13

вместо использования closest вы можете использовать parent как это ...

var id = $(this).parent().attr("id"); 

Примечание Вы можете использовать ключевое слово this ссылаться на элемент, стартовавший событие. Поскольку у вас это есть, вы используете значение buttonID в качестве селектора элементов, которое будет иметь значение "popupDivClose" и без добавления # в начале оно не будет искать идентификатор, а скорее элемент тега, называемый «popupDivClose».

Если вы хотите продолжать использовать buttonID вы могли бы использовать эту строку кода, чтобы заставить его работать ...

var id = $("#" + buttonID).parent().attr("id"); 

Однако я предпочел бы написать целое событие, как так ...

$(".popupCloseClass").click(function (event) { 
    event.preventDefault(); 

    var id = $(this).parent().attr("id"); 

    disablePopup(id); 
}); 

Обратите внимание, что использование event.preventDefault(); гарантирует, что браузер не обработает естественное действие для ссылки (т.е.страница навигации) - хотя, в Chrome, по крайней мере, вы должны указать HREF значение для навигации в любом случае

Here is a working example

+0

Большое спасибо за четкие объяснения – Youssef

0

Вы должны сделать

$(".popupCloseClass").click(function (event) { 
    var id = $(this).closest("div").attr("id"); 
}); 

(вы также можете использовать $(this).parent().attr("id");), но используя ближайший безопаснее в случае вы меняете свою структуру html

+0

Обратите внимание, что 'parent()' будет возвращать только непосредственный родительский элемент и поэтому параметр селектора бессмыслен. вы можете использовать 'parent (selector)', который примет селектор и вернет всех родителей (вплоть до дерева), которые соответствуют селектору – musefan

+0

@musefan. Да, это бессмысленно, по моему опыту лучше использовать ближайший(), потому что вы обычно заканчивают модификацию html и разрывают код, который использует parent() –

+0

Хороший момент, чтобы сделать, определенно что-то для рассмотрения. Тем не менее, я еще не нарушил свой код таким образом ... опять же, я не слишком часто использую такую ​​функцию. – musefan

0

Это прекрасно работает:

$('a.popupCloseClass').click(function() { 
    var id = $(this).parent().attr('id'); 
});​ 

JSFiddle Demo

Вы должен просто использовать вместо того, как вы получаете идентификатор, а затем пытаетесь использовать его в качестве селектора (вам не хватало # bef руды ID):

0

Это должно работать:

$(".popupCloseClass").click(function (event) 
{ 
    var buttonID = $(this).parent().attr('id'); 
    disablePopup(buttonID); 
}); 
Смежные вопросы