【问题标题】:d3.event is null inside of debounced functiond3.event 在 debounced 函数内为 null
【发布时间】:2015-02-27 19:48:04
【问题描述】:

当尝试使用去抖动版本的 mousemove 事件处理程序时,d3.eventnull。我想在这个去弹跳处理程序中使用d3.mouse 对象,但是d3.event 返回 null 并引发错误。如何在以下代码中访问d3.event

// a simple debounce function
function debounce(func, wait, immediate) {
  var timeout;
  return function() {
    var context = this, args = arguments;
    var later = function() {
      timeout = null;
      if (!immediate) {
        func.apply(context, args);
      }
    };
    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) {
      func.apply(context, args);
    }
  };
}

// the function to handle the mouse move
function handleMousemove ( context ) {
  var mouse = d3.mouse( context );
  console.log( mouse );
}

// create a debounced version
var debouncedHandleMousemove = debounce(handleMousemove, 250);

// set up the svg elements and call the debounced version on the mousemove event
d3.select('body')
    .append('svg')
    .append('g')
  .append('rect')
    .attr('width', 200)
    .attr('height', 200)
  .on('mousemove', function () {
      debouncedHandleMousemove( this );
  });

jsfiddle 如果您想看看它的实际效果。尝试将鼠标移动到 rect 元素上。

【问题讨论】:

    标签: javascript d3.js svg dom-events


    【解决方案1】:

    发生这种情况是因为 D3 在事件完成后删除了事件变量,因为当 debounce 被调用到延迟并且事件消失时,它会使用超时。

    要解决此问题,您可以使用 debounce 函数的修改版本来保存当前事件并在调用之前将其替换。

    function debounceD3Event(func, wait, immediate) {
      var timeout;
      return function() {
        var context = this;
        var args = arguments;
        var evt  = d3.event;
    
        var later = function() {
          timeout = null;
          if (!immediate) {
            var tmpEvent = d3.event;
            d3.event = evt;
            func.apply(context, args);
            d3.event = tmpEvent;
          }
        };
    
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) {
          var tmpEvent = d3.event;
          d3.event = evt;
          func.apply(context, args);
          d3.event = tmpEvent;
        }
    
      };
    }
    

    【讨论】:

    • 优秀的答案!解决了我的问题,非常感谢
    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2015-05-13
    • 2016-05-14
    • 2023-02-07
    相关资源
    最近更新 更多