Cách nhận JQuery.trigger ('nhấp'); để bắt đầu nhấp chuột


145

Tôi đang gặp khó khăn để hiểu cách mô phỏng nhấp chuột bằng JQuery. Ai đó có thể vui lòng thông báo cho tôi như những gì tôi đang làm sai.

HTML:

<a id="bar" href="http://stackoverflow.com" target="_blank">Don't click me!</a>
<span id="foo">Click me!</span>

jQuery:

jQuery('#foo').on('click', function(){
    jQuery('#bar').trigger('click');
});

Bản trình diễn: FIDDLE

Khi tôi nhấp vào nút #foo, tôi muốn mô phỏng một lần nhấp vào #bar tuy nhiên khi tôi thử điều này, không có gì xảy ra. Tôi cũng đã thử jQuery(document).ready(function(){...})nhưng không thành công.


2
jQuery triggerchỉ hoạt động nếu bất kỳ sự kiện 'jQuery click` nào được thêm vào. Nếu không, bạn sẽ không thể làm bất cứ điều gì bằng cách này;
Reza Mamun

3
Đây là một biện pháp bảo mật được tích hợp trong trình duyệt. Xem câu trả lời của @ Blazemongerer: stackoverflow.com/questions/7999806/ từ
sanchez

1
@ san.chez Thú vị, cảm ơn vì thông tin, trước đây không biết về biện pháp bảo mật này!
lickmycode

Câu trả lời:


277

Bạn cần sử dụng jQuery('#bar')[0].click(); để mô phỏng một lần nhấp chuột vào phần tử DOM thực tế (không phải đối tượng jQuery), thay vì sử dụng .trigger()phương thức jQuery.

Lưu ý: DOM Cấp 2 .click()không hoạt động trên một số thành phần trong Safari . Bạn sẽ cần phải sử dụng một cách giải quyết.

http://api.jquery.com/click/


18
bạn đã lưu ngày của tôi $ ('# asd') [0] .click ();
waza123

Đã sử dụng điều này để nhấp vào tab tiếp theo trên các trường ACF của jQuery: $ ('. Next'). Click (function () {$ ('# chính li.active'). Next (). Find ('. Acf-tab-nút ') [0] .click ();});
Tisch

1
cảm ơn. Nó hoạt động trong máy tính để bàn. Nhưng trên di động (android chrome) thì không. bất kỳ đề xuất?
kk-dev11

Vì một số lý do, điều này sẽ phá hủy hàm băm trong URL hiện tại.
luis

1
nếu một trong các href trên <thẻ là '#', điều đó sẽ làm điều đó. <một chuyển hướng thông thường đến một URL khác. Bạn phải dừng nó với ev.preventDefault () và ev.stopPropagation () trước khi trình xử lý nhấp chuột của bạn trở lại. HOẶC, sử dụng một số thẻ khác ngoài <a; bạn có thể đính kèm các trình xử lý nhấp chuột vào bất cứ thứ gì có thể nhìn thấy.
OsamaBinLogin

43

Bạn chỉ cần đặt một sự kiện thời gian chờ nhỏ trước khi làm .click() như thế này:

setTimeout(function(){ $('#btn').click()}, 100);

Hoạt động hoàn hảo nếu bạn đang cố gắng mô phỏng một nhấp chuột khi tải trang.
Gabriel Dzul

33

Đây là hành vi của JQuery. Tôi không chắc tại sao nó hoạt động theo cách này, nó chỉ kích hoạt chức năng onClick trên liên kết.

Thử:

jQuery(document).ready(function() {
    jQuery('#foo').on('click', function() {
        jQuery('#bar')[0].click();
    });
});

Cảm ơn đã giải thích. Hành vi rất khó chịu của jQuery, nhưng mã của bạn hoạt động.
lickmycode

