2013-07-10 4 views
0

Я хочу использовать функцию прямого щелчка для своих кнопок, чтобы она работала над Ajax Loaded HTML, но потом я узнал, что новая версия для jQuery live click - $(".button").live("click", function() {...}) - это функция с .on().Как получить значение «this» внутри функции щелчка в jQuery

Поскольку в этом синтаксисе элемент находится внутри параметра, я не смог извлечь этот элемент, если мой элемент «это». Есть ли способ получить его?

$(".selection-item a").each(function(){ 
    var parent_selection = $(this).parents(".selection-item-wrapper"); 

    // $(this).click(function(){ //This is the original function which works fine EXCEPT on Ajax Loaded HTML 
    $(parent_selection).on("click",this,function(){ 
     $(".selection-item a",parent_selection).removeClass("active"); 
     $(this).addClass("active"); //This does not target my desired element which is $(".selection-item a")'s this 

     console.log($(this)); // The "this" value returns the parent_selection, I want it to return the particular "this" of $(".selection-item a") read from the .each() on top of my code 
    }); 
}); 

Это мой HTML. Я создаю простой выбор элементов. Что всякий раз, когда я нажимаю на тег привязки изображения, я добавлю «активный» класс, чтобы добавить css на нем с границами, чтобы проиллюстрировать, что выбран конкретный элемент.

<div class="selection-item-wrapper"> 
    <div class="selection-item"> 
     <a href="javascript:void(0);"><img src="img/image1.png"></a> 
     <h3>Item 1</h3> 
    </div> 
    <div class="selection-item"> 
     <a href="javascript:void(0);"><img src="img/image2.png"></a> 
     <h3>Item 2</h3> 
    </div> 
    <div class="selection-item"> 
     <a href="javascript:void(0);"><img src="img/image3.png"></a> 
     <h3>Item 3</h3> 
    </div> 
</div> 
+0

Вы также можете предоставить HTML-код? –

+0

@ChiragVidani Большое спасибо за ответ. Я обновил сообщение выше. – user2567536

ответ

0

Спасибо за ребят ответа! но теперь он работал без необходимости .each() ...Мы просто использовали следующее:

$(document).on("click",".selection-item a",function(){ 
    var parent_selection = $(this).parents(".selection-item-wrapper"); 
    $(".selection-item a",parent_selection).removeClass("active"); 
    $(this).addClass("active"); 
}); 
1

Вы можете делегировать click событие a элементов, а затем обратиться к тем, с помощью this:

$(parent_selection).on("click", "a", function(){ 
    // "this" will contain "a" element 
    var $this = $(this); 

    $(".selection-item a", parent_selection).removeClass("active"); 
    // Or maybe: $this.siblings("a").removeClass("active"); 

    $this.addClass("active"); // Add .active to "a" 
    console.log($this); 
}); 
+0

Спасибо за ответ, человек! Я попробовал вести консоль внутри и снаружи функции, о которой вы говорили. Но он не входит внутри $ (parent_selection) .on ("click", "a", function() { – user2567536

+0

Попробуйте это [demo] (http://jsfiddle.net/mishik/UEnyr/) – mishik

+0

OP is ajaxing , это не сработает. По какой-то причине люди думают, что .each поможет:/ –

0
$(".selection-item a").each(function(){ 
    var parent_selection = $(this).parents(".selection-item-wrapper"); 
    var that = this; // HERE 
    $(parent_selection).on("click",this,function(){ 
     $(".selection-item a",parent_selection).removeClass("active"); 
     $(that).addClass("active"); //This does not target my desired element which is  $(".selection-item a")'s this 

     console.log($(that)); 
    }); 
}); 
+0

Спасибо за ответ! Я действительно пробовал это, но все же значение «this» возвращает все элементы, указывающие на этот «.selection-item a " – user2567536

0

Попробуйте один

$(".selection-item a").each(function(i,el){ 
     var parent_selection = $(el).parents(".selection-item-wrapper"); 

     $(parent_selection).on("click",function(){ 
      $(".selection-item a",parent_selection).removeClass("active"); 
      $(el).addClass("active"); 
     }); 
    }); 
+0

Привет! Спасибо за ответ. То же самое с Kamil T, значение" el "возвращает все элементы, которые указывают на" .selection-item a ". :( – user2567536

1

Пока я не 100% конечно без html-разметки. Я немного смущен каждым.

В любом случае, я бы изменил функцию .on, чтобы более точно настроить элементы.

$('.selection-item').on("click","a",function(){ 
     $(".selection-item a").removeClass("active") 
     var myself = $(this); 
     myself.addClass('active'); 
     console.log($(this)); 
}); 

Обновлено

Вы говорите, что вам это нужно, чтобы работать на ajaxed разметке. Ну, .on будет работать только в том случае, если переключатель верхнего уровня: $('.selection-item-wrapper') был на странице загрузки.

Это НЕ РАБОТАЕТ, если вы пытаетесь связать .on с контентом ajax. Поэтому, если вы не дадите мне всю разметку до того, как я напишу вам вещи, я не смогу помочь. (Я могу, но это плохой поступок). Так что дайте мне весь код.

Так вот рабочий код:

$('.selection-item-wrapper').on("click","a",function(){ 
    $(".selection-item a").removeClass("active") 
    var myself = $(this); 
    myself.addClass('active'); 
    console.log(myself); 
    return false; 
}); 

Вот fiddle с рабочим примером.

Как примечание стороны, нет необходимости указывать url javascript:void(0);, когда у вас уже есть связанное с ним событие $('.selection-item').on("click". Поэтому вместо того, чтобы добавлять более сложные для поддержания js в коде, я добавил return false; в код. Существуют и другие способы предотвращения поведения ссылок по умолчанию, например, preventDefault(). Но для этой ситуации returning false в порядке.

+0

Что мне нужно в вашем коде? – mplungjan

+0

Saftey , короче, если вам нужны какие-либо блокировки, у вас все равно будет доступ к элементу с щелчком. Но также и для производительности. Если вы хотите манипулировать $ (это), у вас есть прекрасная сексуальная ссылка на него. –

+0

Конечно. Этот код я не вижу необходимости, и это остановит обсуждение n about _this_ в этом вопросе довольно красиво :) – mplungjan

0

Попробуйте с этим кодом

$('.selection-item').click(function(){ 
$('.selection-item').removeClass('active'); 
    $(this).addClass('active'); 
}); 

Проверить это demo

+0

он ajaxing. Это не сработает –

Смежные вопросы