#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть пользовательский модальный диалог, который состоит из простого div и некоторого css. Есть 2 кнопки (OK, ОТМЕНА) кнопок. Кнопка ОТМЕНЫ всегда одна и та же; она скрывает модальный диалог через onclick="$('#div').css('display','none')"
(ПРИМЕЧАНИЕ: модальный диалог также отображается таким образом; ('display','')
). Я назначаю разные действия кнопке OK в зависимости от необходимости. Это делается через $('#okBTN').attr('onclick','my_function()')
.
Это работает, но только в первый раз ©
В первый раз, когда я открываю модальный и прохожу по шагам, все работает так, как ожидалось. Однако, если я закрою модальный файл, а затем снова открою его, кнопка OK не произведет на него никаких действий. Я имею в виду, что onclick назначен (правильно); это в исходном коде, и он правильно предупредит через .attr('onclick')
, но нажатие кнопки ничего не делает. Я настроил, что при появлении модального параметра каждый раз назначается onclick
; но это почти так, как если бы в памяти или DOM была теневая копия или что-то еще застряло. Хотя, я не вижу ничего странного в Firebug….
Я попытался клонировать кнопку, переназначить ее, затем replaceWith
редактировать. Я также пробовал remove
редактировать его и повторно добавлять…
Есть какие-нибудь подсказки?
Ответ №1:
Неприятно это говорить, мой друг, но ты не используешь преимущества jQuery.
- Зачем настраивать отображение через CSS? Просто используйте .hide() .show() или .toggle().
- Почему вы устанавливаете атрибут onclick через javascript? В этом вообще нет особого смысла. Используйте $(elem).click(my_function);
Второй пункт, скорее всего, решит вашу проблему, но я бы провел серьезную переоценку.
Удачи!
Комментарии:
1. 1) OK. 2) потому что обработчики
bind
иclick
ведут себя не так, как ожидалось. Спасибо.2. Если обработчики по умолчанию не работают, это может указывать на другую проблему в вашем JS или разметке, которая мешает их правильному запуску или привязке. Для оценки этого нам нужно было бы просмотреть ваш более крупный исходный код; однако ознакомьтесь с утилитами проверки W3C и вашим любимым JS-отладчиком, чтобы найти проблемы в вашей разметке.
3. Проблема в том, что события щелчка jQuery на самом деле представляют собой очередь функций. Когда вы привязываете событие click, это добавляет функцию в очередь. Поскольку вы объявляете свой щелчок (строка 159), когда показываете свой модал, каждый раз, когда вы показываете его, вы добавляете другое событие щелчка. Сделайте это:
$('#modal_ok_btn').unbind('click').bind('click',function(){conf_code_check()});
Этого можно было бы избежать с помощью архитектуры, которая больше соответствует модели и событиям jQuery, таким как предварительная привязка событий нажатия или использованиеlive
ordelegate
для содержимого AJAX.4.
.click()
эквивалентно.bind('click', ...)
с точки зрения функции..unbind()
Это то, что должно устранить вашу проблему. Поместите это перед всеми вашими привязками кликов, которые не выполняются в вашем документе.готово. Я не уверен, что вы подразумеваете под «тем, что исчерпывает указанную очередь»? Это не очередь, которая удаляется при нажатии на что-либо. Это означало бы, что вам нужно постоянно выполнять повторную привязку. Вы добавляете материал в очередь, который сохраняется при каждом нажатии, поэтому каждый раз, когда вы нажимаете на кнопку с несколькими событиями нажатия, все они будут вызываться, если только одно из них не возвращает false или не вызываетe.stopPropagation
.5. Не за что, добрый сэр. Желаю удачи. Продолжайте просматривать примеры кода и читать рекомендации. Вы быстро освоите jquery fu.
Ответ №2:
Используйте bind
привязки имен событий:
$('#okBTN').click(my_function)
Ответ №3:
Я бы попробовал использовать .css('display','block')
вместо .css('display','')
, поскольку присвоение пустого display
значения не кажется хорошей идеей (это может сработать, но на всякий случай).
Вы пробовали устанавливать .bind()
функцию элемента?
$('#okBTN').bind('click', my_function);