Предположим, у вас есть страница динамического профиля. Когда пользователь нажимает кнопку редактирования, некоторые div на странице становятся функциональными. Например, когда пользователь нажимает на div, с ним что-то происходит.
Поэтому я использую событие JQuery Click() для этих div. Но я хочу только зарегистрировать это, когда страница находится в режиме редактирования. В настоящее время у меня есть что-то вроде этого:
$(".someClass").click(function() {
if(editMode) {
//do stuff
}
});
Но разве это не является неэффективным? Поскольку он регистрирует событие клика, даже если оно не находится в editMode. То, что я хотел бы достичь, это что-то вроде:
if(editMode) {
$(".someClass").click(function() {
//do stuff
});
}
Очевидно, это не сработает. Есть ли лучший способ достичь этой цели?
В то время, когда вы переходите в режим редактирования, вы можете привязать все обработчики. Затем, когда пользователь покидает режим редактирования, вы можете отпереть их с помощью:
$(".someClass").off("click");
У вас много проблем
синтаксическая ошибка в function AnimateTile(id, z, w, h, now = true) {
, вы можете сделать это вместо чего-нибудь вроде
function AnimateTile(id, z, w, h, now) {
now = now == undefined ? true : now;
то обработчик редактирования должен находиться в обработчике кликов, потому что всякий раз, когда значение edit
изменяется, вам нужно либо добавить обработчик, либо удалить его.
$(".bigtile").click(function (event) {
edit = !edit;
if (edit) $(this).css("background-color", "red");
else $(this).css("background-color", "green");
if (edit) {
$(".tile").on('click.edit', function (event) {
clicked = !clicked;
if (clicked) {
switch ($(this).attr('id')) {
case "tile1":
AnimateTile("tile1", 100, 210, 210);
break;
case "tile2":
AnimateTile("tile2", 100, 210, 210);
break;
case "tile3":
AnimateTile("tile3", 100, 210, 210);
break;
case "tile4":
AnimateTile("tile4", 100, 210, 210);
break;
default:
break;
}
} else {
switch ($(this).attr('id')) {
case "tile1":
AnimateTile("tile1", 0, 100, 100, false);
break;
case "tile2":
AnimateTile("tile2", 0, 100, 100, false);
break;
case "tile3":
AnimateTile("tile3", 0, 100, 100, false);
break;
case "tile4":
AnimateTile("tile4", 0, 100, 100, false);
break;
default:
break;
}
}
});
} else {
$(".tile").off('click.edit');
}
});
Демо: скрипка
Также читайте пространство имен событий и .off()
Вы можете сделать это, но используя .on()
if(editMode) {
$(document).on('click', ".someClass", function() {
//do stuff
});
}
то вы можете отсоединить этот обработчик событий, используя .off()
$(".someClass").off("click");
Добавьте класс, например: "редактировать" в контейнере в режиме редактирования, удалите его, если нет.
$(document).on('click', ".edit .someClass", function() {
//do stuff
});
Мое предложение таково:
.on()
метода .on()
if(editMode) {
$(".someClass").addClass('editable');
}
$(".someClass closest static parent elem").on('click', '.editable', function() {
//do stuff
});
$(".someClass closest static parent elem")
вы можете изменить его также на $(document)
но лучше использовать ближайший статический родительский элемент к этому целевому элементу.
.off()
и пространства имен событий)