如何在dijit/formHorizontalSlider上检测onMoveStart和onMoveStop

How to detect onMoveStart and onMoveStop on dijit/form/HorizontalSlider?

本文关键字:检测 onMoveStart onMoveStop formHorizontalSlider dijit      更新时间:2023-09-26

我使用的是dojo 1.10.4,我需要在dijit/form/HorizontalSlider内部的"内部滑块元素"上检测事件onMouseStartonMouseStop

目前,我正试图检测对象_movable(它是一个dojo/dnd/Moveable),但没有成功,出现错误:

Moveable.js:11 Uncaught TypeError: Cannot read property 'style' of undefined
  • 如何在HorizontalSlider上收听onMouseStartonMouseStop
  • 或者,您知道检测用户何时开始是否结束滑动的更好方法吗

现场示例:https://jsfiddle.net/9uo1doan/

require([
  "dojo/dom",
  "dijit/form/HorizontalSlider",
  "dijit/form/TextBox",
  "dojo/domReady!"
], function(dom, HorizontalSlider, TextBox) {
  var slider = new HorizontalSlider({
    name: "slider",
    value: 5,
    minimum: -10,
    maximum: 10,
    intermediateChanges: true,
    style: "width:300px;",
    onChange: function(value) {
      dom.byId("sliderValue").value = value;
    }
  }, "slider");
  slider._movable.onMoveStart(function(event) {
    console.log('onMoveStart');
  });
  slider._movable.onMoveStop(function(event) {
    console.log('onMoveStop');
  });
  slider._movable.onFirstMove(function(event) {
    console.log('onFirstMove');
  });
  slider._movable.onMove(function(event) {
    console.log('onMove');
  });
  slider._movable.onMoving(function(event) {
    console.log('onMoving');
  });
  slider._movable.onMoved(function(event) {
    console.log('onMoved');
  });
});

<div id="slider"></div>
<p>
  <input type="text" id="sliderValue" data-dojo-type="dijit/form/TextBox" />

参考:https://dojotoolkit.org/reference-guide/1.10/dojo/dnd/Moveable.html


我也尝试过,但没有成功:

  on(slider._movable, 'moveStart', function(e){});

我能够使用dojo/aspect解决此问题。

基本上,我找到的解决方案是在dojo/dnd/Moveable上执行方法onMoveStart后运行我的函数。

我仍然有兴趣理解为什么一个更传统的事件监听器方法没有奏效。

现场演示:https://jsfiddle.net/8z6sm14j/

require([
  "dojo/dom",
  "dojo/on",
  "dojo/aspect",
  "dijit/form/HorizontalSlider",
  "dijit/form/TextBox",
  "dojo/domReady!"
], function(dom, on, aspect, HorizontalSlider, TextBox) {
  debugger
  var slider = new HorizontalSlider({
    name: "slider",
    value: 5,
    minimum: -10,
    maximum: 10,
    intermediateChanges: true,
    style: "width:300px;",
    onChange: function(value) {
      dom.byId("sliderValue").value = value;
    }
  }, "slider");
    var result = document.getElementById('result');
  aspect.after(slider._movable, 'onMoveStart', function(event) {
    console.log('onMoveStart');
    result.innerHTML = 'onMoveStart';
  });
  aspect.after(slider._movable, 'onMoveStop', function(event) {
    console.log('onMoveStop');
    result.innerHTML = 'onMoveStop';
  });
});

<div id="slider"></div>
<input type="text" id="sliderValue" data-dojo-type="dijit/form/TextBox" />
<div id="result"></div>

只是为了参考,我在看了这个模块后才想出了这个解决方案。