javascript - 在 Dojo 中以编程方式更改按钮文本

标签 javascript dom dojo

到目前为止,这是我的代码:

dojoConfig = {parseOnLoad: true};

resetStopwatch();

require(["dojo/query", "dijit/form/ToggleButton", "dijit/form/Button", "dojo/dom", "dojo/dom-attr", "dojo/domReady!"], function(query, ToggleButton, Button, dom, domAttr){
  //query("#resume").style("display", "none");

  var timeUpdate, flag; 
  flag = false;

  new ToggleButton({
    showLabel: true,
    checked: false,
    onChange: function(val) {
      if (val) {
        this.set('label', 'Stop');

        var milliseconds = seconds = minutes = hours = 0;

        if(flag){
          // fetch current time in the stopwatch
          milliseconds = parseInt(domAttr.get("milliseconds", "innerHTML"));
          seconds      = parseInt(domAttr.get("seconds", "innerHTML"));
          minutes      = parseInt(domAttr.get("minutes", "innerHTML"));
          hours        = parseInt(domAttr.get("hours", "innerHTML"));
        }

        var startTime = new Date();
        timeUpdate = setInterval(function(){
          var timeElapsed = new Date().getTime() - startTime.getTime();

          // calculate hours                
          hours = parseInt(timeElapsed/1000/60/60);
          hours = prependZero(hours);
          domAttr.set("hours", "innerHTML", hours + " h ");

          // calculate minutes
          minutes = parseInt(timeElapsed/1000/60);
          if(minutes > 60)
            minutes = minutes % 60;
          minutes = prependZero(minutes);
          domAttr.set("minutes", "innerHTML", minutes + " m ");

          // calculate seconds
          seconds = parseInt(timeElapsed/1000);
          if(seconds > 60)
            seconds = seconds % 60;
          seconds = prependZero(seconds);
          domAttr.set("seconds", "innerHTML", seconds + " s ");

          // calculate milliseconds 
          milliseconds = timeElapsed;
          milliseconds = prependZero(milliseconds);
          if(milliseconds > 1000)
            milliseconds = milliseconds % 1000;
          if(milliseconds < 10)
            milliseconds = "00" + milliseconds.toString();
          else if(milliseconds < 100)
            milliseconds = "0" + milliseconds.toString();                
          domAttr.set("milliseconds", "innerHTML", milliseconds + " milli");

        },25);  // updated time after every 25ms

      } else {
        this.set('label', 'Resume');
        clearInterval(timeUpdate);
      }
    },
    label: "Start"
  }, "start_stop");

  /*var resumeButton = new Button({
        label: "Resume",
        onClick: function(){
            //clearInterval(timeUpdate);
            //resetStopwatch();        
        }
    }, "resume");  */  

  var resetButton = new Button({
    label: "Reset",
    onClick: function(){
      domAttr.set("start", 'label', "Start");
      clearInterval(timeUpdate);
      resetStopwatch();        
    }
  }, "reset");
});

function resetStopwatch(){
  require(["dojo/dom-attr"], function(domAttr){
    domAttr.set("hours",        "innerHTML", "00 h ");
    domAttr.set("minutes",      "innerHTML", "00 m ");
    domAttr.set("seconds",      "innerHTML", "00 s ");
    domAttr.set("milliseconds", "innerHTML", "000 milli");
  });
}

function prependZero(time){
  if(time < 10){
    time = "0" + time.toString();
    return time;
  }
  else
    return time;
}
#stopwatch, #buttons{
  text-align: center;
}

.claro *
{
  outline: none;
}
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"></script>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.9.1/dijit/themes/claro/claro.css">

<div id="stopwatch">
  <span id="hours"></span>
  <span id="minutes"></span>
  <span id="seconds"></span>
  <span id="milliseconds"></span>
</div>
<div id="buttons" class="claro">
  <button id="start_stop"></button>
  <!--<button id="resume"></button>-->
  <button id="reset"></button>
</div>

考虑这个用例:单击Start > 一段时间后,单击Reset - 我打算将标签从Stop 更改为Start 再次返回。所以,我做了:

domAttr.set("start", 'label', "Start");   // line # 83

但是它抛出一个错误:

Uncaught TypeError: Cannot call method 'setAttribute' of null 

不确定我在这里做错了什么。请帮忙!

最佳答案

在 Dojo 中,小部件和 DOM 节点之间存在差异。您的开始按钮是一个小部件,因此使用 DOM 节点设置该小部件的标签将不起作用。要更改小部件的标签,您首先需要使用 dijit/registry 模块或通过引用您的小部件 (ToggleButton) 来检索小部件实例。

之后你可以使用合适的setter更改小部件的标签。

在您的情况下,最好的办法是创建对新 ToggleButton 的本地引用,例如:

var startBtn = new ToggleButton({
    /** Your code */
});

然后执行以下操作:

startBtn.set("label", "Start");

像往常一样,我也更新了你的JSFiddle .


如果您想使用 dijit/registry 模块(现在不需要),您可以使用小部件 ID(或 DOM ID)获取对小部件的引用,方法是: :

require(["dijit/registry"], function(registry) {
    registry.byId("start_stop").set("label", "Start");
});

但是,在这种情况下它没有用,因为您有一种更简单的方法来引用您的小部件,但请记住它以供将来引用(或者如果您开始使用声明性小部件)。

关于javascript - 在 Dojo 中以编程方式更改按钮文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21040671/

相关文章:

javascript - ReactJS - 将对象键和值作为 props 传递给 div

javascript打开新标签,无法从新标签中获取标签和属性,但只能获取null

javascript - JS - 为对象中的每个 Dom 元素分配一个值

javascript - 如何为 DOJO 中的特定 url 模拟 dojo.data.ItemFileReadStore?

dojo - 工作 dojox.storage 和示例在哪里?

javascript - 想在使用 WshShell.Exec 方法时隐藏命令提示符窗口

javascript - 我应该如何在 javascript 或 nodeJs 中验证电子邮件地址是否存在和域名是否存在?

javascript - 类型错误:无法从未定义中读取属性 "0"

Javascript 在停止窗口加载后显示一些内容

forms - 使用 Dojo 富文本编辑器提交表单