Làm cách nào để mô phỏng một nhấp chuột bằng JavaScript?


290

Tôi chỉ tự hỏi làm thế nào tôi có thể sử dụng JavaScript để mô phỏng nhấp chuột vào một yếu tố.

Hiện tại tôi có:

<script type="text/javascript">
function simulateClick(control)
{
    if (document.all)
    {
        control.click();
    }
    else
    {
        var evObj = document.createEvent('MouseEvents');
        evObj.initMouseEvent('click', true, true, window, 1, 12, 345, 7, 220, false, false, true, false, 0, null );
        control.dispatchEvent(evObj);
    }
}
</script>

<a href="http://www.google.com" id="mytest1">test 1</a><br>

<script type="text/javascript">
    simulateClick(document.getElementById('mytest1'));
</script>

Nhưng nó không hoạt động :(

Có ý kiến ​​gì không?


9
"Năm lỗi mã hóa phổ biến nhất": javascript.about.com/od/hintsandtips/a/worst_4.htm - Chỉ cần không có ai chạy IE4 nữa và vì vậy không cần hỗ trợ cho tài liệu nữa. Nó thực sự đáng ngạc nhiên mặc dù có bao nhiêu người vẫn sử dụng nó trong mã hóa của họ. Tồi tệ hơn là sự hỗ trợ cho tài liệu. Mọi DOM thường được kiểm tra để xác định trình duyệt đang được sử dụng và nếu nó được hỗ trợ thì mã giả định rằng trình duyệt là Internet Explorer (sử dụng sai hoàn toàn vì Opera cũng nhận ra DOM đó) .
zaf

Câu trả lời:


417

Đây là những gì tôi đã nấu lên. Nó khá đơn giản, nhưng nó hoạt động:

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

Sử dụng:

eventFire(document.getElementById('mytest1'), 'click');

12
@Anderson Xanh: Tôi đã thêm một ví dụ để jsfiddle này: jsfiddle.net/KooiInc/W4BHD
KooiInc

4
Bằng chứng là điều này hoạt động (bằng Chromium): +1 với document.querySelector('[value="2706236"]').nextSibling.nextSibling.dispatchEvent(ev);:)
PointedEars

58
Vâng, tôi đã thử tập lệnh java của bạn trên nút bỏ phiếu :) (hoạt động tất nhiên)
0fnt

1
Để mô phỏng hành vi người dùng chính xác, bạn nên quấn dispatchEventhoặc clicklời gọi với setTimeout, vì nó dường như dispatchEventđồng bộ .
Lev Kazakov

16
Event.initEventhiện không được nhà phát
triển.mozilla.org/en/docs/Web/API/Event/initEvent

391

Điều gì về một cái gì đó đơn giản như:

document.getElementById('elementID').click();

Được hỗ trợ bởi IE.


@HermannIngjaldsson Có nó hoạt động hoàn hảo trong IE - msdn.microsoft.com/en-us/library/ie/ms536363%28v=vs.85%29.aspx
Darren Sweeney

6
Câu hỏi là "nó có hoạt động tốt không?" - câu trả lời là có - AFAIK ít nhất là xuống 8, chưa kiểm tra 7
Darren Sweeney

24
Điều này không tồn tại trước đây? Tại sao câu trả lời năm 2010 không đề cập đến giải pháp đơn giản này? Chỉ tò mò thôi ...
Parth

3
@ NinoŠkopac Hoạt động tốt hiện tại cho máy tính để bàn nhưng không đảm bảo hoạt động với trình duyệt di động. Ngay cả trang web dành cho nhà phát triển mozilla cũng không hiển thị hỗ trợ di động.
le0diaz

8
@Parth Có lẽ nó đã làm, nó chỉ không nhấp cho họ.
Andrew

78

Bạn đã cân nhắc sử dụng jQuery để tránh tất cả sự phát hiện của trình duyệt chưa? Với jQuery, nó sẽ đơn giản như:

$("#mytest1").click();

21
Điều này chỉ kích hoạt các trình xử lý sự kiện jQuery, không phải là hành vi mặc định (trình duyệt chuyển sang href trong trường hợp đó)
Romuald Brunet

12
Tôi không biết về việc buồn nhưng chắc chắn có thể thuận tiện khi không phải tiếp tục mã hóa lại cùng một thói quen phát hiện trình duyệt.
BradBrening

