如何使用jQuery发布dragstart事件
How to issue a dragstart event with jQuery?
我有一个类似的事件:
$(document).on('dragstart', '#' + gridID + ' tr.rgRow, #' + gridID + ' tr.rgAltRow ', function (ev) {
console.log(ev);
});
我想发布一个dragstart
事件,如下所示:
$(".rgRow > td, .rgAltRow > td").filter(function() {
return $(this).text().trim() === "UTT000000899103";
}).parent().dragstart();
parent()
找到正确的tr
,但dragstart
未定义。那么,我应该如何处理呢?
编辑:
根据a.Wolff的评论,我尝试过.parent().trigger('dragstart')
,但出现了错误。现在我这样尝试:
$(document).on('dragstart', '#' + gridID + ' tr.rgRow, #' + gridID + ' tr.rgAltRow ', function (ev) {
console.log(ev);
var e = ev.originalEvent;
e.dataTransfer.effectAllowed = 'move';
});
和
$(".rgRow > td, .rgAltRow > td").filter(function() {
return $(this).text().trim() === "UTT000000899103";
}).parent().trigger("dragstart");
但是我得到了一个错误,因为ev.originalEvent.dataTransfer
就是undefined
。所以我想知道我应该如何定义originalEvent
。
第2版:
我一直在尝试这个代码:
$(".rgRow > td, .rgAltRow > td").filter(function() {
return $(this).text().trim() === "UTT000000899103";
}).parent()[0].dispatchEvent(new Event("dragstart"));
它返回true
,但不运行.on()
中定义的处理程序。
第3版:
我已经成功地调用了dispatchEvent()
,它将由如下处理程序执行:
$(".rgRow > td, .rgAltRow > td").filter(function() {
return $(this).text().trim() === "UTT000000899103";
}).parent()[0].dispatchEvent(new CustomEvent("dragstart", {
bubbles: true,
dataTransfer: {}
}));
由于bubbles: true
而被执行。然而,错误是:
未捕获的类型错误:无法设置未定义的属性"effectAllowed">
第4版:
根据A.Wolff的评论,我尝试了这个代码:
var dragEvent = document.createEvent("HTMLEvents"); dragEvent.initEvent("dragstart", true, true);
dragEvent = $.extend(dragEvent, {dataTransfer: {effectAllowed: null}});
$(".rgRow > td, .rgAltRow > td").filter(function() { return $(this).text().trim() === "UTT000000899103"; }).parent().each(function(){ this.dispatchEvent(dragEvent); });
这几乎解决了问题。唯一缺少的是,我需要在处理程序中调用dataTransfer.setData
,如下所示:
e.dataTransfer.setData('text', JSON.stringify(data));
其中CCD_ 14是初始化的JSON。
我已经用这个function
:解决了我的问题
TT.CustomEvent = function () {
var me = this;
var overrideMode = false;
var customEvents = [];
this.getEvent = function(type, data) {
if ((!customEvents[type]) || (overrideMode)) {
var event = document.createEvent("HTMLEvents");
event.initEvent(type, true, true);
event = $.extend(event, {
dataTransfer: {
effectAllowed: null,
setData: function (key, value) {
if (!event.data) {
event.data = {};
}
event.data[key] = value;
},
getData: function (key) {
if (event.data) {
return event.data[key];
}
}
}
});
customEvents[type] = event;
}
if (data) {
customEvents[type].dataTransfer.setData(data.key, data.value);
}
return customEvents[type];
}
this.dispatchEvent = function (target, event, data) {
overrideMode = true;
var currentEvent = me.getEvent(event, data);
target.each(function () {
this.dispatchEvent(me.getEvent(event, data));
});
overrideMode = false;
}
};
使用这个,我可以调用getEvent
,它返回某个类型的最后一个事件,或者dispatchEvent
,它将生成一个新的特定类型的event
并将其调度。我有一个dragstart
事件,它将使用setData
将一个具有关键字'text'
和特定JSON值的元素写入dataTransfer
。示例用法:
customEvent.dispatchEvent(woContext, "dragstart");
techListWindow.dispatchEvent(selectedTech["Tech Name"], "drop", {key: "text", value: customEvent.getEvent("dragstart").dataTransfer.getData("text")});
customEvent.dispatchEvent(woContext, "dragend");
其中woContext
是一个jquery结果,techListWindow
在iframe
或一个单独的选项卡中,具有如下功能:
function dispatchEvent(target, event, data) {
customEvent.dispatchEvent($("#techTable .row .tooltip-link").filter(function() {
return $(this).text().trim() === target.trim();
}).parent(), event, data);
}
它运行良好。
- 分派点击事件并保留击键修饰符
- 模糊事件的Javascript测试
- keyup事件处理程序更改焦点不适用于快速键入
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 如何使Javascript动态html表及其上的事件
- 使用类从一个标记中双击事件
- 如何在未直接触发的情况下停止事件
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 对iPad上的点击事件反应缓慢
- 事件和状态
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- 从控制器返回后Ajax启动事件激发
- 如何从画布上的某个移动事件中获取X和Y
- Jquery:未触发select事件
- JQuery:更改dragstart事件上的DOM会立即触发dragend
- 事件.数据传输和事件.在dragstart事件处理程序中,originalEvent总是null
- 如何使用jQuery发布dragstart事件
- Firefox:dragstart事件不会在超链接的子级中触发
- 为什么不是't触发dragstart事件