Передача объекта HTMLInputElement в качестве параметра функции

#javascript #jquery

#javascript #jquery

Вопрос:

Я пытаюсь передать элемент DOM в функцию, но безуспешно. FireBug сообщает о следующей проблеме:

 SyntaxError: missing ] after element list
LlenarDetalleReserva([object HTMLInputElement]); return false;
  

Селектору необходимо динамически добавлять несколько атрибутов по мере его создания.

Я пробовал следующее:

 $('#mySelector').attr({'onkeydown' : 'intOrFloat(event,this.value);', 'onchange' : 'LlenarDetalleReserva('  $.trim($('#cant_r_'  vectorid[2])[0])  '); return false;'});
  

Чего мне здесь не хватает? Что вызывает эту ошибку?

Заранее спасибо.

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

1. Зачем вам использовать attr для установки onkeydown и onchange? $('#mySelector').on('keydown', function(){}).on('change', function(){}) или $('#mySelector').on({keydown: function(){}, change: function(){}}); они не должны быть атрибутами. Половина вашей проблемы заключается в том, что у вас JS в строках, поэтому вы не можете легко увидеть синтаксические ошибки.

2. Что, как ожидается, должно быть в $.trim($('#cant_r_' vectorid[2])[0]) , кроме [object HTMLInputElement] строки? И не должно ли это быть $.trim($('#cant_r_' vectorid[2])[0].value) на самом деле?

3. Пожалуйста, покажите, как vectorid создается дамп того, что он содержит, и функцию LlenarDetalleReserva

4. Popnoodles, я был бы рад некоторым отзывам или предложениям о том, как вы могли бы это изменить (относительно attr()) 🙂 raina77ow, это элемент DOM, который я хочу передать в качестве параметра object HTMLInputElement

5. @entiendoNull хорошо, я дал предложение / правильный метод в своем комментарии. просто потратьте минуту на чтение этой страницы api.jquery.com/on

Ответ №1:

Пожалуйста, не делайте этого. Используется on() для привязки события к элементу. Никогда не устанавливайте его в качестве атрибута напрямую.

 $('#mySelector')
    .on('keydown', function(event) 
    {
        intOrFloat(event, this.value);
    })
    .on('change', function(event) 
    {
        if (vectorid amp;amp; vectorid[2] != undefined)
        {
            var element = $('#cant_r_'  vectorid[2]);

            if (element.length > 0)
            {
                LlenarDetalleReserva(element); 
            }
        }

        return false;
    });
  

Приведенный выше код (полный if s) создан для того, чтобы избежать исключений во время выполнения. Это то, что я бы сделал в вашем случае. Кроме того, я действительно не знаю, что вы пытаетесь получить в этой $.trim() функции, но, похоже, вы хотите получить элемент и передать его в виде строки. В приведенном выше коде вместо этого он передается по ссылке.

Обновить:

Чтобы ответить на вопрос OP о том, почему я не должен устанавливать атрибут напрямую, я не говорил вам, что вы не можете добавить атрибут напрямую, но обработчик событий в качестве атрибута.Я не могу сказать, что происходит в фоновом режиме движка, так что на самом деле, это работает с добавлением атрибута as. Но это не лучшая практика, и это часть ненавязчивого подхода.

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

1. Что ж, это сработало почти идеально. Я внес несколько изменений в ваш код. Должен ли я отредактировать ваш пример с кодом, который это сделал? $.trim() был просто отчаянной попыткой найти здесь решение. Не могли бы вы объяснить, почему я не должен устанавливать атрибут напрямую! Спасибо!!

2. @entiendoNull Я видел ваш обновленный код. Чувак, не используй массивы напрямую, как ты делал в селекторе элементов. Если он возвращает пустое значение, вы получите ошибку времени выполнения.

3. Спасибо за ваш вклад. Но, поскольку селектор является динамическим, я не вижу здесь другого пути?