How to trigger a click event on disabled elements

后端 未结 5 902
难免孤独
难免孤独 2021-01-11 23:18

I have a disabled button, which is enabled after checking \"I accept terms and conditions\" checkbox. The problem is that I wanted to trigger an alert, if a user cli

相关标签:
5条回答
  • 2021-01-11 23:50

    Old topic, but here are my two cents as I had the same challenge lately:

    Don't try to position a clickable element above it but wrap it with one so you won’t directly be able to click it. Assuming a button with display: inline-block set:

    <span class="on-disabled">
      <input id="subm_tc" class="btn btn-primary" type="submit" disabled value="Log in" name="Submit">
    </span>
    

    Define you click event for the case of the button being disabled:

    $('.on-disabled').click(function (ev) {
      // Don’t react to click events bubbling up
      if (ev.target !== ev.currentTarget) return;
      // Do your thing
      alert('Sorry, this button is disabled');
    });
    

    And simply style the button like:

    #subm_tc {
      display: inline-block;
    }
    
    #subm_tc[disabled] {
      position: relative;
      z-index: -1;
    }
    

    This allows you to easily react to a click even in case of a disabled button. See FIDDLE.

    0 讨论(0)
  • 2021-01-11 23:52

    If you use Twitter Bootstrap, they give you a class disabled that provides the styling but doesn't remove the click event. Given that, what I did was this (keep in mind also, I wanted to be sure that when the button was no longer disabled, the original click event did fire, and I didn't want to deal with unbinding, rebinding it).

    function disableButton(btn, message) {
      btn.addClass("disabled")
      if (!(message == null || message == "")) {
        btn.data("message", message)
      }
    }
    
    function enableButton(btn) {
      btn.removeClass("disabled")
    }
    
    $("#btn").click(function() {
      if (!($(this).hasClass("disabled"))) {
        // original, desired action
      } else {
        message = $(this).data("message")
        if (!(message == null || message == "")) {
          alert(message)
        }
      }
    

    })

    0 讨论(0)
  • 2021-01-11 23:58

    Disabled elements doesn't trigger any mouse events at all, so that's probably a lost cause.

    However, when clicking a parent element, the event.target seems to be given correctly, which means this should work :

    $(document).on('click', function (e) {   
        if (e.target.id == 'subm_tc') {
            if($("#modlgn-tc").is(':checked')){
                 alert('checked');
            } else {
                 alert('unchecked');
            }
        }
    });
    

    FIDDLE

    0 讨论(0)
  • 2021-01-12 00:00

    You can write a function that adds listeners to the mousedown and mouseup events, and if the targets match your Node (i.e. the mousedown and following mouseup were on your element), then it invokes another function

    function listenFullClick(elm, fn) {
        var last;
        document.addEventListener('mousedown', function (e) {
            last = e.target === elm;
        });
        document.addEventListener('mouseup', function (e) {
            if (e.target === elm && last) fn();
        });
    };
    
    listenFullClick(
        document.getElementById('foo'), // node to look for
        function () {alert('bar');}     // function to invoke
    );
    

    DEMO

    0 讨论(0)
  • 2021-01-12 00:12

    My solution was to put the button in a div, which is clickable. when the button is disabled, the div has the width and height of the button, so clicking the button triggers the div. when the button is enabled, the div is shrunk to 0 width 0 height, so the click event registers with the button instead of the div. This code includes some demoing code as well for a toggle button which toggles the enabled/disabled state of the button in question

    fiddle: http://jsfiddle.net/6as8b/2/

    HTML

    Click 'Toggle" to make 'Button' enabled or disabled. click it, and see that that one event fires if it is enabled, and another if disabled.

    <input type=button value='toggle' id='toggle'><BR>
    <div style='position:relative'>
        <div id='clickable'></div>
        <input id=theButton type=button disabled value='Button'>
            </div>
        <div id=clicks></div>
    

    CSS

    #clickable{
    position:absolute;
        width:55px;
        height:25px;
    }
    

    JS

    $(document).ready(function () {
        $('#clickable').on('click',function () {
            if ($('#theButton:disabled').length>0)
            {
            $('#clicks').append('|Disabled Button Clicked|<br>');
            }
            else
            {
                //do nothing and let the button handler do it
                $('#theButton').click();
            }
        });
        $('#theButton').on('click',function() {
            $('#clicks').append('|ENABLED button clicked|<br>');
        });
            $('#toggle').on('click',function() {
           if ($('#theButton:disabled').length>0)
            {
                $('#theButton').removeAttr('disabled');
                $('#clickable').css({'width':'0px','height':'0px'});
            }
                else
                {
                    $('#theButton').attr('disabled','disabled');
                    $('#clickable').css({'width':'55px','height':'25px'});
                }
        });
    });
    
    0 讨论(0)
提交回复
热议问题