Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi for PHP > Проблема с jquery


Автор: SHtoRM 03.03.14, 11:28
Добрый день, подскажите по следующей проблеме:
есть edit есть button
на кнопку вешаем событие onclick по которому меняем содержимое edit
$("#testedit").attr("value","22222222");
содержимое меняется, но только 1 раз. Что за глюк ?

И вообще, как можно отлаживать скрипты? Ни в редакторе, ни в браузере (фаербаг для хрома) ошибки жаваскрипта почему-то не отображаются ((

Автор: Zafod Biblebox 03.03.14, 13:13
1) Удаляешь файребаг для хрома
2) Нажимаешь f12 (или Ctrl+Shift+I) и используешь отладчик вебкита

Объясню почему: Это примерно как скачать хром тот же и поставить на него плагин, который превращает его в ИЕ6 - во-первых костыль, во-вторых настолько же бессмысленно. Отладчик вебкита на порядок превосходит файрбаг-плагин в плане функциональности ;)

Т.е. из этого следует что:
1) Либо файрбаг глючит (т.к. костыль)
2) Либо не проставил в нём фильтр "отображать ошибки JS"
3) Либо ошибок просто нет.

Если считаешь, что ошибки всё же есть - предлагаю для начала поставить точку останова на изменение атрибута нужного элемента (правой кнопкой в Elements по нужному элементу - id="testedit"). Затем смотреть, срабатывает ли эта точка останова.

Автор: SHtoRM 03.03.14, 13:29
Zafod Biblebox
всё, с отладкой разобрался, родной отладчик ошибки видит, спасибо.
А вот с событием по прежнему засада. Первый раз оно срабытывает, содержимое едита меняется, но если в нём после этого дописать или изменить что-то, то больше ничего не меняется

Автор: Zafod Biblebox 03.03.14, 13:47
Каждый DOM элемент передаётся по ссылке. Возможно после каких-либо манипуляций - ссылка исчезает (т.е. операции над элементом уходят в пустоту). Т.е. мы имеем совершенно другой DOM элемент. Предлагаю после манипуляций открыть консоль и набрать:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    document.getElementById('testedit');
    // или можно так
    $('#testedit')[0];


После этого должен вернуться DOM элемент (он отображается как тег в консольке). При наведении не него в консольке, если ссылка указывает верно - должен подсветиться соответствующий элемент в панельке Elements.

Что бы отобразить одновременно консоль и список тегов - надо перейти на вкладку "Elements" и жмякнуть по иконке (справа-сверху) ">E" (угловая стрелка с тремя горизонтальными линиями).

Автор: SHtoRM 04.03.14, 06:36
Zafod Biblebox
Сделал всё как вы сказли, ссылка указана верно, элемент подсвечивается, да и не могло быть по-другому.
Более того, заметил следующее:
Если до того как нажать кнопку с событием в эдит что-то написать, то событие вообще не выполняется. Если ничего не писать в эдит, а сразу нажать кнопку, всё как выше - меняется value 1 раз, дальше если что-то менять ничего не происходит. Попробуйте пожалуйста сделать этот простой пример у себя. Тут либо глобальный глюк, либо у меня уже что-то не так у меня :wall:
Исходные данные - html5builder, серверный проект, пустой эдит, кнопка button тип normal и событие javascript на кнопку онклик $("#testedit").attr("value","22222222222222222");
при этом меняйте вручную содержимое эдита и смотрите будет работать после этого событие onclick или нет ...

Автор: Zafod Biblebox 04.03.14, 09:10
у меня нет билдера =) но он будет меняться. Пока я не знаю в чём может быть проблема

Автор: SHtoRM 04.03.14, 09:26
Если я напишу ручками аналогичный код на чистом html + javascript + jquery он тоже будет работать как надо, а тут шляпа какая-то. Ладно бы вообще не срабатывало событие, но ведь срабатывает ОДИН раз, и то если инпут до этого не трогать. После внесения какиих-либо значений в инпут $("#testedit").attr("value","22222222222222222"); уже не срабатывает

Автор: Zafod Biblebox 04.03.14, 12:14
Ну проблема может быть где угодно, т.к. чистый код работает: http://jsfiddle.net/GZMnW/ Может JQuery старый у вас?

Автор: SHtoRM 05.03.14, 06:55
Разобрался с вопросом. Вот здесь похожая ситуация была
https://toster.ru/q/35177

оказалось вот что

Attributes vs. Properties
The difference between attributes and properties can be important in specific situations. Before jQuery 1.6, the .attr() method sometimes took property values into account when retrieving some attributes, which could cause inconsistent behavior. As of jQuery 1.6, the .prop() method provides a way to explicitly retrieve property values, while .attr() retrieves attributes.


В ваших примерах с attr кстати такая же беда как и у меня была. Значение только 1 раз меняется. При использовании prop вместо attr всё работает как надо.

Добавлено
А на старых проектах стоял старый jquery и там всё работало нормально с attr, поэтому у меня чуть мозги и не закипели. Надо лучше следить за обновлениями )))

Автор: Zafod Biblebox 05.03.14, 09:15
Только что перепроверил свой же пример. А ведь действительно меняется только один раз. Вот я слепой :lol:

Добавлено
ой, опечатался в рейтинге, надеюсь простишь :D Действительно интересная информация, спасибо

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)