【问题标题】:Button disabilitation based on class + data-attribute基于类+数据属性的按钮禁用
【发布时间】:2017-01-03 13:14:37
【问题描述】:

我正在为电子商务购物车写一个带有-+ 按钮的<input type="number">

每个组的结构是:

  • 1x <button class="minus" data-prod="prod_id_int">
  • 1x <input type="number" id="prod_id_int">
  • 1x <button class="plus" data-prod="prod_id_int">

如果输入类型号的值为< 1,我现在要做的是禁用按钮-

要实现它,根据我的脚本,我必须禁用的不是一般的<button class="minus">,而是特定的<button class="minus" data-prod="prod_id_int">。 我试过这个

$(buttonClass).data('prod', dataProd).prop('disabled', true);

它实际上阻止了数量为< 1 但它并没有真正将属性disabled 添加到按钮中。那么,我不确定这是不是正确的方法。有人可以解释一下如何实现吗?

这里是工作的 sn-p

$(document).ready(function() {

  $('button').on('click', function() {
    var buttonClass = $(this).attr('class');
    //console.log(buttonClass);
    var buttonID = $(this).attr('id');
    //console.log(buttonID);
    var dataProd = $(this).data('prod');
    var inputToChange = $('#' + dataProd);
    var inputToChangeValue = $('#' + dataProd).val();
    if (buttonClass == 'minus') {
      var newValue = parseInt(inputToChangeValue) - parseInt(1);
      if (newValue < 1) {
        $(buttonClass).data('prod', dataProd).prop('disabled', true);
        //$(buttonClass).data('prod="' + dataProd + '"').prop('disabled', true);
        //$(buttonClass + '.[data-prod="' + dataProd + '"]').attr(disabled=disabled); //.prop('disabled', true)
        //alert('NOPE');
      } else {
        $('#' + dataProd).val(newValue);
        //console.log(inputToChangeValue);
      }
    } else if (buttonClass == 'plus') {
      var newValue = parseInt(inputToChangeValue) + parseInt(1);
      if (newValue > 99) {
        alert('NOPPPPEE');
      } else {
        $('#' + dataProd).val(newValue);
        console.log(inputToChangeValue);
      }
    }
  });

});
.plus,
.minus {
  width: 1.5%;
  height: auto;
  background-color: #EF1B1F;
  border-radius: 50%;
  text-align: center;
  display: inline-block;
  cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="minus" data-prod="23">-</button>
<input type="number" class="qta" id="23" value="5">
<button class="plus" data-prod="23">+</button>
<br>
<button class="minus" data-prod="90">-</button>
<input type="number" class="qta" id="90" value="62">
<button class="plus" data-prod="90">+</button>

【问题讨论】:

  • $(buttonClass).prop('disabled', newValue &lt; 1); 这到底是什么?parseInt(inputToChangeValue) - parseInt(1); 试试inputToChangeValue--
  • 按钮确实被禁用了对吗?因为prop('disabled', true) 是这样做的方法
  • @mplungjan 感谢-- 提示,尽管如果将它放在 var 前面,如 Alexandru-Ionut Mihai 强调的那样,它会起作用,而不是放在最后。我实际上无法得到这个$(buttonClass).prop('disabled', newValue &lt; 1);
  • $("."+buttonClass).prop

标签: javascript jquery html css button


【解决方案1】:

这里是解决方案。

$('.'+buttonClass).data('prod', dataProd).prop('disabled', true);

你只需要concatenate.你的班级的符号。

buttonClass只返回className,比如minus,你需要jquery selector,像这样:$('.minus')

另外,我建议你使用这个:var newValue = --inputToChangeValue; 来减少值,而不是 var newValue = parseInt(inputToChangeValue) - parseInt(1);

$(document).ready(function() {

  $('button').on('click', function() {
    var buttonClass = $(this).attr('class');
    //console.log(buttonClass);
    var buttonID = $(this).attr('id');
    //console.log(buttonID);
    var dataProd = $(this).data('prod');
    var inputToChange = $('#' + dataProd);
    var inputToChangeValue = $('#' + dataProd).val();
    if (buttonClass == 'minus') {
      var newValue = --inputToChangeValue;
      if (newValue < 1) {
        $('.'+buttonClass).filter(function() { 
            return $(this).data("prod") == dataProd 
          }).prop('disabled', true);
        //$(buttonClass).data('prod="' + dataProd + '"').prop('disabled', true);
        //$(buttonClass + '.[data-prod="' + dataProd + '"]').attr(disabled=disabled); //.prop('disabled', true)
        //alert('NOPE');
      } else {
        $('#' + dataProd).val(newValue);
        //console.log(inputToChangeValue);
      }
    } else if (buttonClass == 'plus') {
      var newValue = parseInt(inputToChangeValue) + parseInt(1);
      $('.minus').filter(function() { 
            return $(this).data("prod") == dataProd 
          }).prop('disabled', false);
      if (newValue > 99) {
        alert('NOPPPPEE');
      } else {
        $('#' + dataProd).val(newValue);
        console.log(inputToChangeValue);
      }
    }
  });

});
.plus,
.minus {
  width: 10%;
  height: auto;
  background-color: #EF1B1F;
  border-radius: 50%;
  text-align: center;
  display: inline-block;
  cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="minus" data-prod="23">-</button>
<input type="number" class="qta" id="23" value="5">
<button class="plus" data-prod="23">+</button>
<br>
<button class="minus" data-prod="90">-</button>
<input type="number" class="qta" id="90" value="12">
<button class="plus" data-prod="90">+</button>

【讨论】:

  • +1 用于发现错误(我完全忘记了.)和建议--inputToChangeValue,但脚本也不起作用。现在它会禁用 all &lt;button class="minus"&gt;,而不仅仅是 data-prod="23"(例如);我想这种方式$('.' + buttonClass).data('prod', dataProd).prop('disabled', true); 不是实现我想要的正确方式。有什么线索吗?
  • 是的,使用这个:$(this).data('prod', dataProd).prop('disabled', true);。查看更新的答案。
  • 这绝对有效!谢谢亚历山德鲁。你能告诉我为什么$(this).data('prod', dataProd).prop('disabled', true); 有效但$(.minus).data('prod', dataProd).prop('disabled', true); 无效吗?因为我现在正试图重新启用按钮,以防值是 &gt; 1 使用完全 $(.minus).data('prod', dataProd).prop('disabled', false); 但结果是一团糟
  • @brigo, this 指的是点击的按钮。
  • @brigo,我使用filter 函数为您的问题更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
相关资源
最近更新 更多