当jquery.trigger 2.2.1时,“e.stopImmediatePropagation不是函数”

时间:2016-03-09 08:56:24

标签: javascript jquery

因为更新到jQuery 2.2.1我在测试中遇到以下错误。

  

TypeError:e.stopImmediatePropagation不是函数

调用它的函数:

items.on('dragstart.h5s', function(e) {
  e.stopImmediatePropagation();

  if (options.dragImage) {
    _attachGhost(e.originalEvent, {
      item: options.dragImage,
      x: 0,
      y: 0
    });
    console.log('WARNING: dragImage option is deprecated' +
    ' and will be removed in the future!');
  } else {
    // add transparent clone or other ghost to cursor
    _getGhost(e.originalEvent, $(this), options.dragImage);
  }
  // cache selsection & add attr for dragging
  dragging = $(this);
  dragging.addClass(options.draggingClass);
  dragging.attr('aria-grabbed', 'true');
  // grab values
  index = dragging.index();
  draggingHeight = dragging.height();
  startParent = $(this).parent();
  // trigger sortstar update
  dragging.parent().triggerHandler('sortstart', {
    item: dragging,
    placeholder: placeholder,
    startparent: startParent
  });
});

测试测试的地方:

it('should correctly run dragstart event', function(){
  $ul.sortable({
    'items': 'li',
    'connectWith': '.test',
    placeholderClass: 'test-placeholder',
    draggingClass: 'test-dragging'
  });

  $li.trigger(jQuery.Event( 'dragstart', {
    originalEvent: {
      pageX: 100,
      pageY: 100,
      dataTransfer: {
        setData: function(val){
          this.data = val;
        }
      }
    }
  }));

  assert.equal($li.attr('aria-grabbed'),'true');
  assert.isTrue($li.hasClass('test-dragging'));

});

3 个答案:

答案 0 :(得分:2)

这里的问题是,因为您正在创建自己的originalEvent对象,而该对象没有与正常事件相关的方法。

当我们调用jQuery事件对象的stopImmediatePropagation方法时,它将尝试调用原始事件对象的相同方法,因为找不到该方法会导致错误。

此处一种可能的解决方案是创建custom event object

var event = document.createEvent('CustomEvent');
event.initEvent('dragstart', true, true);
event.pageX = 100;
event.pageY = 100;
event.dataTransfer = {
  setData: function(val) {
    this.data = val;
  }
};

$li.trigger(jQuery.Event(event));

演示:Fiddle

答案 1 :(得分:0)

将一个stopImmediatePropagation函数添加到您的originalEvent对象,因为它是根据these docs

尝试触发它的地方
  

某些事件可能具有特定于它们的属性。这些可以作为event.originalEvent对象的属性进行访问。

答案 2 :(得分:0)

简单可能是天真的解决方案:

if (event.stopImmediatePropagation)
    event.stopImmediatePropagation();