JQuery не выбирает SELECT

Я извлекаю значения из параметров элемента «выбрать», используя метод JQuery blur(), но по какой-то причине он всегда извлекает значение selectedIndex = 0, а не выбранный мной selectedIndex.

Вот --> JSFiddle ‹-- По какой-то причине первая строка работает нормально (длина), но ни одна из другие ряды работают.

Введите число в любом текстовом поле (КРОМЕ ПЕРВОГО «ДЛИНА»), а затем выберите элемент в соседнем поле ВЫБОР, затем щелкните вне поля ВЫБОР.

Вы увидите, что код всегда выбирает значение option=0 в каждом элементе SELECT. И он также не может распознать мое свойство 'data-hid' как число (см. HTML в элементе текстового поля)

Кто-нибудь может помочь? Я застрял на этом уже день.

** Кроме того, по какой-то причине это работает только в JQuery 1.7.2, а НЕ в выпусках 1.9 (ему не нравится код «option: selected», кто-нибудь знает, как этот фрагмент может соответствовать последним выпускам?

$('select').blur(function() {

//Get the value of the option chosen
var unit = $(this + 'option:selected').val();

//If the selectedIndex is 0 then focus on the select and make the user chose a unit.
  if ($(this).prop('selectedIndex') == 0) {
      $(this).focus();
    return;
} else {


//Remove the 'd' in front of the 'select' element ID and you will have the ID of the   textbox
        var txt = "#" + $(this).attr("id").substr(1);

//Get the numerical value of the textbox
        var mval = parseFloat($(txt).val());

            if ($(txt).attr('data-hid') == "OFF") {
                var hid = mval / unit;
                $(txt).attr('data-hid', hid);
                 alert("hid = " + hid + "\nmval = " + mval + "\nunit = " + unit);
            }
            else 
            {
                var hid = $(txt).attr('data-hid');
                var newtxt = hid * unit;
                $(txt).val(newtxt);
            }
}
main();
});

person bagofmilk    schedule 01.03.2013    source источник


Ответы (3)


Почему бы вам просто не использовать $(this).val(), который дает вам выбранное значение выбранного элемента? Нет необходимости сначала специально получать элемент option.

http://api.jquery.com/val/

В документации даже так написано.

person Torsten Walter    schedule 01.03.2013
comment
Лол... все работает! Наверное, я слишком старался все усложнить. Спасибо - person bagofmilk; 01.03.2013

Если вы хотите получить значение выбора, то есть значение выбранной опции, правильный способ сделать это:

$(this).val(); // Inside the .blur "this" points to your select

Затем вместо проверки того, равен ли выбранный индекс 0, вы можете проверить, пусто ли значение, если оно пусто, в противном случае человек выбрал допустимое значение из вашего выбора.

Кроме того, в вашем скрипте html первая опция «выбрана», вам не нужно указывать это ключевое слово, чтобы первая опция работала по умолчанию, если ни одна из них не выбрана, тогда будет выбрана первая.

Кроме того, вы уверены, что хотите, чтобы это событие запускалось при размытии? не будет .change лучше соответствовать вашей цели. Из вашего описания «рабочий процесс» заключается в том, чтобы ввести число на входе, а затем выбрать единицу при выборе. Изменение срабатывает, как только пользователь выбирает значение, размытие срабатывает только тогда, когда выбранное поле теряет фокус.

person cernunnos    schedule 01.03.2013
comment
Я думал о .change, но как только пользователь вводит число и выбирает единицу измерения, это число блокируется. Если он хочет увидеть, во что преобразуется его значение (в другой единице), он может просто выбрать другую единицу. Если я сделаю .change - и пользователь случайно выберет единицу - тогда ему придется сбросить всю форму и начать заново. Метод размытия не идеален, но я думаю, что он работает лучше всего в этой ситуации. - person bagofmilk; 01.03.2013
comment
Я вижу, как только юнит выбран, он отправляется. Единственный способ, которым я могу думать, что это может быть лучше, чем .blur для этой ситуации, - это отделить отправку от выбора с помощью кнопки. - person cernunnos; 01.03.2013
comment
Истинный. Хотя я воспользуюсь вашим советом по поводу .change. Когда пользователь хочет увидеть, во что преобразуется его число, я буду использовать .change, но когда он впервые введет свое число, я оставлю .blur. - person bagofmilk; 01.03.2013

Эта строка неверна:

//Get the value of the option chosen
var unit = $(this + 'option:selected').val();

должно быть:

var unit = $(':selected', this).val();

Чтобы понять почему (кроме просмотра документации jQuery), попробуйте эту строку прямо под вашей функцией blur:

console.log(this + 'option:selected'); //outputs something like [object HTMLSelectElement]option:selected

Вы можете сделать что-то вроде:

console.log('#' + $(this).attr('id') + ' option:selected'); //outputs something like #mySelectBox option:selected

но теперь мы просто становимся немного смешными: D ... но, возможно, это поможет вам понять, как работает селектор jQuery, по крайней мере =0]

Ответ Торстена действительно правильный способ сделать это

person BLSully    schedule 01.03.2013
comment
На самом деле это должно быть var unit = $(':selected', this).val();, так как var unit = $(':selected', unit).val(); не сработает. - person j08691; 01.03.2013
comment
@ j08691: извините, опечатка. Сегодня утром еще недостаточно кофе. - person BLSully; 01.03.2013