#javascript #html #function #button
Вопрос:
Я хочу, чтобы function
перестать работать при нажатии кнопки в Javascript.
Я пытаюсь использовать if
инструкцию, чтобы проверить, нажата кнопка или нет. Кроме того, я попытался заставить функцию перестать работать, когда в другой функции выполняется определенное условие.
Однако это все равно больше не работает.
Кто-нибудь знает, как заставить это работать и почему onclick == true
это больше не работает?
let textarea = document.getElementsByTagName('textarea')[0]
let message = document.getElementById('message')
function clicks() {
console.log('hi')
//I want to make the appear function stop working when this function is executing.
}
function appear() {
//this is not working
if (document.getElementsByTagName('button')[0].onclick == true) {
message.style.display = 'none'
console.log('it works')
} else {
message.style.display = 'revert'
textarea.value = textarea.value.trimStart();
}
};
<textarea></textarea>
<div id="message">.....</div>
<button onclick="clicks()">split(20px)</button>
Комментарии:
1.
.onclick == true
в этом нет никакого смысла. Свойство onclick содержит ссылку на объект функции, назначенный вами в качестве обработчика щелчка (и поэтому это условие всегда будет иметь значение true). Это не имеет никакого отношения к тому, действительно ли была нажата кнопка. Просто переключите значение логического флага в функции обработчика, затем вы можете проверить этот флаг при следующем щелчке.2. Как это
appear
называется? Ваш вопрос не очень ясен.3. Согласно комментарию Уэброя, скрытое поле, содержащее значение true или false, может сделать свое дело.
4. @CBroe, я не совсем уверен, как это сделать. Например, если я выполняю функцию обработчика, станет ли она истинной, когда я щелкну ее в первый раз, и ложной, когда я щелкну ее во второй раз….
Ответ №1:
onclick
это событие, которое сработало, когда click
произошло событие. В результате onclick
не сохраняет состояние. Вам нужно создать переменную, видимую для clicks
appear
функций и, и использовать ее для определения флага, чтобы остановить выполнение функции appear
.
let textarea = document.getElementsByTagName('textarea')[0];
let message = document.getElementById("message");
let stopButtonClicked = false;
function clicks() {
console.log("hi");
stopButtonClicked = true;
}
function appear() {
if (stopButtonClicked) {
message.style.display = "none";
console.log("it works");
} else {
message.style.display = "revert";
textarea.value = textarea.value.trimStart();
}
}
Комментарии:
1. только когда кнопка «Стоп» нажата верно, это утешит. Это правильно?
2. @Shawn этот код будет выполнен
message.style.display = "none"; console.log("it works");
3. Я имею
message.style.display = "none"; console.log("it works")
в виду, что завещание работает только при нажатии кнопки «Стоп». Правильно ли это?4. @Shawn Да, но только когда
appear
вызывается функция. Вам действительно следует попробовать этот код самостоятельно. Сделайте немного работы, пожалуйста.5. Я понял. Спасибо
Ответ №2:
Вам нужно применить семафорную логику, например:
let beingClicked = false;
function clicks() {
beingClicked = true;
console.log('hi');
//I want to make the appear function stop working when this function is executing.
beingClicked = false;
}
function appear() {
//this is not working
if (beingClicked) {
message.style.display = 'none'
console.log('it works')
} else {
message.style.display = 'revert'
textarea.value = textarea.value.trimStart();
}
};
Обратите внимание , что в начале function
мы устанавливаем семафор ( beingClicked
) на красный (что true
в данном случае), а в конце function
мы устанавливаем его на false
.
Важно отметить, что необходимо рассмотреть еще две проблемы:
1
Возможно, вам потребуется повторно использовать эту логику для других кнопок. Если это так, то вы могли бы рассмотреть следующее:
function ButtonSemaphore(button) {
let semaphore = false;
let events = [];
button.addEventListener("click", function(evt) {
semaphore = true;
for (let event of events) event(evt);
semaphore = false;
});
function isRed() {
return semaphore;
}
function isGreen() {
return !semaphore;
}
function addEvent(callback) {
events.push(callback);
}
}
Вы можете создать этот экземпляр , вызвав его как let myButtonSemaphore = new ButtonSemaphore(button)
, где button
находится допустимая кнопка. Всякий раз, когда вы хотите добавить к нему событие, просто позвоните myButtonSemaphore.addEvent(function(evt) {/* Some code */})
. Обратите внимание, что массив событий обработан и семафор установлен правильно до всех событий и после всех событий.
2
Возможно, вам потребуется повторно использовать это, поэтому рекомендуется создать собственный файл .js, чтобы ваш код существовал ровно один раз и был доступен для импорта при необходимости.
Комментарии:
1. @Арпад, я немного сбит с толку тем, почему вы установили значение
beingClicked
true в начале и установили егоfalse
в конце. Не могли бы вы мне это объяснить? Большое спасибо, что ответили на мой вопрос.2. @Shawn потому что если между установкой значения true и установкой значения false вы вызываете
appear
, то во времяappear
выполнения, значит, на этом этапеbeingClicked
true
. Если вы звонитеappear
до или после щелчка, тоbeingClicked
значение false. Поскольку мы хотимappear
, чтобы в этих двух сценариях поведение отличалось, целесообразно установитьbeingClicked
значение true при нажатии на него и значение false, когда на него больше не нажимают.3. @Шон думай о
beingClicked
семафоре, о своей программе как о машине, о событии щелчка как о перекрестке. Когда автомобиль достигает перекрестка, он должен остановиться, потому что семафор горит красным, и как только все автомобили (события), которых он ждет, проехали, семафор становится зеленым, и проезд может быть продолжен.
Ответ №3:
let textarea = document.getElementsByTagName('textarea')[0]
let message = document.getElementById('message')
function clicks() {
console.log('hi')
//I want to make the appear function stop working when this function is executing.
}
function appear() {
//this is not working
if (document.getElementsByTagName('button')[0].onclick == true) {
message.style.display = 'none'
console.log('it works')
} else {
message.style.display = 'revert'
textarea.value = textarea.value.trimStart();
}
};
<textarea></textarea>
<div id="message">.....</div>
<button onclick="clicks()">split(20px)</button>