Подтвердить что ты не робот

JQuery 1.9.1 переключатель свойств

Фон

Как и в jQuery 1.9, метод .attr(..) больше не возвращает значения свойств, вместо этого мы теперь должны использовать .prop(..). К сожалению, это также относится к атрибутам, указанным с помощью селектора атрибутов i.e. $("input[value=]")

См http://jquery.com/upgrade-guide/1.9/#attr-versus-prop-

и хорошее обсуждение SO о различиях между .attr и .prop:

.prop() vs .attr()

Моя ситуация

В настоящее время я использую селектора типа $("input[value=]") и $("select[value=]") для выбора входных элементов, которые не имеют значения. Однако это больше не работает с jQuery 1.9, вместо этого я теперь делаю что-то вроде этого:

var hasValue = function () { return !!($(this).val().length); };
var hasNoValue = function () { return !($(this).val().length); };
$("input").filter(hasValue);
$("select").filter(hasValue);

Мои фактические селекторы немного больше, проверяя несколько элементов с или без значений, поэтому теперь мне нужно разделить 1 селекторную строку на несколько селекторов с помощью метода .filter(..) между вызовами.

Вопрос

Есть ли эквивалент $("[value=]"), $("[value!=]"), $("[value='abc']"), который использует свойство вместо атрибута? А если нет, есть ли более чистый способ, чем использование методов .filter(hasValue) и .filter(hasNoValue)?

Спасибо

4b9b3361

Ответ 1

Использование .filter кажется единственным способом, но это не так уж плохо, и вы можете сделать его немного точнее, используя .val:

$(":input").filter(function () { return $(this).val() === ""; });

Если это действительно предосудительно для вас, вы можете создать настраиваемый селектор.

$.expr[':'].emptyInput = function (elem) {
    return $(elem).is(":input") && $(elem).val() === "";
};

http://jsfiddle.net/ExplosionPIlls/zaZPp/

EDIT: вы также можете уйти с помощью this.value вместо $(elem).val().

Ответ 2

В соответствии с руководство по обновлению:

Однако, когда используется селектор типа "input [value = abc]", он всегда должен выбирать атрибут value, а не изменения, внесенные в свойство пользователем, например, из них вводя текст в текстовый ввод. Начиная с jQuery 1.9, это ведет себя корректно и последовательно. Раньше версии jQuery иногда использовали свойство, когда они должны были использовать атрибут.

Итак, это отвечает на ваш первый вопрос - нет прямого эквивалента, нужно использовать атрибут вместо свойства.

Ваш код кажется прекрасным, но если вы хотите быть более стандартизированным и повторно используемым, вы можете создать дополнительный фильтр. Например:

(function($) {
    $.expr[':'].hasValue = function(element) {
        var $element = $(element);
        return element.is(':input') && element.val();
    };
}(window.jQuery));

Это позволит вам выбрать такие вещи:

// Select input elements with value and select elements without value.
$('input:hasValue,select:not(:hasValue)');

И другие различные комбинации, которые вам нужны.

Ответ 3

Я наткнулся на это и просто хотел опубликовать другое решение, которое я нашел, что работает в некоторых ситуациях, когда некоторые из других предлагаемых решений не подходят.

Просто добавьте этот обработчик событий в свой код

    $('input').on('keyup', function(){  
        var value = $(this).val();
        $(this).attr('value', value);
    });