admin管理员组文章数量:1130232
I know about the document.form.button.click()
method. However, I'd like to know how to simulate the onclick
event.
I found this code somewhere here on Stack Overflow, but I don't know how to use it :(
function contextMenuClick()
{
var element= 'button';
var evt = element.ownerDocument.createEvent('MouseEvents');
evt.initMouseEvent('contextmenu', true, true, element.ownerDocument.defaultView,
1, 0, 0, 0, 0, false, false, false, false, 1, null);
element.dispatchEvent(evt);
}
How do I fire a mouse click event using JavaScript?
I know about the document.form.button.click()
method. However, I'd like to know how to simulate the onclick
event.
I found this code somewhere here on Stack Overflow, but I don't know how to use it :(
function contextMenuClick()
{
var element= 'button';
var evt = element.ownerDocument.createEvent('MouseEvents');
evt.initMouseEvent('contextmenu', true, true, element.ownerDocument.defaultView,
1, 0, 0, 0, 0, false, false, false, false, 1, null);
element.dispatchEvent(evt);
}
How do I fire a mouse click event using JavaScript?
Share Improve this question edited Nov 20, 2024 at 6:58 DarkBee 15.8k8 gold badges69 silver badges110 bronze badges asked May 27, 2011 at 21:33 Nok ImchenNok Imchen 2,8427 gold badges36 silver badges59 bronze badges 4- 3 What are you trying to achieve by doing so? – Eric Commented May 27, 2011 at 21:34
- @Nok Imchen - Could you provide a link to the original question you got the code from? – Jared Farrish Commented May 27, 2011 at 21:40
- @Eric, its the same as the link given below – Nok Imchen Commented May 27, 2011 at 21:44
- @jared, here is the link stackoverflow.com/questions/433919/… – Nok Imchen Commented May 27, 2011 at 21:44
9 Answers
Reset to default 238(Modified version to make it work without prototype.js)
function simulate(element, eventName) {
var options = extend(defaultOptions, arguments[2] || {});
var oEvent, eventType = null;
for (var name in eventMatchers) {
if (eventMatchers[name].test(eventName)) {
eventType = name;
break;
}
}
if (!eventType)
throw new SyntaxError('Only HTMLEvents and MouseEvents interfaces are supported');
if (document.createEvent) {
oEvent = document.createEvent(eventType);
if (eventType == 'HTMLEvents') {
oEvent.initEvent(eventName, options.bubbles, options.cancelable);
} else {
oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView,
options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element);
}
element.dispatchEvent(oEvent);
} else {
options.clientX = options.pointerX;
options.clientY = options.pointerY;
var evt = document.createEventObject();
oEvent = extend(evt, options);
element.fireEvent('on' + eventName, oEvent);
}
return element;
}
function extend(destination, source) {
for (var property in source)
destination[property] = source[property];
return destination;
}
var eventMatchers = {
'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,
'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/
}
var defaultOptions = {
pointerX: 0,
pointerY: 0,
button: 0,
ctrlKey: false,
altKey: false,
shiftKey: false,
metaKey: false,
bubbles: true,
cancelable: true
}
document.getElementById("btn").addEventListener("click", function(e)
{
console.log("clicked", e.screenX, e.screenY);
});
simulate(document.getElementById("btn"), "click");
simulate(document.getElementById("btn"), "click", { pointerX: 123, pointerY: 321 });
<button id="btn">Click me</button>
Note that as a third parameter you can pass in 'options'. The options you don't specify are taken from the defaultOptions (see bottom of the script). So if you for example want to specify mouse coordinates you can do something like:
simulate(document.getElementById("btn"), "click", { pointerX: 123, pointerY: 321 })
You can use a similar approach to override other default options.
Credits should go to kangax. Here's the original source (prototype.js specific).
An easier and more standard way to simulate a mouse click would be directly using the event constructor to create an event and dispatch it.
Though the
MouseEvent.initMouseEvent()
method is kept for backward compatibility, creating of a MouseEvent object should be done using theMouseEvent()
constructor.
var evt = new MouseEvent("click", {
view: window,
bubbles: true,
cancelable: true,
clientX: 20,
/* whatever properties you want to give it */
});
targetElement.dispatchEvent(evt);
Demo: http://jsfiddle.net/DerekL/932wyok6/
This works on all modern browsers. For old browsers including IE, MouseEvent.initMouseEvent
will have to be used unfortunately though it's deprecated.
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", canBubble, cancelable, view,
detail, screenX, screenY, clientX, clientY,
ctrlKey, altKey, shiftKey, metaKey,
button, relatedTarget);
targetElement.dispatchEvent(evt);
Here's a pure JavaScript function which will simulate a click (or any mouse event) on a target element:
function simulatedClick(target, options) {
var event = target.ownerDocument.createEvent('MouseEvents'),
options = options || {},
opts = { // These are the default values, set up for un-modified left clicks
type: 'click',
canBubble: true,
cancelable: true,
view: target.ownerDocument.defaultView,
detail: 1,
screenX: 0, //The coordinates within the entire page
screenY: 0,
clientX: 0, //The coordinates within the viewport
clientY: 0,
ctrlKey: false,
altKey: false,
shiftKey: false,
metaKey: false, //I *think* 'meta' is 'Cmd/Apple' on Mac, and 'Windows key' on Win. Not sure, though!
button: 0, //0 = left, 1 = middle, 2 = right
relatedTarget: null,
};
//Merge the options with the defaults
for (var key in options) {
if (options.hasOwnProperty(key)) {
opts[key] = options[key];
}
}
//Pass in the options
event.initMouseEvent(
opts.type,
opts.canBubble,
opts.cancelable,
opts.view,
opts.detail,
opts.screenX,
opts.screenY,
opts.clientX,
opts.clientY,
opts.ctrlKey,
opts.altKey,
opts.shiftKey,
opts.metaKey,
opts.button,
opts.relatedTarget
);
//Fire the event
target.dispatchEvent(event);
}
Here's a working example: http://www.spookandpuff.com/examples/clickSimulation.html
You can simulate a click on any element in the DOM. Something like simulatedClick(document.getElementById('yourButtonId'))
would work.
You can pass in an object into options
to override the defaults (to simulate which mouse button you want, whether Shift/Alt/Ctrl are held, etc. The options it accepts are based on the MouseEvents API.
I've tested in Firefox, Safari and Chrome. Internet Explorer might need special treatment, I'm not sure.
Based on Derek's answer, I verified that
document.getElementById('testTarget')
.dispatchEvent(new MouseEvent('click', {shiftKey: true}))
works as expected even with key modifiers. And this is not a deprecated API, as far as I can see. You can verify on this page as well.
From the Mozilla Developer Network (MDN) documentation, HTMLElement.click() is what you're looking for. You can find out more events here.
You can use elementFromPoint:
document.elementFromPoint(x, y);
supported in all browsers: https://caniuse.com/#feat=element-from-point
Don't rely on deprecated API features. All browsers support the example below. See docs and example here
if (document.createEvent) {
// Create a synthetic click MouseEvent
let event = new MouseEvent("click", {
bubbles: true,
cancelable: true,
view: window
});
// Dispatch the event.
link.dispatchEvent(event);
}
This worked for me in a situation where "everything else failed" in a complex dropdown menu , hope it helps someone else:
// Dispatch mousedown, then mouseup to simulate a full click,
// using absolute x/y coordinates..
function simulateMouseClick(element) {
if (!element) {
throw new Error('simulateMouseClick: Provided element is null or undefined.');
}
const rect = element.getBoundingClientRect();
const x = rect.left + (rect.width / 2);
const y = rect.top + (rect.height / 2);
const targetWindow = (typeof unsafeWindow === 'undefined') ? window : unsafeWindow;
const targetElement = document.elementFromPoint(x, y) || element;
const eventOptions = {
view: targetWindow,
bubbles: true,
cancelable: true,
clientX: x,
clientY: y
};
['mousedown', 'mouseup', 'click'].forEach(eventType => {
targetElement.dispatchEvent(new MouseEvent(eventType, eventOptions));
});
}
usage:
simulateMouseClick(document.getElementById("btn"));
JavaScript Code
//this function is used to fire click event
function eventFire(el, etype){
if (el.fireEvent) {
el.fireEvent('on' + etype);
} else {
var evObj = document.createEvent('Events');
evObj.initEvent(etype, true, false);
el.dispatchEvent(evObj);
}
}
function showPdf(){
eventFire(document.getElementById('picToClick'), 'click');
}
HTML Code
<img id="picToClick" data-toggle="modal" data-target="#pdfModal" src="img/Adobe-icon.png" ng-hide="1===1">
<button onclick="showPdf()">Click me</button>
本文标签: javascriptHow to simulate a mouse clickStack Overflow
版权声明:本文标题:javascript - How to simulate a mouse click? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1736757667a1951374.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论