Есть ли способ установить атрибут кнопок MouseEvent в Mozilla?

Я привык имитировать щелчки мышью в Javascript следующим образом:

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, document.view, 1, 1492, 398, 1308, 274, false, false, false, false, 0, null);
var element = document.getElementById("x:1430424820.87:chkState:0");
element.dispatchEvent(evt);

Хотя это и отправляет событие click, initMouseEvent() не устанавливает атрибут 'buttons' интерфейса MouseEvent, описанный в DOM 3:

[Constructor(DOMString typeArg, optional MouseEventInit mouseEventInitDict)]
interface MouseEvent : UIEvent {
    readonly    attribute long           screenX;
    readonly    attribute long           screenY;
    readonly    attribute long           clientX;
    readonly    attribute long           clientY;
    readonly    attribute boolean        ctrlKey;
    readonly    attribute boolean        shiftKey;
    readonly    attribute boolean        altKey;
    readonly    attribute boolean        metaKey;
    readonly    attribute short          button;
    readonly    attribute EventTarget?   relatedTarget;
    // Introduced in DOM Level 3
    readonly    attribute unsigned short buttons;
    boolean getModifierState (DOMString keyArg);
};

Добавление "evt.buttons = 1"...

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, document.view, 1, 1492, 398, 1308, 274, false, false, false, false, 0, null);
evt.buttons = 1;
var element = document.getElementById("x:1430424820.87:chkState:0");
element.dispatchEvent(evt);

... не имеет никакого эффекта. кто нибудь знает как это сделать?

2 ответа

Решение

С .createEvent() а также initEvent() (= устарело сейчас) вы используете способ старой школы. Вы можете создать и инициировать событие за один вызов конструктора событий (каждый тип события имеет свое собственное, например, KeyboardEvent, MouseEvent, ...), например так:

var evt = new MouseEvent('click', {
        button: 0,
        buttons: 1,
        bubbles: true,
        /* for all available properties see reference below */
    });
element.dispatchEvent(evt);

Создайте MouseEvent без init-object, чтобы увидеть значения свойств по умолчанию:

console.log(new MouseEvent('click'));

Ссылка MouseEvent здесь.

Большое спасибо за ответ. Это намного проще, чем то, что я в итоге делал:

   var evtInit = {};

// Event interface
Object.defineProperty(evtInit, 'bubbles', {writable: true, enumerable: true, configurable: true, value: true}, false);
Object.defineProperty(evtInit, 'cancelable', {writable: true, enumerable: true, configurable: true, value: true}, false);
Object.defineProperty(evtInit, 'currentTarget', {writable: true, enumerable: true, configurable: true, value: true}, false);
Object.defineProperty(evtInit, 'eventPhase', {writable: true, enumerable: true, configurable: true, value: true}, false);
Object.defineProperty(evtInit, 'target', {writable: true, enumerable: true, configurable: true, value: true}, false);
Object.defineProperty(evtInit, 'timeStamp', {writable: true, enumerable: true, configurable: true, value: true}, false);
Object.defineProperty(evtInit, 'type', {writable: true, enumerable: true, configurable: true, value: 2}, false);

// UIEvent interface
Object.defineProperty(evtInit, 'view', {writable: true, enumerable: true, configurable: true, value: null}, false);
Object.defineProperty(evtInit, 'detail', {writable: true, enumerable: true, configurable: true, value: 0}, false);

// MouseEvent interface
Object.defineProperty(evtInit, 'button', {writable: true, enumerable: true, configurable: true, value: 0}, false);
Object.defineProperty(evtInit, 'buttons', {writable: true, enumerable: true, configurable: true, value: 0}, false);
Object.defineProperty(evtInit, 'clientX', {writable: true, enumerable: true, configurable: true, value: 0}, false);
Object.defineProperty(evtInit, 'clientY', {writable: true, enumerable: true, configurable: true, value: 0}, false);
Object.defineProperty(evtInit, 'ctrlKey', {writable: true, enumerable: true, configurable: true, value: 0}, false);
Object.defineProperty(evtInit, 'screenX', {writable: true, enumerable: true, configurable: true, value: 0}, false);
Object.defineProperty(evtInit, 'screenY', {writable: true, enumerable: true, configurable: true, value: 0}, false);

// These two don't work. Don't know why.
Object.defineProperty(evtInit, 'mozPressure', {writable: true, enumerable: true, configurable: true, value: 1}, false);
Object.defineProperty(evtInit, 'mozInputSource', {writable: true, enumerable: true, configurable: true, value: MouseEvent.FOO}, true);


evtInit.screenX = 1506;
evtInit.screenY = 388;
evtInit.clientX = 1326;
evtInit.clientY = 273;
evtInit.buttons = 1;

var element = document.getElementById("element_id");

evt = new MouseEvent(eventType, evtInit);

Я думал, что должен был построить объект! Ну что ж.

Теперь, если я могу просто выяснить, как установить атрибут mozInputSource... (отдельный вопрос).

Другие вопросы по тегам