Запуск щелчка правой кнопкой мыши с использованием чистого Javascript

#javascript

#javascript

Вопрос:

Как я могу вручную вызвать щелчок правой кнопкой мыши с помощью Javascript?

Я могу сделать это с помощью jQuery, но в этом случае я могу использовать только чистый Javascript.

Комментарии:

1. что вы имеете в виду под захватом щелчка правой кнопкой мыши или только по определенному элементу?

2. Я не хочу фиксировать событие, я хочу вызвать событие щелчка правой кнопкой мыши по данному элементу.

3. Тогда как вы это делаете с помощью jQuery?

Ответ №1:

Создайте событие с помощью CustomEvent конструктора или (если он не поддерживается), создайте событие, используя document.createEvent в качестве аргумента строку «HTMLEvents» (потому что вы собираетесь создать click событие). Затем используйте initEvent метод для создания click события.

Наконец, используйте dispatchEvent метод для запуска события. Если вы используете IE, fireEvent вместо этого следует использовать метод.

Если вы хотите запустить событие contextmenu rightclick, используйте приведенный ниже код:

 var element = document.getElementById('yourElement');
if (window.CustomEvent) {
    element.dispatchEvent(new CustomEvent('contextmenu'));
} else if (document.createEvent) {
    var ev = document.createEvent('HTMLEvents');
    ev.initEvent('contextmenu', true, false);
    element.dispatchEvent(ev);
} else { // Internet Explorer
    element.fireEvent('oncontextmenu');
}
  

Комментарии:

1. @Abs, каким-то образом я интерпретировал «щелчок правой кнопкой мыши» как «правильно реализовать щелчок». Обновление ответа через секунду, концепция та же. РЕДАКТИРОВАТЬ Вы имеете в виду contextmenu событие или реальный щелчок правой кнопкой мыши?

2. спасибо за ссылку — но, похоже, у меня это не работает? Я пробовал это в нескольких браузерах. Вот пример: jsfiddle.net/9gbd4

3. @Abs Вы должны вызвать dispatchEvent метод для элемента, который должен получить событие щелчка правой кнопкой мыши. Вместо click этого вы должны использовать mousedown , потому click что событие обычно не фиксирует события щелчка правой кнопкой мыши. Скрипка: jsfiddle.net/9gbd4/1 . Примечание: Если вы собираетесь отображать контекстное меню с помощью JavaScript, откажитесь. JavaScript не может вызвать такое поведение.

4. @RobW Я считаю, что вы можете, на самом деле, вызвать собственное контекстное меню браузера, запустив это событие. На самом деле я сделал и протестировал именно это. Насколько я могу судить, сложность заключается в том, что вы можете сделать это только во время другого события мыши. В частности, я смог остановить событие щелчка правой кнопкой мыши на одном элементе и в том же обработчике запустить контекстное меню для другого элемента. Надеюсь, это поможет.

5. @Patrick Я был бы рад увидеть демонстрацию. Следующая демонстрация, основанная на предыдущей демонстрации и ваших подсказках, не показывает контекстное меню (Chrome 21): jsfiddle.net/9gbd4/2

Ответ №2:

Другой вариант, на этот раз с использованием MouseEvent API, который немного более современный. В моем случае я фактически отправляю все три события mouseup / mousedown / contextmenu:

 var element = document.getElementById("yourElement");
var ev1 = new MouseEvent("mousedown", {
    bubbles: true,
    cancelable: false,
    view: window,
    button: 2,
    buttons: 2,
    clientX: element.getBoundingClientRect().x,
    clientY: element.getBoundingClientRect().y
});
element.dispatchEvent(ev1);
var ev2 = new MouseEvent("mouseup", {
    bubbles: true,
    cancelable: false,
    view: window,
    button: 2,
    buttons: 0,
    clientX: element.getBoundingClientRect().x,
    clientY: element.getBoundingClientRect().y
});
element.dispatchEvent(ev2);
var ev3 = new MouseEvent("contextmenu", {
    bubbles: true,
    cancelable: false,
    view: window,
    button: 2,
    buttons: 0,
    clientX: element.getBoundingClientRect().x,
    clientY: element.getBoundingClientRect().y
});
element.dispatchEvent(ev3);
  

Ответ №3:

Например, я не пробовал, но вам нужно создать объект event и передать его при запуске события. для события передачи щелчка правой кнопкой мыши.кнопка = 2;

 var element = document.getElementById("yourElement"),
  ev;
if(document.createEvent ) {
    ev = document.createEvent("MouseEvents");
    ev.initMouseEvent("click", true, false, window,0,0,0,0,0,false,false,false,false,2,null);
    element.dispatchEvent(ev);
} else {
    ev = document.createEventObject();
    ev.button = 2;
    element.fireEvent('onclick', ev);
}
  

Обновлено в соответствии с mdn initMouseEvent.
Удачи 🙂

Комментарии:

1. ev.which не может быть изменен, так как это свойство доступно только для чтения (по крайней мере, в Firefox 3.6.23).

2. Вы были правы, это кнопка, но я не уверен, что она это делает. поскольку я понятия не имею, что такое @Abs после

3. @Abs он работает как в IE, так и в любом другом браузере, который я проверил. захваченный объект события будет установлен с помощью button = 2

4. @Rob W По какой-то странной причине тогда этот код работает. и ev.button в случае с Mozilla — это левый. Но я проверил, этот код работает, дважды проверил его.

5. Я попробовал это в Firefox 3.2, и я получаю ошибку setting a property that has only a getter в моем firebug.