因为更新到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'));
});
答案 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();