#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. Спасибо за ваш вклад. Но, поскольку селектор является динамическим, я не вижу здесь другого пути?