【问题标题】:Activate a combobox from a checkbox using google closure使用谷歌关闭从复选框激活组合框
【发布时间】:2013-09-11 04:49:21
【问题描述】:

我在对话框中有一组带有 ID 的 user1、user2 等的复选框,还有一组带有 ID 的 usersel1、usersel2 等的组合框。当复选框被选中时(假设 ID 为 user1),则必须激活相应的组合框(即 ID 为 usersel1 的组合框)。我有以下代码并且不工作。我如何实现这种行为?

for(var g=0;g<userlist.length;g++) //userlist.length give no of users
    b2 = (goog.dom.getElement('usersel'+(g+1))); //gets combo box
     //listening if check box is clicked
     goog.events.listen(goog.dom.getElement('user'+(g+1)),
        goog.events.EventType.CLICK,
         function(e) {
         b2.disabled = (false); // trying to enable corresponding combo box
     });

上面这段代码的问题是任何复选框被点击,只有最后一个组合框被激活。

【问题讨论】:

标签: javascript google-closure-compiler google-closure google-closure-library


【解决方案1】:

有几个问题。

首先,for 循环仅适用于第二行,而不适用于整个块。

第二,创建闭包的方式不对(见here)。值 b2 不会像您想象的那样传播到事件处理程序中。

如果这样改写就可以了:

for (var g=0;g<userlist.length;g++) { //userlist.length give no of users
  b2 = goog.dom.getElement('usersel'+(g+1)); //gets combo box
  //listening if check box is clicked
  goog.events.listen(goog.dom.getElement('user'+(g+1)), 
    goog.events.EventType.CLICK, 
    makeEventHandler(b2)
  );
}

function makeEventHandler(element) {
  return function(e) {
    element.disabled = false;
  }
}

【讨论】:

  • 效果很好!!!!!!当复选框被取消选中时,组合框需要被禁用,所以我们应该添加另一个监听器吗?
  • 另一个问题是listen函数只有在脚本第一次加载时才起作用,第二次调用对话框而不重新加载listen函数不起作用。
  • 第一个问题。您可以在同一个事件处理程序中处理此问题,无需添加另一个侦听器。您只需检查复选框的状态,然后根据它启用或禁用选择元素。第二个问题。当您运行此脚本时,它会将事件处理程序添加到所有现有元素。如果您稍后添加更多元素,您显然也需要为这些添加事件处理程序。
  • 可以完成第一个任务,例如这样:element.disabled = !e.currentTarget.checked;
  • 第二个问题:当我点击一个按钮时,我得到了对话框。当我第一次这样做时,侦听器事件起作用,而从第二次单击按钮时(不重新加载)它就不起作用了。
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多