Этот ответ предназначен для исправления неправильного представления, которое возникает у некоторых из других ответов:
Например:
Компилятор может заменить 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.
Одна из идей состоит в том, чтобы удалить событие щелчка в начале вашей функции, а затем добавить событие щелчка обратно, когда ваша анимация будет завершена, чтобы щелчки во время продолжительности не имели никакого эффекта.
Если у вас есть возможность выполнить код после завершения анимации, это должно сработать.
Добавьте переменную для использования в качестве блокировки, а не (: анимацию).
При щелчке мыши проверьте, установлена ли блокировка. Если нет, установите блокировку, запустите процесс, а затем снимите блокировку, когда 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;
}
);
Ранее я поигрался с кодом и придумал следующую модификацию, которая, похоже, работает:
$('#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;
}
);
Все, что происходит, - это когда щелкают новую вкладку, и сразу появляется текущая анимация. до конца, а затем начинается новый переход.
одним из способов было бы следующее:
$('#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 );
}
Как видите, этот метод чреват недостатками: что произойдет, если щелкнуть другую вкладку до загрузки текущей страницы? Что делать, если запрос отклонен? что, если сейчас полная луна?
Ответ: этот метод - всего лишь элементарная демонстрация. Правильная реализация должна:
$ global_just_clicked
.load ()
. Использовал бы .ajax ()
и обрабатывал бы отмену запроса, щелчок по другим вкладкам и т. Д. ПРИМЕЧАНИЕ. В большинстве случаев вам не нужно использовать этот обходной подход. Я уверен, что вы можете исправить свой код таким образом, чтобы несколько нажатий на одну и ту же вкладку не повлияли на конечный результат.
jrh.
Вот как я это сделал, и все работало нормально.
$(document).ready(function() {
$(".clickitey").click(function () {
if($("#mdpane:animated").length == 0) {
$("#mdpane").slideToggle("slow");
$(".jcrtarrow").toggleClass("arrow-open");
}
});
});
это не то, что делает ваш код, конечно, это код с моего сайта, но я просто хочу указать, как я игнорировал щелчки, которые происходили во время анимации. Пожалуйста, дайте мне знать, если это все равно неэффективно. Спасибо.