我想在使用 dojo 的 javascript 代码中模拟鼠标点击。真正的鼠标点击 Action 将使用带有“ondijitclick”的dojo-stuff 进行注册。
我知道哪个方法/函数被调用,我也有 dijit 对象来调用这个方法。该方法需要一个函数对象作为参数,因此我创建了一个新的 MouseEvent 对象。这一切都很好,只是我需要设置此事件的目标值,但我不知道该怎么做。这是必需的,因为稍后的异常处理正在访问目标属性,我无法避免这一点。
到目前为止我的代码:
dojo.query(".mybutton").forEach(function (node) {
var target = dojo.query(".myclass").parents("#" + node.id)[0];
var event = new MouseEvent('click', {
'view' : window,
'bubbles': true,
'cancelable': true
});
dijit.byId(node.id)._doEvent(event);
});
如果我添加以下行
'target' : target,
在创建 MouseEvent 时,不会设置该属性(但会设置所有其他属性)并且 target-property 将为 null,但 target 本身不为 null。
是否有可能以某种方式设置目标属性?如果可能的话,我想知道我做错了什么?
编辑:
我找到了一个非常肮脏的解决方案,其中包括来自底层框架的小部件的最小但不希望的更改。
我只能实现 relatedTarget
属性已设置,而 target
仍然为空。如果检查 target
属性是否为 null,如果它为 null,则采用 widgets 方法中的 relatedTarget
一切正常。模拟点击和真实点击都正常。
此解决方案的唯一问题是我必须修改框架中的小部件。这是我们在发布构建中不会做的事情。这是一般情况下可能的解决方案,但实际上这种解决方案对我们来说是 Not Acceptable 。
因此仍然存在如何为 target
属性设置正确值的问题。正如解决方案所示,除了设置 target
属性外,它都可以正常工作。
我看不出这是在 Ferry Kranenburg 提出的解决方案中实现的。如果这个解决方案可以满足我的需要,那么如果有人能向我解释这个技巧就太好了。
最佳答案
初始化事件时,无法访问事件对象的target
属性。它指向事件触发后接收事件的第一个元素,并由 JavaScript 在内部设置为该元素。因此,如果您需要一个特殊元素作为事件目标,您必须将事件分派(dispatch)给该元素。
一种方法是用您自己的方法覆盖 native 目标属性,但这可能会影响事件的冒泡行为。
dojo.query(".mybutton").forEach(function (node) {
var target = dojo.query(".myclass").parents("#" + node.id)[0];
var event = new MouseEvent('click', {
'view' : window,
'bubbles': true,
'cancelable': true
});
Object.defineProperty(event, 'target', {value: target, enumerable: true});
dijit.byId(node.id)._doEvent(event);
});
关于javascript - 在javascript中模拟鼠标点击时如何设置目标属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27108094/