Ошибка jQuery в IE8 — .val() или trim()?

#jquery #internet-explorer-8

#jquery #internet-explorer-8

Вопрос:

Я получаю ошибку jquery в отладчике IE8, но я не уверен, какая функция является ее причиной. Я видел здесь целую кучу сообщений, в которых говорится, что IE8 не поддерживает встроенную trim () , но я не (я не думаю) использую встроенную версию (я унаследовал этот код; это не то, что я написал с нуля.)

Вот фрагмент, который вызывает проблемы — это часть функции click:

 greenlight = false;
link = $(this);
href = $(this).attr("href");
row = $(this).parent().parent();
if ($(":text", row).exists()) {
    new_email = jQuery.trim($(":text", row).val());
        //do stuff here

}
  

Ошибка, которую я получаю в отладчике, находится в строке, начинающейся с new_email; ошибка «Объект не поддерживает это свойство или метод».

Кто-нибудь может помочь мне выяснить 1) какое свойство или метод IE8 не поддерживает, и 2) что я могу сделать, чтобы это исправить? Я никоим образом не эксперт по jquery; Я на 99% на стороне сервера.

Код действительно работает в Chrome, Safari и Firefox.

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

1. Нам было бы намного проще помочь вам, если бы вы могли воспроизвести проблему на общедоступной странице или на jsfiddle.net . Кроме того, номера строк в ошибках IE JavaScript часто вводят в заблуждение, попробуйте запустить свой код с помощью отладчика IE Developer Tools и установите точку останова.

2. Я запустил код с помощью инструментов разработчика и установил несколько точек останова — одну в строке непосредственно перед той, на которую ссылается ошибка, и одну в строке после нее. Он прошел мимо первого и взорвался перед вторым. И я понимаю необходимость кода в целом, но это часть огромного сайта на Drupal, где повсюду разбросаны фрагменты кода. Нет простого способа извлечь что-либо, что могло бы повлиять на ситуацию.

Ответ №1:

Обновление: Из-за новой информации, я думаю, вы столкнулись с проблемой с IE, где у вас будет конфликт, когда у вас есть переменная и элемент, идентифицированный с тем же именем, это вызовет конфликты и запутанные сообщения об ошибках о том, что функциональность не завершается. Смотрите эту ссылку для более подробного объяснения. http://www.karlstanley.net/blog/?p=5

Оригинальный ответ: Если у вас возникли проблемы с отладкой одной сложной строки, разделите ее на части,

 var tempValue = $(":text", row).val();
new_email = jQuery.trim(tempValue);
  

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

1. Хорошо, я попробовал это и использовал консоль. войдите в систему, чтобы распечатать значение tempValue. Он отображает то, что ожидалось. Тем не менее, я все еще получаю ошибку в следующей строке. И самое смешное, что в нем говорится, что ошибка связана с символом 4, который является подчеркиванием. Действительно ли IE может взорваться при подчеркивании в имени переменной?

2. По-видимому, это так; я просто изменил имя переменной с new_email на newEmail , и оно работает правильно. Я немного напуган, поскольку в этом приложении есть десятки функций, которые содержат переменные с подчеркиванием в именах.

3. Может быть, вы столкнулись с конфликтом именования между элементами dom и переменными javascript в IE? karlstanley.net/blog/?p=5

4. @Robert — ДА!!! Вот и все! Большое вам спасибо — я знал, что я не сумасшедший. Как я уже сказал, я унаследовал этот код, и есть фрагменты, с которыми я не так хорошо знаком, и действительно есть поле, скрытое далеко внизу огромной формы, с именем new_email .

5. @Роберт, если ты хочешь опубликовать этот комментарий в качестве ответа, я могу принять его, чтобы ты получил оценку…

Ответ №2:

Изменить:

 $(":text", row).exists()
  

Для:

 $(":text", row).length > 0
  

Насколько я знаю, в библиотеке jQuery нет exists() функции (пробовал искать ссылку на API).

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

1. Я попробую, но почему это должно работать в других браузерах, если это так?

2. Хм, ход моих мыслей заключался в том, что в прототипе объекта или массива была определена exists функция, а IE ее не реализовал, что совершенно неверно и не соответствует действительности. Остальная часть кода выглядит нормально, это была единственная сомнительная часть, я не могу объяснить, почему это работает в FF, потому что typeof $(':text').exists возвращает ‘undefined’

3. Нет, я попробовал ваше изменение и все еще получаю ту же ошибку в той же строке. Так что проблема не в exists() (или не только в этом).)

4. exists() это определенно не метод в jQuery. Даже если это не устранило проблему, сохраните изменения!