Предотвратите событие щелчка в jQuery, инициировавшем многократно

Этот ответ предназначен для исправления неправильного представления, которое возникает у некоторых из других ответов:

Например:

Компилятор может заменить x + y константой ("xyzabc"), хотя. @Binkan Salaryman

... и объект String 4 [String, который соответствует конкатенации] может быть вычислен компилятором и также превращен в интернированную константу. @dasblinkenlight

Это неверно. JLS утверждает это:

15.18.1. Оператор конкатенации строк +

....

Объект String создается заново (§12.5), если выражение не является константным выражением (§15.28).

Чтобы квалифицироваться как постоянное выражение, имена переменных в выражении должны быть:

Простые имена (§6.5.6.1), которые ссылаются на постоянные переменные ( §4.12.4).

где «постоянная переменная» определяется как:

Постоянная переменная - это конечная переменная примитивного типа или типа String, которая инициализируется постоянным выражением (§ 15,28). [тысяча сто двадцать семь]

В этом примере ни x, ни y не являются final, поэтому они не являются постоянными переменными. И даже если бы они были final, y , все равно не были бы постоянной переменной из-за использования оператора new при его инициализации.


Короче говоря, компилятору Java не разрешено использовать внутреннюю константу "xyzabc" в результате выражения конкатенации.

Если в конце я добавлю следующее утверждение:

    System.out.println(x == "xyzabc");

оно всегда будет печатать false ... при условии, что компилятор соответствует спецификации языка Java.

9
задан White Elephant 18 June 2009 в 12:57
поделиться

5 ответов

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

Если у вас есть возможность выполнить код после завершения анимации, это должно сработать.

12
ответ дан 4 December 2019 в 09:37
поделиться

Добавьте переменную для использования в качестве блокировки, а не (: анимацию).

При щелчке мыши проверьте, установлена ​​ли блокировка. Если нет, установите блокировку, запустите процесс, а затем снимите блокировку, когда fadeIn завершится.

var blockAnimation = false;

$('#tab-list li a').click(
    function() {
        if(blockAnimation != true){
        blockAnimation = true;
        var targetTab = $(this).attr('href');
        if ($(targetTab).is(':hidden')) {
            $('#tab-list li').removeClass('selected');
            var targetTabLink = $(this).parents('li').eq(0);
            $(targetTabLink).addClass('selected');
            $('.tab:visible').fadeOut('slow',
                function() {
                    $(targetTab).fadeIn('slow', function(){ blockAnimation=false; });
                }
            );
        }
        }
        return false;
    }
);
6
ответ дан 4 December 2019 в 09:37
поделиться

Ранее я поигрался с кодом и придумал следующую модификацию, которая, похоже, работает:

$('#tab-list li a').click(
    function() {
        $('.tab:animated').stop(true, true);
        var targetTab = $(this).attr('href');
        if ($(targetTab).is(':hidden')) {
            $('#tab-list li').removeClass('selected');
            var targetTabLink = $(this).parents('li').eq(0);
            $(targetTabLink).addClass('selected');
            $('.tab:visible').fadeOut('slow',
                function() {
                    $(targetTab).fadeIn('slow');
                }
            );
        }
        return false;
    }
);

Все, что происходит, - это когда щелкают новую вкладку, и сразу появляется текущая анимация. до конца, а затем начинается новый переход.

1
ответ дан 4 December 2019 в 09:37
поделиться

одним из способов было бы следующее:

$('#tab-list ul li').one( 'click', loadPage );
var loadPage = function(event) {
    var $this = $(this);
    $global_just_clicked = $this;
    var urlToLoad = $this.attr('href');
    $('#content-area').load( urlToLoad, pageLoaded );
}
$global_just_clicked = null;
var pageLoaded() {
    $global_just_clicked.one( 'click', loadPage );
}

Как видите, этот метод чреват недостатками: что произойдет, если щелкнуть другую вкладку до загрузки текущей страницы? Что делать, если запрос отклонен? что, если сейчас полная луна?

Ответ: этот метод - всего лишь элементарная демонстрация. Правильная реализация должна:

  1. не содержать глобальную переменную $ global_just_clicked
  2. не полагаться на .load () . Использовал бы .ajax () и обрабатывал бы отмену запроса, щелчок по другим вкладкам и т. Д.

ПРИМЕЧАНИЕ. В большинстве случаев вам не нужно использовать этот обходной подход. Я уверен, что вы можете исправить свой код таким образом, чтобы несколько нажатий на одну и ту же вкладку не повлияли на конечный результат.

jrh.

0
ответ дан 4 December 2019 в 09:37
поделиться

Вот как я это сделал, и все работало нормально.

$(document).ready(function() {
    $(".clickitey").click(function () {
        if($("#mdpane:animated").length == 0) {
            $("#mdpane").slideToggle("slow"); 
            $(".jcrtarrow").toggleClass("arrow-open");
        }
    });
});

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

3
ответ дан 4 December 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: