Làm cách nào để kích hoạt nhấp chuột vào sự kiện JavaScript


215

Tôi có một siêu liên kết trong trang của tôi. Tôi đang cố gắng tự động hóa một số lần nhấp vào siêu liên kết cho mục đích thử nghiệm. Có cách nào bạn có thể mô phỏng 50 lần nhấp vào siêu liên kết bằng JavaScript không?

<a href="#" target="_blank" onclick="javascript:Test("Test");">MSDN</a>

Tôi đang tìm kiếm trình kích hoạt sự kiện onClick từ JavaScript.

Câu trả lời:


285

Thực hiện một cú nhấp chuột vào một phần tử HTML: Đơn giản chỉ cần làm element.click(). Hầu hết các trình duyệt chính đều hỗ trợ điều này .


Để lặp lại nhấp nhiều lần: Thêm ID vào thành phần để chọn duy nhất:

<a href="#" target="_blank" id="my-link" onclick="javascript:Test('Test');">Google Chrome</a>

và gọi .click()phương thức trong mã JavaScript của bạn thông qua vòng lặp for:

var link = document.getElementById('my-link');
for(var i = 0; i < 50; i++)
   link.click();

1
NB này là cho mục đích thử nghiệm nhanh chóng. Để biết giải pháp đa trình duyệt, tuân thủ tiêu chuẩn, mạnh mẽ hơn, hãy xem câu trả lời của Juan.
ví dụ tôi

3
Tôi không hiểu vòng lặp và điều này không hoạt động trên điện thoại di động.
im_benton

@im_benton: Vòng lặp dành cho các nhu cầu cụ thể của OP. Nếu bạn chỉ cần kích hoạt một sự kiện nhấp chuột, bạn có thể bỏ qua dòng bắt đầu bằng for(.
rinogo

87

CẬP NHẬT

Đây là một câu trả lời cũ. Ngày nay bạn chỉ nên sử dụng nhấp chuột . Để bắn sự kiện nâng cao hơn, hãy sử dụng ClarkEvent .

const body = document.body;

body.addEventListener('click', e => {
  console.log('clicked body');
});

console.log('Using click()');
body.click();

console.log('Using dispatchEvent');
body.dispatchEvent(new Event('click'));

Câu trả lời gốc

Đây là những gì tôi sử dụng: http://jsfiddle.net/mendesjuan/rHMCy/4/

Đã cập nhật để hoạt động với IE9 +

/**
 * Fire an event handler to the specified node. Event handlers can detect that the event was fired programatically
 * by testing for a 'synthetic=true' property on the event object
 * @param {HTMLNode} node The node to fire the event handler on.
 * @param {String} eventName The name of the event without the "on" (e.g., "focus")
 */
function fireEvent(node, eventName) {
    // Make sure we use the ownerDocument from the provided node to avoid cross-window problems
    var doc;
    if (node.ownerDocument) {
        doc = node.ownerDocument;
    } else if (node.nodeType == 9){
        // the node may be the document itself, nodeType 9 = DOCUMENT_NODE
        doc = node;
    } else {
        throw new Error("Invalid node passed to fireEvent: " + node.id);
    }

     if (node.dispatchEvent) {
        // Gecko-style approach (now the standard) takes more work
        var eventClass = "";

        // Different events have different event classes.
        // If this switch statement can't map an eventName to an eventClass,
        // the event firing is going to fail.
        switch (eventName) {
            case "click": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead.
            case "mousedown":
            case "mouseup":
                eventClass = "MouseEvents";
                break;

            case "focus":
            case "change":
            case "blur":
            case "select":
                eventClass = "HTMLEvents";
                break;

            default:
                throw "fireEvent: Couldn't find an event class for event '" + eventName + "'.";
                break;
        }
        var event = doc.createEvent(eventClass);
        event.initEvent(eventName, true, true); // All events created as bubbling and cancelable.

        event.synthetic = true; // allow detection of synthetic events
        // The second parameter says go ahead with the default action
        node.dispatchEvent(event, true);
    } else  if (node.fireEvent) {
        // IE-old school style, you can drop this if you don't need to support IE8 and lower
        var event = doc.createEventObject();
        event.synthetic = true; // allow detection of synthetic events
        node.fireEvent("on" + eventName, event);
    }
};

Lưu ý rằng gọi fireEvent(inputField, 'change');không có nghĩa là nó thực sự sẽ thay đổi trường đầu vào. Trường hợp sử dụng điển hình để thực hiện một sự kiện thay đổi là khi bạn đặt trường theo chương trình và bạn muốn trình xử lý sự kiện được gọi kể từ khi gọi input.value="Something"sẽ không kích hoạt sự kiện thay đổi.


Này Juan! Ví dụ của bạn không xác định JSUtil.NodeTypes.DOCUMENT_NODE
Kato

Tôi biết rằng câu hỏi là về việc nhấp vào các sự kiện nhưng bạn đã cung cấp một số mã chung ở đây và những gì tôi có thể thấy các sự kiện thay đổi sẽ không được thực hiện (Tôi đã thử nghiệm và điều này không thực sự hiệu quả đối với các sự kiện đó). Để kích hoạt các sự kiện thay đổi, tôi đã phải sử dụng chức năng kích hoạt jquery.
Aleksander Lech

@AleksanderLech Chỉ bắn một sự kiện không đảm bảo rằng hành động sẽ diễn ra. Nó không cho nhấp chuột, nó không thay đổi. Trường hợp sử dụng cho các sự kiện mà thay đổi không hoạt động là khi bạn muốn thay đổi giá trị của nó, nhưng bạn muốn tất cả các trình xử lý sự kiện thay đổi được gọi (cho dù chúng có được đặt jQueryhay không). Tôi có thể cung cấp trợ giúp có ý nghĩa hơn nếu bạn hỏi một câu hỏi mới với mã chính xác mà bạn đang thử nhưng không hoạt động.
Juan Mendes

Cảm ơn đã phản ứng nhanh chóng. Tôi đã có thể nhận được sự kiện thay đổi đang chạy sau một vài sửa đổi đối với đoạn mã của bạn: 1) var node = document.getEuityById (originalEvent.srcEuity.id); 2) event.initEvent (eventName, true, true); // Tôi không biết lý do tại sao bạn vô hiệu hóa bong bóng cho các sự kiện thay đổi. Xin vui lòng cho tôi biết những gì bạn nghĩ.
Aleksander Lech

