Làm cách nào để mô phỏng một nhấp chuột bằng cách sử dụng tọa độ x, y trong JavaScript?


93

Có thể sử dụng các tọa độ đã cho để mô phỏng một nhấp chuột trong JavaScript trong một trang web không?


2
Mục tiêu của bạn là gì? :) Bạn đang cố gắng mô phỏng một cú nhấp chuột trên bản đồ hình ảnh chẳng hạn?
Nick Craver

Câu trả lời:


145

Bạn có thể gửi một sự kiện nhấp chuột , mặc dù điều này không giống như một nhấp chuột thực. Ví dụ: nó không thể được sử dụng để lừa tài liệu iframe tên miền chéo nghĩ rằng nó đã được nhấp.

Tất cả các trình duyệt hiện đại đều hỗ trợ document.elementFromPointHTMLElement.prototype.click()ít nhất là IE 6, Firefox 5, bất kỳ phiên bản nào của Chrome và có thể là bất kỳ phiên bản Safari nào mà bạn có thể quan tâm. Nó thậm chí sẽ đi theo các liên kết và gửi biểu mẫu:

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: vâng, trên thực tế IE là người đầu tiên triển khai nó và nó quay trở lại IE6. Việc triển khai Chrome, Firefox và Safari 5 là tốt nhưng Safari 4 và Opera không chính xác (mặc dù có thể hoạt động được). Xem quirksmode.org/dom/w3c_cssom.html#documentview .
Andy E,

1
Tôi rất vui vì khám phá này !! = D Biến nhiều thứ tưởng như không thể thành hiện thực =) ... hoặc ít nhất là ít phức tạp hơn. Cảm ơn!!
RadiantHex

1
Điều này dường như không hoạt động với các sự kiện $ .live (), có ai làm thế nào để làm cho nó hoạt động với các sự kiện được tạo bằng $ .live () không?
ActionOwl

1
@AndyE Tính năng này hiện đang hoạt động trong điều kiện sau: Tôi có trang web, tôi đang tải Iframe từ miền khác không phải miền của tôi. Và tôi muốn nhấp vào vùng iframe. Bạn có một số giải pháp liên quan đến điều này?
Parixit

2
@parixit: không, không được đâu. Bạn có thể mô phỏng một cú nhấp chuột vào iframe nhưng nó sẽ chỉ lan truyền đến tài liệu chứa. Không có gì trong tài liệu chứa sẽ bị ảnh hưởng (vì lý do bảo mật rất rõ ràng).
Andy E

67

Có, bạn có thể mô phỏng một cú nhấp chuột bằng cách tạo một sự kiện và điều động nó:

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);
}

Hãy cẩn thận khi sử dụng clickphương pháp trên một phần tử - nó được triển khai rộng rãi nhưng không chuẩn và sẽ thất bại trong ví dụ như PhantomJS. Tôi giả sử việc triển khai của jQuery .click()làm đúng nhưng chưa xác nhận.


Đã cứu tôi khỏi một mớ hỗn độn. Phương pháp ban đầu của tôi không thành công nhưng phương pháp này đã giải cứu, cảm ơn.
iChux

3
plus1 để không sử dụng jQuery. Ngược lại với câu trả lời được chấp nhận, câu trả lời này thực sự trả lời câu hỏi.
tomekwi

1
Đây là nhiều, nhiều hơn nữa mạnh mẽ hơn của jQuery$.click()
Steven Lu

7
initMouseEventđã không được dùng nữa: developer.mozilla.org/en-US/docs/Web/API/MouseEvent/…
vikeri

3
Thay vì không dùng nữa, initMouseEventbạn có thể sử dụng var event = new MouseEvent( "click", { clientX: x, clientY: y, bubbles: true } )Điều này cũng được hiển thị trong stackoverflow.com/a/36144688/384670 .
M Katz

28

Đây chỉ là câu trả lời của torazaburo , được cập nhật để sử dụng đối tượng 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

nó không hoạt động cho tôi nhưng nó in phần tử chính xác vào bảng điều khiển

đây là mã:

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

Vì lý do bảo mật, bạn không thể di chuyển con trỏ chuột bằng javascript hoặc mô phỏng một cú nhấp chuột với nó.

Bạn đang cố gắng hoàn thành điều gì?


@Aicule: cảm ơn vì đã cho tôi biết! Tôi sẽ thêm một chút thông tin vào câu hỏi. Tôi chỉ thử nghiệm, không có gì thực sự hiệu quả =)
RadiantHex

2
Trong Chrome và Safari, bạn có thể thực hiện một cú nhấp chuột tại một vị trí x, y cụ thể. Đây là cách bản demo này hoạt động. Firefox là trình duyệt duy nhất bị lỗi, vì vậy có thể đó là một chính sách bảo mật dành riêng cho Firefox.
thdoan

Sự thật nằm trong câu trả lời bên dưới, createEvent()+initMouseEvent()
Valer

1
Trong trường hợp của tôi, thử nghiệm.
Jose Nobile

Bạn chắc chắn có thể mô phỏng một nhấp chuột với các tọa độ X / Y cụ thể, mặc dù nó sẽ không hoạt động chính xác theo cùng một cách.
Agamemnus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.