Nano Hash - криптовалюты, майнинг, программирование

Действие запускается трижды по одному событию

Это довольно просто (я знаю), но все же я не могу понять это.

Что происходит:

У меня есть jsp, на котором кнопка запускает действие (которое удаляет определенную запись в БД). Но я заметил, что действие запускается трижды при нажатии кнопки, вызывая сообщение об ошибке, даже если запись удалена. На странице jsp есть два «div» (родительский-дочерний) (см. код ниже). Кнопка находится в дочернем.

Что я узнал:

когда я удаляю родительский div (что делает дочерний элемент родительским), все работает нормально (конечно, за исключением функции, которую выполнял родительский div). Я прочитал этот пост:

Обработчик событий срабатывает дважды вместо одного

который предложил проблему «пузырькового события». Я попытался добавить stopPropagation();, но это тоже не сработало.

Может быть, что-то простое ускользает от моего глаза. Пожалуйста помоги.

Вот мой код для jsp:

<s:url id="scriptURL" action="getContactInfo" />
<sd:div href="%{scriptURL}" listenTopics="getContactInfo" formId="contactInfo" showLoadingText="false" preload="false">
    <s:url id="scriptURL1"  action='delContactInfo'/>
    <sd:div href="%{scriptURL1}" listenTopics="delContactInfo" formId="contactInfo" showLoadingText="false" preload="false">

        <s:actionerror/>
        <s:actionmessage/>
        <s:form name="contactInfo" id="contactInfo" action="editContactInfo">

            <sd:autocompleter id="contact"  name="contact"  label="Full Name " autoComplete="false" searchType="substring" list="contactList"  valueNotifyTopics="getContactInfo"/>
            <sd:autocompleter id="customer" name="customer" label="Company "   autoComplete="false" searchType="substring" list="customerList" valueNotifyTopics="getContactInfo"/>
            //////other controls////////


            //////other controls////////

            <s:submit id="submit" name="submit" value="Save Changes" align="center" onclick="saveEvent(event);"/>

        </s:form>

        <s:submit id="del" name="del" align="center" value="Delete" onclick="deleteEvent(event);"/>

    </sd:div>

</sd:div>

JS-файл:

function deleteEvent(e)
{
    alert('Delete the selected account !!');
    alert('Are you sure?');
    dojo.event.topic.publish('delContactInfo');

    event = e || window.event;
    if ('bubbles' in event) {   // all browsers except IE before version 9
        if (event.bubbles) {
            event.stopPropagation();
            alert('1');
        }else {  // Internet Explorer before version 9
             event.cancelBubble = true;
            alert('2');
        }
    }else{
        event.cancelBubble = true;
        alert('3');
    }
}

function saveEvent(e){
    alert('Do you want to save the changes you made?');

    event = e || window.event;
    if ('bubbles' in event) {   // all browsers except IE before version 9
        if (event.bubbles) {
            event.stopPropagation();
        }else {  // Internet Explorer before version 9
            event.cancelBubble = true;
        }
    }else{
        event.cancelBubble = true;
    }
}

Я предполагаю, что проблема кроется где-то только здесь. Потому что после этого вызывается действие, которое выполняет свою работу. Просто он вызывается трижды. Но если вы считаете, что требуется дополнительная информация, пожалуйста, прокомментируйте.

Спасибо!!

Редактировать


Ответы:


1

Если вам нужно сделать это встроенным, используйте что-то вроде этого:

<prior stuff here>; var e = arguments[0] || window.event; e.stopPropagation();

Гораздо лучше поместить код во внешнюю функцию и вызвать ее так:

onclick="handleEvent(event);"


function handleEvent(e)
{

   // function code

   // then
  event = e || window.event;
  if ('bubbles' in event) {   // all browsers except IE before version 9
     if (event.bubbles) {
       event.stopPropagation();
     }
     else {  // Internet Explorer before version 9
       event.cancelBubble = true;
     }      
   }
}

Пример взят из разных мест, включая http://help.dottoro.com/ljgfjsxd.php.


Для вашего новейшего кода я бы предложил следующее:

   <s:form name="contactInfo" id="contactInfo" action="editContactInfo">

        <sd:autocompleter id="contact"  name="contact"  label="Full Name " autoComplete="false" searchType="substring" list="contactList"  valueNotifyTopics="getContactInfo"/>
        <sd:autocompleter id="customer" name="customer" label="Company "   autoComplete="false" searchType="substring" list="customerList" valueNotifyTopics="getContactInfo"/>
        //////other controls////////


        //////other controls////////

        <s:submit id="submit" name="submit" value="Save Changes" align="center" onclick="saveEvent(event);"/>
        <s:submit id="del" name="del" align="center" value="Delete"   onclick="deleteEvent(event);"/>
    </s:form>

Примечание: обе кнопки отправки имеют одинаковую форму.

18.11.2011
  • Привет, я попробовал это только сейчас. Проблема все еще сохраняется. Еще совет. 18.11.2011
  • Привет, спасибо за это, он все еще не работает. Я попробовал некоторые модификации, взяв некоторые данные из Google. Но это имеет только одно отличие: 3 потока выполнения действий теперь выполняются один за другим, а не одновременно, как раньше. 20.11.2011
  • @kanish: пожалуйста, обновите источник в вопросе, чтобы я знал, что вы делаете. 20.11.2011
  • Привет, я обновил исходный код страницы и добавил новый js-файл, который теперь использую для написания java-скриптов отдельно. 20.11.2011
  • Добавление еще одной вещи: обратите внимание на окна предупреждений, которые я установил в js? Появляется только окно предупреждения с «1» и только один раз. 20.11.2011
  • @kanishk помогает ли добавление return false; в конец функций? или попробуйте onclick="saveEvent(event); return false;" Это зависит от javascript, испускаемого серверной частью. 20.11.2011
  • Это просто очищает значения, которые были выбраны во всех элементах управления на странице. Спасибо, я тоже искал аккуратный способ сделать это!! 20.11.2011
  • Но моя первоначальная проблема остается прежней. Я предполагаю, что, возможно, что-то повторно запускает действие, когда страница снова загружается, потому что я заметил, что если я использую stopPropagation() перед уведомлением темы (для вызова действия), ничего не происходит, кроме двух оповещений, которые я настроил. Действие не вызывается. 20.11.2011
  • Я попытался включить вторую кнопку в форму, вместо этого попытался использовать обычную кнопку html в форме и вне ее. Все равно не поможет... :( 21.11.2011
  • Эй, Хоган, одна вещь, могу ли я вызвать действие, которое я вызываю, через div, напрямую через java-скрипт, который я написал для щелчка. Это решило бы и мою проблему. В противном случае я буду вынужден создать отдельную страницу для удаления. 21.11.2011
  • Попробуйте новый вопрос для этого... Я не понимаю, и мне нужно увидеть код. 21.11.2011
  • ОК Спасибо за ваши усилия Хоган. 22.11.2011

  • 2

    Пожалуйста. обратитесь к ссылке ниже и используйте тег, который является встроенным тегом, предоставленным struts2.

    Как ограничить двойной щелчок по кнопке в struts/Java?

    18.11.2011
  • Эта ссылка рассказывает о том, как свести на нет эффект двойного нажатия кнопки. Моя проблема в том, что только один клик вызывает выполнение действия 3 раза. Также обратите внимание, что когда я удаляю один div, все работает нормально... как я уже упоминал в своем вопросе. 18.11.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..