9
@ErikAigner: Tôi đã tự hỏi tương tự, nhưng rất vui vì câu trả lời được chấp nhận trong trường hợp này là JavaScript đơn giản và không phải là jQuery. Nhìn thấy quá nhiều lần trên SO. Một lần nữa: jQuery là JavaScript, nhưng JavaScript không phải là jQuery. Mặc dù tôi thích sử dụng jQuery, nhưng tôi càng ngày càng thấy nhiều nhà phát triển không hiểu điều thực sự đơn giản. 2 xu của tôi, không thể cưỡng lại bình luận. ;)
Sander

58
Cũng có rất nhiều người sẽ không biết bắt đầu từ đâu nếu họ phải giặt quần áo bằng tay, vì phần lớn các hộ gia đình sở hữu một máy giặt, và hầu như nhiều người có máy sấy quần áo. jQuery, giống như các thiết bị hiện đại, đã làm cho một công việc cũ dễ dàng hơn và ít bị lỗi hơn. Tuy nhiên, đó không phải là giải pháp cho tất cả mọi người, hạ thấp một câu trả lời trả lời chính xác câu hỏi bằng cách sử dụng cú pháp ngắn gọn, dễ hiểu hơn trong khi tương thích với nhiều trình duyệt có vẻ ngược. +1.
FreeAsInBeer

2
@FreeAsInBeer Sau đó, bạn cũng không nên đi bộ ở bất cứ đâu vì lái xe dễ dàng hơn nhiều. Nhưng chúng tôi biết điều đó thật ngớ ngẩn. Bạn đi bộ nếu bạn không cần phải đi xa. Bạn sử dụng JavaScript đơn giản nếu bạn cần làm một cái gì đó đơn giản và không muốn tải toàn bộ thư viện để làm điều đó. Không cần lãng phí gas / bandwitdth cho một cái gì đó đơn giản.
Jacob Alvarez

18
var elem = document.getElementById('mytest1');

// Simulate clicking on the specified element.
triggerEvent( elem, 'click' );

/**
 * Trigger the specified event on the specified element.
 * @param  {Object} elem  the target element.
 * @param  {String} event the type of the event (e.g. 'click').
 */
function triggerEvent( elem, event ) {
  var clickEvent = new Event( event ); // Create the event.
  elem.dispatchEvent( clickEvent );    // Dispatch the event.
}

Tài liệu tham khảo


Tôi tin rằng đây sẽ là câu trả lời tốt nhất hiện nay
DavidTaubmann

15

Bạn có thể tiết kiệm cho mình một loạt dung lượng bằng cách sử dụng jQuery. Bạn chỉ cần sử dụng:

$('#myElement').trigger("click")

10
OP đã yêu cầu JavaScript. Mặc dù đây là nhỏ gọn và có chức năng, một số người thích không có Thư viện JS hơn những thứ như jQuery.
Thân thịt

43
Tiết kiệm không gian bằng cách tải jquery?
MH

9
Một số người thích lắp ráp, là tốt.
Dan Nissenbaum

@MH Tôi nghĩ rằng một đối số hợp lệ hơn sẽ là "giữ cho nó đơn giản". Cấu hình mặc định của bạn ở đây trong SO có cùng kích thước của jQuery.
adelriosantiago

7

Câu trả lời hàng đầu là tốt nhất! Tuy nhiên, nó không kích hoạt các sự kiện chuột cho tôi khi Firefox etype = 'click'.

Vì vậy, tôi đã thay đổi document.createEventthành 'MouseEvents'và điều đó đã khắc phục vấn đề. Mã bổ sung là để kiểm tra xem một bit mã khác có can thiệp vào sự kiện hay không và nếu nó bị hủy, tôi sẽ đăng nhập nó vào bàn điều khiển.

function eventFire(el, etype){
  if (el.fireEvent) {
    el.fireEvent('on' + etype);
  } else {
    var evObj = document.createEvent('MouseEvents');
    evObj.initEvent(etype, true, false);
    var canceled = !el.dispatchEvent(evObj);
    if (canceled) {
      // A handler called preventDefault.
      console.log("automatic click canceled");
    } else {
      // None of the handlers called preventDefault.
    } 
  }
}

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.