Сделайте так, чтобы функция перестала работать при нажатии кнопки(javascrpt)

#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>