Используйте jQuery для выбора элемента с минимальным значением указанного атрибута

#jquery #asp.net #jquery-ui

#jquery #asp.net #jquery-пользовательский интерфейс

Вопрос:

Мне нужно использовать jQuery, чтобы установить фокус на элемент с минимальным значением указанного атрибута. Например, в этой разметке:

 <input type='text' data-myAttr='5' />
<input type='text' data-myAttr='3' />
  

Я хочу установить фокус на второй ввод. Это может быть выражено в C # для IEnumerable<T> элементов на странице следующим образом:

 List<DomElement> elements; //Assume this is full of page elements
DomElement minElement = elements.OrderBy(e => e.attr("data-myAttr")).First();
minElement.Focus();
  

Контекст заключается в том, что у меня есть веб-приложение (ASP.NET ) с участием нескольких различных модальных диалоговых окон jQueryUI, используемых для редактирования различных типов записей. Каждый из них имеет определенный порядок табуляции. В зависимости от разрешений на редактирование некоторые поля в некоторых модальностях заменяются текстом (метки вместо выпадающих списков или текстовых полей). Обычное поведение jQueryUI по умолчанию для фокусировки первого фокусируемого элемента в диалоговом окне не всегда работает для меня, поэтому мне нужно установить фокус на элемент в модальном с минимальным индексом табуляции.

Ответ №1:

Выполните итерацию по коллекции, найдите наименьшее значение и установите на него фокус следующим образом:

 function setDialogFocus() {
    var minValue;
    var minItem;
    $("input[type='text']").each(function() {
        var val = parseInt($(this).attr("data-myAttr"), 10);
        if (val amp;amp; (!minItem || val < minValue)) {
            minItem = this;
            minValue = val;
        }
    });

    if (minItem) {
        $(minItem).focus();
    }
}
  

Это также можно сделать .map() следующим образом:

 function setDialogFocus() {
    // get an array of all data attributes and their corresponding objects
    var map = $("input[type='text']").map(function() {
        var val = parseInt($(this).attr("data-myAttr"), 10);
        if (val) {
            return ({obj: this, value: val});
        }
    }).get();
    // sort by value to find the lowest value
    map.sort(function(a, b) {return a.value - b.value;});
    if (map.length > 0) {
        $(map[0].obj).focus();
    }
}
  

Комментарии:

1. Я надеялся на что-то столь же краткое, как методы IEnumerable<T> расширения, но это должно сработать.

Ответ №2:

Альтернативным подходом было бы клонирование и сортировка. Проще (например, короче), но потенциально больше накладных расходов, особенно если полей много.

 var firstField = $('input[data-myAttr]').clone().sort(function(a, b) {
  return parseInt($(a).attr('data-myAttr')) - parseInt($(b).attr('data-myAttr'));
}).first();