2012-03-15 2 views
0

Javascript

$.each(['#clk','#clk1'], function() 
    { 
     $(this).click(function() { 
      alert("click") 
     }); 
    }); 

HTML

<a href="#" id="clk">click me</a> 
    <a href="#" id="clk1">click me</a> 

Нет окно предупреждения при щелчке ссылки. ОБНОВЛЕНИЕ:
У меня более 1 идентификатора. Я показал только один, чтобы упростить эту проблему.

ответ

2

Чтобы получить значение объекта String, вам необходимо использовать String.toString().

Непонятно, зачем нужен массив селекторов, но здесь два решения;

Ваше решение с использованием String.toString();

// Array of strings to be used as element selectors. 
var selectors = ['#element1', '#element2']; 

// Using $.each() 
$.each(selectors, function() { 
    // String.toString() returns the value of the String object. 
    var $this = $(this.toString()); 

    $this.click(function() { 
     console.log('Clicked element(1) =', this.id || this); // DEBUG 
    }); 
}); 

альтернативное решение с использованием String.join();

// Using String.join() 
$(selectors.join(',')).click(function(event) { 
    event.preventDefault(); // This is to not follow the link 

    // Notice that "this" now referes to the current/clicked element 
    // and not any string value from the "selectors" array. 
    console.log('Clicked element(2) =', this.id || this); // DEBUG 
}); 

Смотрите мой demo.

Если вам действительно не нужен массив селекторов, я бы порекомендовал простой multiple selector;

$('#element1, #element2').click(function() { ... }); 
+0

+1 Я был удивлен, обнаружив, что 'this' был объектом' String', а не обычной строкой, но вы избили я к ответу. – Davy8

+0

+1.Приятно объяснить, почему это не сработало так, как было, но также. .join() 'вещь - более хорошая альтернатива (предполагая, что массив необходим по какой-то другой причине). – nnnnnn

2

Вы могли бы еще больше упростить его:

$("#clk").click (function() { 
    alert("click"); 
}); 
+0

Мне нужно прикрепить события к нескольким селекторам. Я показал проблему упрощенным способом. – user1201705

1

Во-первых, почему вы используете foreach конструкцию при переборе над идентификатором? Когда вы используете и id, предполагается, что это ТОЧНО ОДИН элемент с данным идентификатором. Таким образом, это должно быть прекрасно:

$("#clk").click(function() { 
    alert("click"); 
}); 

Во-вторых, каждый перебирает массив, ваш массив является #clk. Просто строка, ничего больше. Вся ваша функция получает два параметра: 0' (the index of the element) and the string # clk` (значение в этом индексе). Строка НЕ ​​разрешена для объекта JS.

+0

Во-первых, OP не выполняет итерацию по идентификатору, OP выполняет итерацию по массиву, который содержит идентификатор - дубликатов нет. Во-вторых, при вызове функции обратного вызова jQuery устанавливает 'this' значение текущего элемента массива, завершенного как объект, если он еще не был. Таким образом, строка IS передается объекту JS. См. [Doco] (http://api.jquery.com/jquery.each/). (Код OP не работает, потому что строка должна быть снова распакована для использования в качестве селектора.) – nnnnnn

0

IMO, чистый способ решить вашу постановку задачи будет:

$("a[id^='clk']").click(function() { 
     alert("click"); 
}); 

Селектор ^= бы выбрать все якоря, идентификатор начинается с «CLK» и связать функцию щелчка, чтобы все те, , Вы можете узнать больше об этом селекторе here

+0

Это довольно приятное решение, учитывая, что ваше идентификационное имя соответствует следующему. Благодарю. Хотя еще не может +1. – user1201705

+0

Использование CSS-классов представляется более подходящим. – Stefan

+0

@Stefan: Я согласен, использование css-классов было бы более уместным.^= Особенно полезен для таких атрибутов, как имя и т. Д. –

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