Подтвердить что ты не робот

JQuery detect click on disabled submit button

Fiddle: http://jsfiddle.net/ugzux/

Как вы можете видеть, у меня есть форма с отключенной (через javascript) кнопкой отправки.

Я хочу иметь возможность связать событие клика с ним в любом случае, поэтому я могу сделать несколько ярких индикаторов того, что нужно исправлять на вкладке, прежде чем я позволю отправить форму (т.е. снова включить кнопку).

Однако отключение кнопки отправки также, по-видимому, отключает любые события кликов, привязанные к кнопке, даже если они связаны после отключения - любая идея, как обойти это?

Практически одно решение состоит в том, чтобы остановить отключение кнопки и вместо этого выполнить событие, которое делает

$('form').submit(function(event){
    event.preventDefault(); 
});

Однако я хочу знать все входы и выходы отключенных входов и javascript-событий, и если есть обходные пути, так как раньше я никогда не сталкивался с этим поведением.

4b9b3361

Ответ 1

Нашел это в этом question -

Firefox и, возможно, другие браузеры, отключить DOM-события в полях формы которые отключены. Любое событие, которое начинается в отключенном поле формы, полностью отменяется и не распространяется на дерево DOM. Исправь меня если я ошибаюсь, но если вы нажмете на отключенную кнопку, источник событие является отключенной кнопкой, и событие click полностью вытер. Браузер буквально не знает, что нажата кнопка, и не пропускает событие click. Как будто вы нажимаете на черная дыра на веб-странице.

Я думал, что вы сможете "подделать" клик, обернув кнопку в div и активизируя логику в событии div. Но, как указано выше, события на отключенных элементах, похоже, не пузырятся в дереве DOM.

Ответ 2

Лучший способ, которым я нашел это, - использовать "отключенный" класс для отключения кнопки. Затем вы можете захватывать события кликов в jquery. Если $(this).hasClass('disabled'), вы делаете свой материал "jazzy indicator" вместе с event.preventDefault();. Когда пользователь выполнил свою задачу, вы можете removeClass('disabled') с input[type="submit"] 'button'. Легко!

Ответ 3

Вы можете поместить div вокруг кнопки отправки и прикрепить к ней функцию щелчка, когда кнопка отправки отключена:

<div id="sub-div"><input type="submit"><div>

$('sub-div').click(function(event){
    if (attr('submit-button', 'disabled') == 'true')
    {
        alert('Button Disabled')
    }
});

Это всего лишь код от верхней части головы, так что это может быть не совсем правильно. Но вы понимаете.

Ответ 4

$(document).on('click', '.wrapper-of-disabled-button', function(){
  if ($(this).find('button.disabled').length > 0) {
    // Do your magic on the parent -> $(this)
  }
});

Здесь вы идете;)

Ответ 5

Другим обходным решением с комбинацией требуемого флажка может быть:

<input type="checkbox" class="einwilligung" name="einwilligung" value="ja"/>
<div class="einwilligung_hinweis">U need to check this box</div>
<div class="button_outer">
        <input type="submit" name="submit" value="Senden" id="submitButton" disabled="disabled" class="nope btn" />
        <span class="button_overlay"></span>
 </div>

CSS-Magic

#submitButton{
display:inline-block;
color:#D00019;
width:160px;
z-index:30;
position:absolute;
display:block;
top:0;
left:0;
height:30px;
outline:none;
}

#submitButton.nope{
z-index:10;
color:#333;
}

.button_outer {
width:162px;
height:32px;
z-index:50;
position:relative;
}

span.button_overlay{
display:block;
height:30px;
width:162px;
position:absolute;
top:0;
left:0;
background:#fff;
opacity:0.3;
filter: alpha(opacity=30);
z-index:20;
}

.einweilligung_hinweis_error{
color:red;
}

JQuery-вещество

(document).ready(function() {

  $('.einwilligung').click(function() {
    var buttonsChecked = $('.einwilligung:checked');
    if (buttonsChecked.length) {
      $('#submitButton').removeAttr('disabled');
      $('#submitButton').removeClass('nope');
      $('.einwilligung_hinweis').removeClass('einweilligung_hinweis_error');
    }
    else {
      $('#submitButton').attr('disabled', 'disabled');
      $('#submitButton').addClass('nope');
    }
  });

  $('.button_outer').click(function(){
     if($('#submitButton').hasClass('nope')){
          $('.einwilligung_hinweis').addClass('einweilligung_hinweis_error');
      }else{
          $('.einwilligung_hinweis').removeClass('einweilligung_hinweis_error');
      }
  });

});

Возможно, это не современное состояние, но оно работает очень хорошо!

  • флажок должен быть проверен для того, чтобы дать кнопке отправки более высокий индекс z
  • Если нет, то кнопка button_overlay выше, с событием клика на нем, для выделения сообщения

Ответ 6

Создание кнопки readonly может помочь, поскольку событие click будет запущено. Хотя помните о различиях в поведении.

<input type="submit" value="Submit" readonly="readonly" />

Ответ 7

Вы должны использовать класс .disabled для стильного элемента, чтобы выглядеть отключенным, а затем обрабатывать его, как вы хотите, используя .hasClass('. disabled') в вашем JS-коде. Он будет работать до тех пор, пока вы не ставите "указатель-события: нет"; объявление в коде css для класса .disabled

Ответ 8

У меня есть несколько более сложный, но похожий вариант использования:

  1. На экране много кнопок отправки, но по умолчанию они отключены
  2. Пользователь должен нажать на флажок согласия для кнопки, которая будет включена
  3. Флажок согласия может быть включен/выключен
  4. После нажатия на флажок, они могут нажать на все кнопки отправки

Используя jQuery, я сделал это, наложив кнопку на div и обернув div вместо другого div

Смотрите ниже демо

var toggleNeedConsent = function() {
  var isEnableCheckbox = $('#consent-confirm-checkbox').prop('checked');
  $('.needConsentButton').prop('disabled', !isEnableCheckbox);
  if (!isEnableCheckbox) {
    if (!$(".needConsentButtonOutterDiv").length) {
      $('.needConsentButton').wrap("<div class='needConsentButtonOutterDiv' style='display: inline-block; position:relative'></div>");
    }
    $('.needConsentButton').after('<div class="needConsentButtonDiv" style="position:absolute; top:0; left:0; width: 100%; height:100%; ;"></div></div>');

    $('.needConsentButtonDiv').click(function(e) {
      alert('Please accept the consent first');
    })
  } else {
    $(".needConsentButtonDiv").remove();
  }
}

$(function() {
  toggleNeedConsent();
  $('#consent-confirm-checkbox').click(function() {
    toggleNeedConsent();
  });

  $("#approveButton").click(function() {
    alert('You are a wizard, Harry!');
  })

  $("#approve2Button").click(function() {
    alert('Harry, you are a wizard!');
  })
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Click consent checkbox before approve! <input type="checkbox" id="consent-confirm-checkbox">
<br/>
<br/>

<button class="needConsentButton" id="approveButton">Approve Form1!</button>

<br/>
<br/>
<button class="needConsentButton" id="approve2Button">Approve Form2!</button>

Ответ 9

Просто не отключайте кнопку, но не отправляйте форму. Похоже, вы пытаетесь проверить форму; когда вы позволите JS взять на себя действие submit и вернуть false, форма не будет отправляться