Действие запускается трижды на одном событии - PullRequest
1 голос
/ 18 ноября 2011

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

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

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

Что я выяснил:

когда я удаляю родительский 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;
    }
}

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

Спасибо !!

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

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

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

<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>

Примечание: обе кнопки отправки находятся в одной форме.

0 голосов
/ 18 ноября 2011

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

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

...