在javascript中模拟鼠标点击时如何设置目标属性?

时间:2014-11-24 15:16:58

标签: javascript dojo mouseevent

我想在使用dojo的javascript代码中模拟鼠标点击。使用带有“ondijitclick”的dojo-stuff注册真正鼠标点击的动作。

我知道调用哪个方法/函数,并且我还有dijit对象来调用此方法。该方法需要一个函数对象作为参数,所以我正在创建一个新的MouseEvent对象。这一切都很好,除了我需要设置此事件的目标值,我无法弄清楚如何做到这一点。这是必需的,因为后来的异常处理正在访问target-property,我无法避免这种情况。

到目前为止我的代码:

    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仍然为null。如果将target属性检查为null,并且如果它为null,则在窗口小部件方法中使用relatedTarget,一切都可以正常工作。模拟的点击和真正的点击都正常工作。

此解决方案的唯一问题是我必须在框架中修改窗口小部件。这是我们在发布版本中不会做的事情。这是一个可能的解决方案,但实际上这个解决方案对我们来说是不可接受的。

因此,仍然存在如何使用正确的值设置target属性的问题。正如解决方案在genereal中显示的那样,除了设置target属性外,它都可以工作。

我看不出这是在Ferry Kranenburg提出的解决方案中实现的。如果这个解决方案能够满足我的需求,那么如果有人可以向我解释这个技巧,那就太好了。

2 个答案:

答案 0 :(得分:9)

初始化事件时,无法访问事件对象的target属性。它指向触发事件后接收事件的第一个元素,并由JavaScript内部设置到该元素。因此,如果您需要一个特殊元素作为事件目标,则必须将事件分派给该元素。

一种方法是使用您自己的方法覆盖本机目标属性,但这可能会影响事件的冒泡行为。

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);
});

答案 1 :(得分:0)

您需要先创建一个事件。 See here如何模拟鼠标事件。