Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему функция то срабатывает то нет (https://javascript.ru/forum/misc/46774-pochemu-funkciya-srabatyvaet-net.html)

borus 23.04.2014 16:16

Почему функция то срабатывает то нет
 
Здравствуйте!

Объясните, пожалуйста, почему в этом случае функция $('span.addtocart-button').on('click', function() ... срабатывает при клике на кнопку "Добавить в корзину",
а в этом
- нет.

Makarov 23.04.2014 16:56

Функция срабатывает в обеих случаях, проблема в условии дальше.

Функция .text() возвращает объединенный текст элементов которые вы выбрали.

$(".baget_select option:selected")
вернет вам два элемента во втором случае, один - в первом, соответствено во втором случае .text()
вернет вам "Выберите багетВыберите багет"

borus 23.04.2014 17:40

Ясно. Благодарю. Вот рабочий вариант http://jsfiddle.net/mrnobody/rErNh/6/

borus 16.09.2014 11:15

Здравствуйте.

Подобная ситуация. На странице никак не вызывается обработчик
$('span.addtocart-button').on('click', function(){...

в этом файле на 40-й строке. Скажите, пожалуйста, почему?

tsigel 16.09.2014 11:23

borus,
Вы где-то перезаписываете этот элемент (вероятно в момент добавления второй кнопки).
Я при создании обработчика дабавил его в глобальную переменную "window.a", а после создания страницы сравнил его с элементом найденным по тому же селектору и мне выдало "false", что означает что это не тот элемент на который вы вешали обработчик.

borus 16.09.2014 11:30

Цитата:

Сообщение от tsigel (Сообщение 330797)
borus,
Вы где-то перезаписываете этот элемент (вероятно в момент добавления второй кнопки).
Я при создании обработчика дабавил его в глобальную переменную "window.a", а после создания страницы сравнил его с элементом найденным по тому же селектору и мне выдало "false", что означает что это не тот элемент на который вы вешали обработчик.

то есть это работает так: создается элемент, ему задаётся злополучный обработчик, а потом каким-то скриптом кнопка пересоздаётся и обработчика уже нет?

tsigel 16.09.2014 11:31

Цитата:

то есть это работает так: создается элемент, задаётся ему злополучный обработчик, а потом каким-то скриптом кнопка пересоздаётся и обработчика уже нет?
Да, именно так.

borus 16.09.2014 11:33

а как отследить местонахождение скрипта, который делает эту шутку?

tsigel 16.09.2014 11:43

borus,
Не, я был не прав. Там у инпута стоит disabled, его убираю и все работает

borus 16.09.2014 11:56

tsigel,
странно, я убираю disabled у input.addtocart-button, нажимаю на "Добавить в корзину" и возникает окно о том, что добавилось, но скрипт призванный проверить, выбрано ли что-то в селекте не срабатывает. По крайней мере отладчик не останавливается внутри обсуждаемого обработчика на его первой строке:
var $elSelect = $(this).parent().prev().find('.baget_select');

Вопрос прежний, почему отладчик не попадает внутрь обработчика, т.е. почему обработчик не работает? :)

tsigel 16.09.2014 12:03

Воу!
http://stackoverflow.com/questions/3...disabled-input
По ходу задизейбленный элемент не пускает всплытие событий!

borus 16.09.2014 13:07

Цитата:

Сообщение от tsigel (Сообщение 330812)
Воу!
http://stackoverflow.com/questions/3...disabled-input
По ходу задизейбленный элемент не пускает всплытие событий!

я к span-у прицепляю обработчик, который уже содержит в себе задизэйбленный input. По идее это похоже на совет, который дается по Вашей ссылке, состоящий в том, чтобы прицеплять обработчик к элементу, который будет поверх input. Есть какая-то принципиальная разница в том, как я это делаю?

tsigel 16.09.2014 13:11

Цитата:

я к span-у прицепляю обработчик, который уже содержит в себе задизэйбленный input. По идее это похоже на совет, который дается по Вашей ссылке состоящий в том, чтобы прицеплять обработчик к элементу который будет поверх input. Есть какая-то принципиальная разница в том как я это делаю?
Цитата:

$("div > div").click(function (evt) {
$(this).hide().prev("input[disabled]").prop("disabled", false).focus();
});​
Да, там говорится о том что событие придется вешать не на родительский элемент, а на "брата" лежащего на тех-же координатах. Потому что задизейбленный инпут не пускает всплытие (делегирование) событий и на родителе оно не происходит.

Внимательно посмотрите пример, там див который в верстке лежит рядом с инпутом а по стилям - точно сверху.

borus 16.09.2014 13:26

Цитата:

Сообщение от tsigel (Сообщение 330824)
Да, там говорится о том что событие придется вешать не на родительский элемент, а на "брата" лежащего на тех-же координатах. Потому что задизейбленный инпут не пускает всплытие (делегирование) событий и на родителе оно не происходит.

Внимательно посмотрите пример, там див который в верстке лежит рядом с инпутом а по стилям - точно сверху.

Спасибо.
По-моему, там говорится о том, что можно вешать на контейнер для большинства браузеров, за исключением FF:
" Most browsers will propagate an event originating from the disabled element up the DOM tree, so event handlers could be placed on container elements"
но в Хроме как выходит не работает
Попробую как в примере.
Странно. Такое ощущение, что Хром или все браузеры разом изменили подход к отключенным инпутам. Ведь раньше работало. Либо действительно есть скрипт, который пересоздает кнопку... Истина, приди к нам :)


Часовой пояс GMT +3, время: 00:27.