40

 l.onclick();

không chính xác gọi onclickchức năng của l, nghĩa là, nếu bạn đã thiết lập một với l.onclick = myFunction;. Nếu bạn chưa thiết lập l.onclick, nó không làm gì cả. Ngược lại,

 l.click();

mô phỏng một lần nhấp và kích hoạt tất cả các trình xử lý sự kiện, cho dù được thêm bằng l.addEventHandler('click', myFunction);, trong HTML hoặc theo bất kỳ cách nào khác.


1
FWIW này chỉ hoạt động ở cấp độ phần tử. Nếu bạn thêm một sự kiện nhấp chuột vào windowđối tượng, nó sẽ không hiển thị một window.clickchức năng một cách kỳ diệu .
James Donnelly

20

Tôi khá xấu hổ vì có rất nhiều khả năng áp dụng một phần không chính xác hoặc không được tiết lộ.

Cách dễ nhất để làm điều này là thông qua Chrome hoặc Opera (ví dụ của tôi sẽ sử dụng Chrome) bằng Bảng điều khiển. Nhập mã sau vào bàn điều khiển (thường trong 1 dòng):

var l = document.getElementById('testLink');
for(var i=0; i<5; i++){
  l.click();
}

Điều này sẽ tạo ra kết quả cần thiết


12

.click()không hoạt động với Android (xem tài liệu mozilla , ở phần di động). Bạn có thể kích hoạt sự kiện nhấp bằng phương pháp này:

function fireClick(node){
    if (document.createEvent) {
        var evt = document.createEvent('MouseEvents');
        evt.initEvent('click', true, false);
        node.dispatchEvent(evt);    
    } else if (document.createEventObject) {
        node.fireEvent('onclick') ; 
    } else if (typeof node.onclick == 'function') {
        node.onclick(); 
    }
}

Từ bài này


1
Tôi đã thử nhấp vào trình kích hoạt của jQuery nhưng thấy rằng nó kết thúc bằng cách gọi lại cuộc gọi thay vì gửi sự kiện thực tế trên DOM. @manolo phương pháp của bạn là chính xác.
Akshay Gundewar

" .click()Không hoạt động với Android" Trên thực tế, bảng mới nhất cho biết "Không biết tính tương thích".
Gaurang Tandon

8

Sử dụng khung kiểm tra

Điều này có thể hữu ích - http://seleniumhq.org/ - Selenium là một hệ thống kiểm tra tự động ứng dụng web.

Bạn có thể tạo các bài kiểm tra bằng cách sử dụng plugin Selenium IDE của Firefox

Hướng dẫn bắn các sự kiện

Để sự kiện cháy bằng tay một cách chính xác, bạn sẽ cần phải sử dụng phương pháp khác nhau cho các trình duyệt khác nhau - một trong hai el.dispatchEventhoặc el.fireEventnơi elsẽ tố Neo của bạn. Tôi tin rằng cả hai điều này sẽ yêu cầu xây dựng một đối tượng Sự kiện để truyền vào.

Cách khác, không hoàn toàn chính xác, nhanh và bẩn sẽ là:

var el = document.getElementById('anchorelementid');
el.onclick(); // Not entirely correct because your event handler will be called
              // without an Event object parameter.


1

Cảnh báo đúng:

element.onclick()không hành xử như mong đợi. Nó chỉ chạy mã bên trong onclick="" attribute, nhưng không kích hoạt hành vi mặc định.

Tôi gặp vấn đề tương tự với nút radio không cài đặt thành kiểm tra, mặc dù onclickchức năng tùy chỉnh đang chạy tốt. Phải thêm radio.checked = "true";để thiết lập nó. Có lẽ điều tương tự cũng xảy ra và đối với các yếu tố khác (sau a.onclick()đó cũng nên có window.location.href = "url";)


Thật vậy, sử dụng onclick()sẽ có nghĩa là eventđối tượng sẽ không được trình duyệt tự động xác định, do đó các phương thức phổ biến như event.stopPropagation()cũng sẽ không được xác định.
Boaz

0

Vui lòng gọi chức năng kích hoạt bất kỳ nơi nào và nút sẽ nhấp.


<a href="#" id="myBtn" title="" >Button click </a>

function trigger(){
    document.getElementById("myBtn").click();
}
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.