странное поведение при отображении | display: нет элементов

#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 or delegate для содержимого 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);