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

#jquery #jquery-mobile

#jquery #jquery-мобильный

Вопрос:

У меня есть две кнопки в одном и том же месте (одна над другой, абсолютная позиция). Я использую Jquery mobile 1.4 и Phonegap 3.3.

кнопка # 1 изначально visible

кнопка # 2 изначально hidden

Когда я нажимаю на кнопку # 1, она должна скрывать кнопку # 1 и отображать кнопку # 2.

Но странно то, что при нажатии на кнопку # 1 она также срабатывает на кнопке # 2, как если бы она уже отображалась. Итак, с помощью приведенного ниже кода нажатие на кнопку # 1 скрывает кнопку # 1, отображает кнопку # 2, скрывает кнопки # 2 и отображает кнопку # 1 … вернемся к тому, с чего мы начали!

Я что-то делаю не так?

HTML:

       <a id="miniWeightLevel" class="ui-btn ui-btn-b ui-corner-all">My Factor</a>
            <div id="minifyCross">
                <div id="minifybutton" class="ui-btn btn-small-round ui-icon-delete ui-btn-b ui-btn-icon-notext ui-btn-inline"></div>
            </div>   
 

JS:

 $(document).on('pagebeforeshow', '#welcome-page', function(event, docdata){     
    //initial state : 
    $('#miniWeightLevel').hide();
    $('#minifyCross').show();

    //bindings :
    $('#miniWeightLevel').unbind('vclick').bind('vclick', function (e) {
        e.stopPropagation();
        $('#miniWeightLevel').hide();
        $('#minifyCross').show();
    });
    $('#minifyCross').unbind('vclick').bind('vclick', function (e) {
        e.stopPropagation();
        $('#miniWeightLevel').show();
        $('#minifyCross').hide();
    });
});
 

Комментарии:

1. Что такое кнопка html / css? Я имею в виду, как вы изначально скрываете одну кнопку.

2. @AtanuCSE Я просто редактирую вопрос, извините. Я просто скрываю () один и показываю () другой. Html является базовым.

3. Добавить :visible к кнопкам, например $("#btnID:visible").on( .

4. @Omar спасибо, но у меня такая же проблема с $('#miniWeightLevel:visible').off('vclick').on('vclick'... и $('#minifyCross:visible').off('vclick').on('vclick'...

5. Как насчет использования атрибута «отключено» в сочетании с вашей логикой отображения / скрытия?

Ответ №1:

Я также сталкивался с этим в прошлом vclick , когда обработчики дважды запускались на мобильных устройствах. Вы можете исправить это, добавив a return false в конце ваших vclick обработчиков.

Проверьте эти скрипты. Этот первый, http://jsfiddle.net/8g8mmzey/2 /, соответствует вашему исходному коду. При запуске на рабочем столе Chrome все в порядке. Однако при запуске этого на iPhone я вижу, что срабатывают оба события — когда я нажимаю «x», на мгновение появляется другая кнопка, но затем срабатывает ее щелчок, скрывающий ее и снова показывающий «x».

Вторая скрипка http://jsfiddle.net/ff23yL4u / показывает обновленный код с return false в конце обработчиков.

 $('#miniWeightLevel').unbind('vclick').bind('vclick', function (e) {        
    e.stopPropagation();
    $('#miniWeightLevel').hide();
    $('#minifyCross').show();

    return false;
});
$('#minifyCross').unbind('vclick').bind('vclick', function (e) {       
    e.stopPropagation();
    $('#miniWeightLevel').show();
    $('#minifyCross').hide();

    return false;
});
 

Ответ №2:

Причина, по которой сработала функция e.preventDefault(), заключается в том, что функция stopPropagation используется, чтобы убедиться, что событие не всплывает по цепочке. например. щелчок по тегу также запускает события щелчка на его родительском элементе, а затем на его родительском элементе и т. Д. stopPropagation предотвращает это.

preventDefault используется для остановки обычного действия элемента, например. preventDefault в обработчике кликов по ссылке остановит переход по ссылке, или кнопка отправки остановит отправку формы.

Ответ №3:

Хорошо, я нашел решение.

Вместо использования e.stopPropagation() просто используйте:

e.preventDefault();

Не уверен, почему, но это решило мою проблему.

Комментарии:

1. @down-избиратель: я действительно не понимаю, почему вы проголосовали за мой ответ. Я нашел решение, которое сработало для меня, и я представил здесь. В чем проблема?