Як імітувати клацання за допомогою координат x, y у JavaScript?


93

Чи можна використовувати задані координати для імітації клацання в JavaScript на веб-сторінці?


2
Яка ваша мета? :) Ви намагаєтесь імітувати клацання на карті зображення, наприклад?
Нік Кравер

Відповіді:


146

Ви можете надіслати подію клацання , хоча це не те саме, що справжній клік. Наприклад, його не можна використовувати, щоб обдурити міждоменний документ iframe, вважаючи, що його натиснули.

Усі сучасні браузери підтримують document.elementFromPointі HTMLElement.prototype.click(), принаймні з IE 6, Firefox 5, будь-яку версію Chrome і, можливо, будь-яку версію Safari, про яку ви, мабуть, дбаєте. Він навіть буде переходити за посиланнями та подавати форми:

document.elementFromPoint(x, y).click();

https://developer.mozilla.org/En/DOM:document.elementFromPoint https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click


1
@RadiantHex: так, насправді IE був першим, хто реалізував це, і це повертається до IE6. Реалізації Chrome, Firefox та Safari 5 - це нормально, але Safari 4 та Opera - неправильні (хоча працюють). Див. Quirksmode.org/dom/w3c_cssom.html#documentview .
Andy E,

1
Я дуже рада цьому відкриттю !! = D Робить багато речей, які зараз вважаються неможливими, можливо =) ... або, принаймні, менш складними. Дякую!!
RadiantHex

1
Здається, це не працює з подіями $ .live (), чи хтось може зробити так, щоб це працювало і з подіями, створеними за допомогою $ .live ()?
ActionOwl

1
@AndyE Зараз це працює в наступному стані: у мене є веб-сторінка, я завантажую Iframe з іншого домену, ніж мій домен. І я хочу клацнути в області iframe. У вас є якесь рішення щодо цього?
Parixit

2
@parixit: ні, це неможливо. Ви можете імітувати клацання на iframe, але він просто розповсюджуватиме вміщуючий документ. Ніщо в цьому документі не постраждає (з цілком очевидних міркувань безпеки).
Andy E

67

Так, ви можете імітувати клацання миші, створюючи подію та відправляючи її:

function click(x,y){
    var ev = document.createEvent("MouseEvent");
    var el = document.elementFromPoint(x,y);
    ev.initMouseEvent(
        "click",
        true /* bubble */, true /* cancelable */,
        window, null,
        x, y, 0, 0, /* coordinates */
        false, false, false, false, /* modifier keys */
        0 /*left*/, null
    );
    el.dispatchEvent(ev);
}

Остерігайтеся використання clickметоду на елементі - він широко впроваджений, але не є стандартним і не вдасться, наприклад, у PhantomJS. Я припускаю, що реалізація jQuery .click()робить правильно, але не підтвердила.


Врятував мене від безладу. Мій початковий метод не вдався, але цей прийшов на допомогу, дякую.
iChux

3
плюс1 за невикористання jQuery. На відміну від прийнятої відповіді, вона відповідає на питання.
tomekwi

1
Це набагато, набагато потужніше, ніж jQuery$.click()
Стівен Лу,

7
initMouseEventбуло припинено: developer.mozilla.org/en-US/docs/Web/API/MouseEvent/…
vikeri

3
Замість застарілого initMouseEventви можете використовувати var event = new MouseEvent( "click", { clientX: x, clientY: y, bubbles: true } )Це також показано в stackoverflow.com/a/36144688/384670 .
M Katz,

28

Це лише відповідь torazaburo , оновлена ​​для використання об’єкта MouseEvent.

function click(x, y)
{
    var ev = new MouseEvent('click', {
        'view': window,
        'bubbles': true,
        'cancelable': true,
        'screenX': x,
        'screenY': y
    });

    var el = document.elementFromPoint(x, y);

    el.dispatchEvent(ev);
}

0

це не працює для мене, але друкує правильний елемент на консолі

це код:

function click(x, y)
{
    var ev = new MouseEvent('click', {
        'view': window,
        'bubbles': true,
        'cancelable': true,
        'screenX': x,
        'screenY': y
    });

    var el = document.elementFromPoint(x, y);
    console.log(el); //print element to console
    el.dispatchEvent(ev);
}
click(400, 400);

-2

З міркувань безпеки ви не можете переміщати вказівник миші за допомогою JavaScript, а також імітувати клацання ним.

Що ви намагаєтесь досягти?


@Aicule: дякую, що повідомили! До запитання додам трохи інформації. Я просто експериментую, нічого насправді продуктивного =)
RadiantHex

2
У Chrome і Safari ви можете натискати клацання в певній позиції x, y. Ось як працює ця демонстрація . Firefox - єдиний браузер, у якому він виходить з ладу, тож, можливо, це специфічна політика безпеки Firefox.
thdoan

Істина полягає у відповіді нижче, createEvent()+initMouseEvent()
Валер,

1
У моєму випадку тестування.
Хосе Нобіле

Ви можете точно імітувати клацання з певними координатами X / Y, хоча воно не буде поводитися точно так само.
Агамемнус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.