jQuery фильтрует по идентификаторам, а затем фиксирует совпадения

StackOverflow https://stackoverflow.com/questions/1059595

Вопрос

Я ловлю себя на том, что делаю это неоднократно.

$jq("button").filter(function(){
    return this.id.match(/^user_(\d+)_edit$/);
}).click(function(){
    var matches = this.id.match(/^user_(\d+)_edit$/);
    var user_id = matches[1];

    alert('click on user edit button with ID ' + user_id);
});

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

$jq("button").filter(function(){
    return this.id.match(/^user_(\d+)_edit$/);
}).click(function(){
    var user_id = some_magic_variable;

    alert('click on user edit button with ID ' + user_id);
});

Спасибо.

Это было полезно?

Решение

Как насчет того, чтобы избежать первого матча?

$jq("button[id^=user][id$=edit]").click(function() {

});

Бы выбрать все кнопки, у которых есть идентификатор, который начинается с пользователь и заканчивается на Редактировать.

Хотя, честно говоря, глядя на ваш вариант использования, было бы намного лучше просто присвоить всем кнопкам, которые предназначены для редактирования пользователя, класс "edit_user", а затем просто выполнить:

$jq('button.edit_user').click(function() {

});

Это более чистый, быстрый и jQuery-способ получения всех элементов, которые служат аналогичной цели.

Что касается получения идентификатора пользователя, то на этом сайте было оживленное обсуждение пользовательских атрибутов (Пользовательские атрибуты - Да или нет?) и я лично делаю data-userid='5' в моих элементах, а затем просто сделайте var id = $(this).attr('data-userid'); чтобы получить удостоверение личности.Красиво и легко.Однако он не будет проверяться как XHTML.

Другие советы

Вы могли бы сохранить идентификатор в самом элементе (используя jQuery данные метод), когда вы выполняете фильтрацию, а затем извлекаете это значение в обработчике щелчков.

$jq("button").filter(function(){
    var $this = $jq(this);
    var matches = $this.attr('id').match(/^user_(\d+)_edit$/);

    if (matches) {
        $this.data('idNumber', matches[1]);
    }

    return matches;
}).click(function(){
    var user_id = $(this).data('idNumber');

    alert('click on user edit button with ID ' + user_id);
});

Лично я бы предварительно обработал DOM:

$(function() {

$("button").each(function() { 
      var matches = $(this).attr("id").match(/^user_(\d+)_edit$/);

      if (matches) {
         $(this).data("user_edit_id",matches[1]);
      }
   }
});

Тогда вы можете просто:

$("button").filter(function(){
    return $(this).data("user_edit_id");
}).click(function(){
    var user_id = $(this).data("user_edit_id");

    alert('click on user edit button with ID ' + user_id);
});

Это не идеальное решение для того, чего вы хотите, но это один из способов...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top