【问题标题】:Javascript Dojo/Dijit Radio Button On-Click Event Won't Fire if Same Button Clicked again如果再次单击相同的按钮,则不会触发 Javascript Dojo/Dijit 单选按钮单击事件
【发布时间】:2017-05-25 23:19:14
【问题描述】:

我可以创建带有点击事件的 Dijit 单选按钮,它们工作正常。但是,当再次单击同一个按钮(即当前选中的按钮)时,不会触发 on-click 事件。我怎样才能使它在再次单击当前选中的单选按钮时可以使用事件回调?

我正在使用 dijit/form/RadioButton"。

我按以下程序创建单选按钮:

var aRadioButton = new RadioButton({
  checked: someBooleanValue,
  value: someValue,
  name: someName,
  onClick: lang.hitch(this, buttonCallback) // This works, except for when same button is clicked.
});

【问题讨论】:

  • 如果不覆盖 _onClick method,则无法更改此行为,因为它旨在在检查或禁用无线电时抑制 onClick 事件

标签: javascript dojo dijit.form


【解决方案1】:

默认情况下,Dojo 不支持 RadioButton 的这种行为。

除了文件_RadioButtonMixin.js 中函数_onClick 的猴子路径之外,您还可以直接在dom 本身上添加一个事件侦听器,在此示例中,我在RadioButton 上使用focusNode

活生生的例子:

https://jsfiddle.net/gibbok/kwdy5gqc/

  require([
  "dojo/on",
  "dojo/parser",
  "dijit/form/RadioButton",
  "dijit/form/Button", // used for example purpose
  "dojo/domReady!"
], function(on, parser, RadioButton) {
  var radioOne = new RadioButton({
    checked: true,
    value: "tea",
    name: "drink"
  }, "radioOne");

  var radioTwo = new RadioButton({
    checked: false,
    value: "coffee",
    name: "drink"
  }, "radioTwo");

  var signal = on(radioOne.focusNode, "click", function(event) {
    // this code will fire when domNode is clicked
    alert('click on input tea');
  });

  var signal = on(radioTwo.focusNode, "click", function(event) {
    // this code will fire when domNode is clicked
    alert('click on input cafee');
  });


  parser.parse();
});

<form id="myform">
  <input type="radio" name="drink" id="radioOne" checked value="tea" />
  <label for="radioOne">Tea</label>
  <br />
  <input type="radio" name="drink" id="radioTwo" value="coffee" />
  <label for="radioTwo">Coffee</label>
  <br />

  <button data-dojo-type="dijit/form/Button" type="button">
    Show form submit value
    <script type="dojo/on" data-dojo-event="click">
      require(["dojo/dom"], function(dom){ with(dom.byId('myform'))with(elements[0])with(elements[checked?0:1])alert(name+'='+value); return false; });
    </script>
  </button>
</form>

【讨论】:

  • 您是否尝试过这种将事件分配给domNode 的替代解决方案?我看不到差异 - 检查无线电时,事件仍然被抑制。
  • @barbsan 感谢您的评论,请查看我的编辑 :)
  • 对,现在可以了。而不是长 radioOne.domNode.childNodes[0] 你也可以使用 radioOne.focusNode :)
猜你喜欢
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2016-04-25
  • 2012-09-12
  • 2019-06-22
  • 2014-08-08
相关资源
最近更新 更多