Không kích thích chút nào. trigger()được dự định để thực thi phần JavaScript sự kiện nhấp chuột . Nó rất giống với việc tạo ra một thứ function var() {}được sử dụng lại nhiều lần.

21

Xem bản demo của tôi: http://jsfiddle.net/8AVau/1/

jQuery(document).ready(function(){
    jQuery('#foo').on('click', function(){
         jQuery('#bar').simulateClick('click');
    });
});

jQuery.fn.simulateClick = function() {
    return this.each(function() {
        if('createEvent' in document) {
            var doc = this.ownerDocument,
                evt = doc.createEvent('MouseEvents');
            evt.initMouseEvent('click', true, true, doc.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
            this.dispatchEvent(evt);
        } else {
            this.click(); // IE Boss!
        }
    });
}

Tôi sẽ gói gọn this.click();trong mộtelse if(this.click)
Alex W

15

Có thể có ích đấy:

Mã gọi Trình kích hoạt sẽ đi sau khi sự kiện được gọi.

Ví dụ: tôi có một số mã mà tôi muốn được thực thi khi giá trị #Exense_tickets bị thay đổi và đồng thời, khi trang được tải lại

$(function() { 

  $("#expense_tickets").change(function() {
    // code that I want to be executed when #expense_tickets value is changed, and also, when page is reload
  });

  // now we trigger the change event
  $("#expense_tickets").trigger("change");

})

4
Ahhh đó cũng là vấn đề của tôi! Đã bị bối rối về lý do tại sao trigger()không làm việc. Hóa ra tôi đã cài đặt mã kích hoạt TRÊN chức năng mà nó đang gọi - vì vậy hook thực sự không đúng chỗ. Đừng!
Andrew Newby

5

jQuery .trigger('click');sẽ chỉ gây ra một sự kiện để kích hoạt sự kiện này, nó cũng sẽ không kích hoạt hành động mặc định của trình duyệt.

Bạn có thể mô phỏng chức năng tương tự với JavaScript sau:

jQuery('#foo').on('click', function(){
    var bar = jQuery('#bar');
    var href = bar.attr('href');
    if(bar.attr("target") === "_blank")
    {
        window.open(href);
    }else{
        window.location = href;
    }
});

2

Hãy thử điều này phù hợp với tôi:

$('#bar').mousedown();

0

Tôi đã thử hai câu trả lời hàng đầu, nó không hiệu quả với tôi cho đến khi tôi xóa "display: none" khỏi các thành phần nhập tệp của mình. Sau đó, tôi trở lại .trigger () nó cũng hoạt động tại safari cho windows.

Vì vậy, kết luận, Không sử dụng hiển thị: không có; để ẩn đầu vào tệp của bạn , bạn có thể sử dụng opacity: 0 thay thế.


0

Về mặt kỹ thuật không phải là một câu trả lời cho điều này, nhưng sử dụng tốt câu trả lời được chấp nhận ( https://stackoverflow.com/a/20928975/82028 ) để tạo các nút tiếp theo và trước cho các tab trên các trường ACF của jQuery:

$('.next').click(function () {
    $('#primary li.active').next().find('.acf-tab-button')[0].click();
});

$('.prev').click(function () {
    $('#primary li.active').prev().find('.acf-tab-button')[0].click();
});

0

Chỉ cần sử dụng này:

$(function() {
 $('#watchButton').click();
});

-3

Bạn không thể mô phỏng một sự kiện nhấp chuột bằng javascript. .trigger()Hàm jQuery chỉ kích hoạt một sự kiện có tên là "nhấp chuột" vào phần tử mà bạn có thể chụp bằng .on()phương thức jQuery.


9
"Bạn không thể mô phỏng sự kiện nhấp chuột bằng javascript" - Có, bạn có thể .
nnnnnn

Sai ... bạn có thể mô phỏng sự kiện nhấp bằng javascript / jquery và bạn có thể chụp sự kiện nhấp kích hoạt bằng .click mà không cần bật.
Aerious
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.