#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.