Кнопка "Отключено" все еще срабатывает с помощью ".click()"

Кажется, что кнопка отключена. Функция onclick по-прежнему запускается при ее программном программировании, например:

<div>
   <input type="button" onclick="save()" id="saveButton"    value="save"  disabled="disabled" />
   <input type="button" onclick="byPassDisabled()" value="bypass disabled button"/>
<div id="counter">0</div>

function save(){
    var count = parseInt($('#counter').html());
    $('#counter').html(++count);
}
function byPassDisabled(){
     $('#saveButton').click();   
}

см. http://jsfiddle.net/WzEvs/363/

В моей ситуации ярлыки клавиш привязаны к функциям, запускающим кнопки ".click()" на кнопках. Мне будет очень неприятно отключать шоркуты или проверять, отключена ли кнопка. Я бы предпочел общее решение, устраняющее эту проблему.

  • Но почему? Такое поведение для меня не кажется справедливым.
  • Любое обходное решение?

Ответы

Ответ 1

Атрибут отключает только пользовательское взаимодействие, кнопка все же используется программно.

Итак, вы должны проверить

function byPassDisabled(){
    $('#saveButton:enabled').click();   
}

В качестве альтернативы не используйте встроенные обработчики.

$(document).on('click', '#saveButton:enabled', function(){
    // ...
});

Ответ 2

Вы можете программно запускать нажатие на отключенную кнопку.

Есть способы найти, является ли событие нажатием кнопки пользователем, или оно запускается программно. http://jsfiddle.net/WzEvs/373/

$(function () {
    $("#saveButton").on('click', function (e) {
        if (!e.isTrigger) {
            var count = parseInt($('#counter').html());
            $('#counter').html(++count);
        }
    });
    $("#bypassButton").on('click', function (e) {
        $("#saveButton").click();
    });
});

e.isTrigger является истинным, если вы вызываете click() программно. В основном вы запускаете событие click вручную в коде.

Ответ 3

Вы можете запускать click, хотя и сделали его disable. Как сказал Spokey, он просто показывает взаимодействие с пользователем (юзабилити по-прежнему сохраняется, что можно включить программным путем). off или unbind щелчок решит эту проблему.

Спасибо

Ответ 4

Для будущего использования... OP-код работает, потому что jQuery по-прежнему будет называть его собственными обработчиками, даже если элемент DOM отключен. Если бы кто-то использовал ванильный javascript, атрибут disabled был бы выполнен.

const element = document.getElementById('saveButton');
element.click() //this would not work