Profile

coolwolf0: (Default)
coolwolf0

September 2025

S M T W T F S
 1 2345 6
78910111213
141516 17181920
21 2223 24252627
282930    

Custom Text

Jun. 11th, 2022

Только я затронул тему "таинственного" поведения программ, как буквально сегодня "стрельнуло" в совсем неожиданном месте.
Итак, есть веб-страничка, генерируемая пе-ха-пе на стороне сервера, и на страничке имеются кнопки/ссылки вызывающие некую JavaScript функцию. Функция быстро-быстро что-то делает и обновляет страничку, дабы показать результат. Всё работало, пока не купила баба порося: захотелось мне перед выполнением функции переспросить пользователя, мол "ты точно уверен?".

Пруф-оф-концепт прекрасно отработал на одной веб-страничке и я смело перенёс тот же код на другую страничку с похожим функционалом. И вот тут началось: открывается окно, и сколько бы я ни кликал кнопку "отмена" - окно открывается снова и снова!
Что за фак, подумал я, и вставил отладочные печати в JavaScript код. Результат вышел просто феерический: по клику функция "переспросить" вызывалась снова, как в сказке про белого бычка! Попытки как-то стрейсить эту засаду не дали ничего: стек содержит какой-то анонимный источник, явно не из жабаскрипта.

Что делать? Не бросать же работающий прототип в топку. Я начал с другого конца, открыл DOM-модель и начал искать вызовы функции там. Что же обнаружилось? Тихий ужас: ссылки на пресловутый коллбек были расставлены буквально на всех уровнях DOM, начиная с основной кнопки-ссылки. По крайней мере стало ясно, откуда сдох бобик: куда бы я ни кликнул, соответствующий объект внезапно обнаруживал у себя onclick-событие и отрабатывал его вызовом многострадальной функции с открытием модального окна. Первой мыслью был некий вирус (ага, в собственном коде, генерируемом к тому же на пе-ха-пе со стороны сервера). По трезвому размышлению я отверг бредовый вариант, внимательно посмотрел на HTML-код и ... обмер: у тега <a href="..."> не было закрывающей части! Вот такой лес, без деревьев! А поскольку HTML - не язык программирования, там непарные конструкции - не более, чем причуда клиента, поэтому браузер прикидывается ветошью и ... продолжает отрабатывать незакрытый тег! В результате доблестная DOM-модель продолжила считать ссылкой весь код после пресловутой кнопки. Ну как тут не ругнуться на всех известных языках!?

Expand Cut Tags

No cut tags

Style Credit