【问题标题】:Disable input-group-addon禁用输入组插件
【发布时间】:2018-04-24 20:16:20
【问题描述】:

我想在选中复选框时禁用日期选择器。但我不能禁用输入组插件。即使文本输入被禁用,用户也可以单击跨度并选择一个日期。

如何禁用它?

这是我的 html 代码:

<div class="col-md-4">
    <div class="control-group">
        <div class="input-group date" id="deb">
            <div class="input-group-addon">Du</div>
            <input id="dateDebut" type="text" class="form-control">
        </div>
    </div>
</div>
<div class="col-md-4">
    <div class="control-group">
        <div class="input-group date" id="end">
            <div class="input-group-addon">Au</div>
            <input id="dateFin" type="text" class="form-control">
        </div>
    </div>
</div>
<div class="col-md-3 checkbox">
    <label> <input id='toutVisu' type="checkbox">Visu</label> 
</div>

这是我的 js 代码:

$('input#toutVisu').on('change', function(){

    if($(this).is(':checked')){
        $("div.date input").prop("disabled",true)
        $("div.date input").val("")

        msg = $('#messToutVisu').val()
        msgAlert = afficheAlert("danger",msg)
        $("div#histoRapport").append(msgAlert)
        deleteAlert()
    }else{
        $("div.date input").prop("disabled",false)
    }
})

我尝试了很多方法来禁用此输入,但没有任何效果。所以我让已经做出的东西。

谢谢

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    $('input#toutVisu').on('change', function(e) {
    
      var isDisabled = $(this).is(':checked');
      $("#toDisable").prop("disabled", isDisabled)
      if(isDisabled){
        $('#end, #deb').datepicker('remove');
      }else{
        $('#end, #deb').datepicker();
      }
    })
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    
    <!-- Optional theme -->
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
    
    <!-- Latest compiled and minified JavaScript -->
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
    <fieldset id="toDisable">
      <div class="col-md-4">
        <div class="control-group">
          <div class="input-group date" id="deb">
            <div class="input-group-addon">Du</div>
            <input id="dateDebut" type="text" class="form-control">
          </div>
        </div>
      </div>
      <div class="col-md-4">
        <div class="control-group">
          <div class="input-group date" id="end">
            <div class="input-group-addon">Au</div>
            <input id="dateFin" type="text" class="form-control">
          </div>
        </div>
      </div>
    </fieldset>
    <div class="col-md-3 checkbox">
      <label> <input id='toutVisu' type="checkbox">Visu</label>
    </div>

    【讨论】:

    • 这对我有用 我刚刚在我的站点的错误版本上测试了这个例子,然后我重试了。谢谢!
    【解决方案2】:

    .unbind() 从元素中删除先前附加的事件处理程序。

    $('input#toutVisu').on('change', function(){
    
        if($(this).is(':checked')){
            $("div.date input").prop("disabled",true)
            $("div.date input").val("")
            $(".input-group-addon").unbind('click');
            msg = $('#messToutVisu').val()
            msgAlert = afficheAlert("danger",msg)
            $("div#histoRapport").append(msgAlert)
            deleteAlert()
        }else{
            $("div.date input").prop("disabled",false)
        }
    })
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/>
    <div class="col-md-4">
        <div class="control-group">
            <div class="input-group date" id="deb">
                <div class="input-group-addon">Du</div>
                <input id="dateDebut" type="text" class="form-control">
            </div>
        </div>
    </div>
    <div class="col-md-4">
        <div class="control-group">
            <div class="input-group date" id="end">
                <div class="input-group-addon">Au</div>
                <input id="dateFin" type="text" class="form-control">
            </div>
        </div>
    </div>
    <div class="col-md-3 checkbox">
        <label> <input id='toutVisu' type="checkbox">Visu</label> 
    </div>

    【讨论】:

    • 您好,感谢您的回答。我试过这段代码,但它对我不起作用,它总是可以点击的。
    【解决方案3】:

    附加事件 onchange 可能不起作用,因为必须发生更改才能触发 onchange。尝试在 mousedown 和 touchend 上附加一个事件,如果选中该复选框,则在其中调用 event.preventDefault() + event.stopImmediatePropagation()

    或者,您也可以使用在change 之前触发的focusin 事件

    PS

    根据您发布的内容,我看不到这些跨度,但假设它们是输入的 previousElementSibling(您可以进一步简化以下内容,但我为您编写快速测试) :

    $("div.date input").prev()
    .on("touchend",function(e){
        if($('input#toutVisu').is(':checked')){
            e.preventDefault();
            e.stopImmediatePropagation();
            return false;
        }
    }).on("mousedown",function(e){
       if($('input#toutVisu').is(':checked')){
            e.preventDefault();
            e.stopImmediatePropagation();
            return false;
       }
    }).on("click",function(e){
       if($('input#toutVisu').is(':checked')){
            e.preventDefault();
            e.stopImmediatePropagation();
            return false;
       }
    })
    

    在向这些元素添加任何自定义事件处理程序之前添加上述。您可能需要在 touchstart 上调用上述内容,但 chrome 会抱怨该事件是被动的,因此您需要事先进行设置。

    【讨论】:

    • 感谢您的回答 ibowankenobi 但我不太了解链接,我是初学者,我从未在 mousedown 或 touchend 上使用过事件。你能解释一下吗?
    • 如果你做一个小提琴对我来说会容易得多。因为跨度和控制其行为的 js 不包含在您的 sn-p 中。
    • 试试我的 PS 并告诉我是否可行。否则需要小提琴
    • 我刚刚尝试了您的代码,但它也不起作用......我不明白为什么禁用它这么难。它禁用了我们可以在其中写入日期的输入文本,但我们始终可以单击左侧按钮来选择日期。
    • 一点也不难。很难在没有可重现的活样本开始的情况下猜测可能发生的事情。如果你能做一个最小的小提琴,一切都会变得容易得多,这样我们就可以深入了解这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多