【问题标题】:use Dojo to detect if all checkboxes are unchecked, disable a button使用 Dojo 检测是否所有复选框都未选中,禁用按钮
【发布时间】:2016-07-06 16:51:41
【问题描述】:

我有一组复选框和一个查询按钮,因此用户可以检查一些内容并单击查询按钮进行服务调用以返回记录。如果没有选中任何复选框,如何禁用 QUERY 按钮?

以下是我编写的代码。当我第一次取消选中所有这些时,QUERY 按钮被禁用。但是当我再次只选中一个复选框时,“未选中”数组变为空。请帮忙!

      _bindChkChangeEvent: function(){
            var unchecked = []; 
            on(query('.chk'), 'change', lang.hitch(this, function(event) {
                if(!event.target.checked){
                    if(unchecked.indexOf(event.target.id) < 0)
                        unchecked.push(event.target.id);
                }
                else{
                    if(unchecked.indexOf(event.target.id) > -1)
                        unchecked.splice(event.target.id);
                }
 
                this._switchQueryBtn(unchecked); 
            }));
        },

        _switchQueryBtn: function(unchecked){
             if(unchecked.length == 10)
                    html.addClass(this.btnQuery, 'disabled');
             else
                    html.removeClass(this.btnQuery, 'disabled');
        },

【问题讨论】:

  • 在我进行以下更改后工作:unchecked.splice(event.target.id);到 unchecked.splice(unchecked.indexOf(event.target.id), 1);

标签: javascript checkbox dojo onchange


【解决方案1】:

在以下链接中的一个工作示例中,您可以尝试在您的代码中采用此概念(不幸的是,该问题仅包含部分代码视图)。

https://jsfiddle.net/zmh7bbrf/

脚本的作用:

  • 以编程方式创建两个复选框。
  • 以编程方式创建按钮。
  • 为每个复选框添加事件处理程序onChange
  • 函数showHideButton实际上包含显示或隐藏按钮的逻辑。
  • 现在,当页面加载时,两个复选框都未选中,showHideButton 运行并且按钮被禁用。
  • 当用户点击一个复选框时,重新运行函数showHideButton
  • 此时条件不满足,因为现在选中了一个复选框,所以重新启用按钮。

脚本可以使用任意数量的复选框,只需添加它们的引用并修改showHideButton函数中的逻辑。

注意事项: 您可以使用 dijit/registry 查找小部件的引用,而不是使用 dojo/query 并直接查询 DOM,就像您原始问题中的代码一样。

更多关于dijit/registry的信息可以在这里找到: https://dojotoolkit.org/reference-guide/1.10/dijit/registry.html


require(["dijit/form/CheckBox", "dijit/registry", "dijit/form/Button", "dojo/domReady!"], function(CheckBox, registry, Button) {
  new CheckBox({
    id: "checkBox0",
    name: "checkBox0",
    value: "option0",
    checked: false,
    onChange: function(event) {
      showHideButton();
    }
  }, "checkBox0").startup();
  new CheckBox({
    id: "checkBox1",
    name: "checkBox1",
    value: "option1",
    checked: false,
    onChange: function(event) {
      showHideButton();
    }
  }, "checkBox1").startup();
  new Button({
    label: "Click me!",
    onClick: function() {;
    }
  }, "button").startup();

  var showHideButton = function() {
    var checkBox0 = registry.byId('checkBox0'),
      checkBox1 = registry.byId('checkBox1'),
      button = registry.byId('button');
    if (!checkBox0.checked && !checkBox1.checked) {
      button.set('disabled', true);
    } else {
      button.set('disabled', false);
    }
  };
  showHideButton();

});

<input id="checkBox0" />
<label for="checkBox">Option 0</label>
<br>
<input id="checkBox1" />
<label for="checkBox">Option 1</label>
<br>
<button id="button" type="button"></button>

【讨论】:

  • 感谢您的回复。我看到了你的代码的想法。但就我而言,我有十几个复选框,按类查询复选框然后循环遍历它们似乎更容易。
  • @AlexW 我理解你的意思,或者你可以使用 registry.toArray() 来循环考虑你所有的小部件,然后只选择选中的复选框并在那里应用你的逻辑。
猜你喜欢
  • 2018-02-09
  • 2012-12-08
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2018-04-14
  • 1970-01-01
  • 2018-11-07
相关资源
最近更新 更多