Cách kích hoạt sự kiện nhấp chuột trên phần tử href


80

Tôi đang cố gắng kích hoạt sự kiện nhấp chuột trên siêu liên kết bằng jQuery như cách bên dưới. Siêu liên kết không có bất kỳ id nào nhưng nó có cssclass

 $(document).ready(function () {  $('.cssbuttongo').trigger('click'); }); 

Chức năng trên không hoạt động. Đây là siêu liên kết

<a href="hyperlinkurl" class="cssbuttongo">hyperlink anchor</a>

1
Vì một lớp có thể được áp dụng cho một số phần tử trong DOM, nên có vẻ như không phải là ý kiến ​​hay để kích hoạt một lần nhấp vào chúng.
Igor Parra

1
Nomikos bạn đang rất đúng về điều đó nhưng tôi đã kiểm tra rằng cho dù bất kỳ yếu tố khác sử dụng lớp css này :)
MonsterMMORPG

Câu trả lời:


78

Tôi không có bằng chứng thực tế để chứng minh điều này nhưng tôi đã gặp phải vấn đề này. Có vẻ như việc kích hoạt sự kiện click () trên <a>thẻ dường như không hoạt động giống như cách bạn mong đợi với nút đầu vào.

Cách giải quyết mà tôi đã sử dụng là đặt thuộc tính location.href trên cửa sổ khiến trình duyệt tải tài nguyên yêu cầu như sau:

$(document).ready(function()
{
      var href = $('.cssbuttongo').attr('href');
      window.location.href = href; //causes the browser to refresh and load the requested url
   });
});

Biên tập:

Tôi sẽ thực hiện một js fiddle nhưng bản chất của câu hỏi đan xen với cách jsfiddle sử dụng iframe để hiển thị mã khiến điều đó trở nên vô ích.


Đây là câu trả lời chính xác. cảm ơn bạn :) tôi cũng nhận thấy rằng nhấp vào href không hoạt động.
MonsterMMORPG

@MonsterMMorpg Hãy nhớ rằng điều này không dẫn đến việc trình duyệt tin rằng đó là hành động trực tiếp của người dùng. Vì vậy, hãy sử dụng một cách khôn ngoan = D
Matthew Cox

Không nên là var href = $ ('. Cssbuttongo'). Attr ('href');
Luci

7
Điều này bỏ qua khả năng rằng liên kết cũng có một onclicksự kiện. Chỉ cần làm $('.cssbuttongo')[0].click()để mô phỏng toàn bộ một cú nhấp chuột đúng cách.
Roman Starkov

Trên thực tế, nó chỉ hoạt động trên href hoàn chỉnh. Vì tôi không thể đặt mã ở đây, vui lòng đọc câu trả lời của tôi cho bài đăng này.
Alan Dong

210

Phương thức DOM gốc thực hiện đúng như sau:

$('.cssbuttongo')[0].click();
                  ^
              Important!

Điều này hoạt động bất kể đó hreflà URL, một đoạn (ví dụ #blah) hay thậm chí là một javascript:.

Lưu ý rằng điều này gọi clickphương thức DOM thay vì clickphương thức jQuery (rất không đầy đủ và hoàn toàn bị bỏ qua href).


2
@Timwi, tôi muốn nói cái đầu tiên $('.cssbuttongo').click(); // ignores href!sẽ không đảm bảo hoạt động. Cái sau sẽ luôn hoạt động, bởi vì việc sử dụng chỉ mục [0] sẽ làm cho Đối tượng jQuery thành Đối tượng JS thông thường, chính xác giống như một trình duyệt sử dụng. @Wei Liu
Alan Dong

1
Tuyệt vời! Câu trả lời rất trực tiếp và minh họa.
caiosm1005

11
Đây sẽ là câu trả lời được chọn. Hoạt động hoàn hảo!
Amit G

3
@AdilMalik Nó hoạt động vì jquery không phải là thứ duy nhất có phương thức click (). Mã này gọi phương thức click () không phải jquery, nó là một thứ DOM gốc.
Roman Starkov

1
@Timwi tôi cung cấp jsfiddle ở đây: jsfiddle.net/NabiKAZ/3gv90od5
Nabi KAZ

31

Ngoài câu trả lời tuyệt vời của romkyns .. đây là một số tài liệu / ví dụ có liên quan.


Phần tử DOM có một .click()phương thức gốc .

Các HTMLElement.click()phương pháp mô phỏng một click chuột trên một phần tử.

Khi nhấp chuột được sử dụng, nó cũng kích hoạt sự kiện nhấp chuột của phần tử sẽ bong bóng lên các phần tử cao hơn cây tài liệu (hoặc chuỗi sự kiện) và kích hoạt các sự kiện nhấp chuột của chúng. Tuy nhiên, sự kiện nhấp chuột nổi lên sẽ không làm cho một <a>phần tử bắt đầu điều hướng như thể một lần nhấp chuột thực đã được nhận. (mdn tham khảo)

Tài liệu W3 có liên quan .


Một vài ví dụ..

  • Bạn có thể truy cập một phần tử DOM cụ thể từ một đối tượng jQuery: (ví dụ)

      $('a')[0].click();
    
  • Bạn có thể sử dụng .get()phương thức này để truy xuất phần tử DOM từ đối tượng jQuery: (ví dụ)

      $('a').get(0).click();
    
  • Như mong đợi, bạn có thể chọn phần tử DOM và gọi .click()phương thức. (thí dụ)

      document.querySelector('a').click();
    

Cần chỉ ra rằng jQuery không bắt buộc phải kích hoạt một .click()sự kiện gốc .


4

Việc kích hoạt một nhấp chuột qua JavaScript sẽ không mở ra một siêu liên kết. Đây là một biện pháp bảo mật được tích hợp trong trình duyệt.

Tuy nhiên, hãy xem câu hỏi này để biết một số cách giải quyết.


1
Tôi không nghĩ như vậy .. VÌ: Tôi FOUND NÓ LÀM VIỆC NHƯ NÀY .. Thực hiện theo các jsfiddle đây
Cody

3
@CodyDmd vẫn đang diễn ra sự kiện nhấp chuột do người dùng kích hoạt. Không giống như câu hỏi ban đầu của OP.
Blazemonger

@CodyDmd Dường như [0]là quan trọng trong fiddle của bạn
Liu Wei

3
Chính xác thì lỗ hổng bảo vệ nào?
Roman Starkov

3
Tôi không biết ý bạn là gì, Blazemonger, bởi vì không có biện pháp bảo vệ nào chống lại việc tải xuống hoặc gian lận nhấp chuột SEO trong Firefox, Chrome cũng như IE11. Nói cách khác, cả câu đầu tiên và câu thứ hai trong câu trả lời của bạn đều sai .
Roman Starkov

3

Chỉ muốn cho các bạn biết, câu trả lời được chấp nhận không phải lúc nào cũng hiệu quả.

Đây là một ví dụ nó sẽ thất bại.

nếu <href='/list'>

href = $('css_selector').attr('href')
"/list"
href = document.querySelector('css_selector').href
"http://localhost/list"

hoặc bạn có thể nối href bạn nhận được từ jQuery vào

href = document.URL +$('css_selector').attr('href');

hoặc cách jQuery

href = $('css_selector').prop('href')

Cuối cùng, gọi nó để thay đổi url của trang hiện tại của trình duyệt

window.location.href = href

hoặc bật nó ra bằng cách sử dụng window.open(url)

Đây là một ví dụ trong JSFiddle.


Vì vậy, bạn đang nói rằng điều này không hoạt động nếu bạn thay đổi nó thành $('css_selector')[0].click()? Nó hoạt động trong JsFiddle này ...
Roman Starkov

Đối với kỷ lục, không phải tôi đã phản đối; Tôi nghĩ có thể có điều gì đó ở đây và tôi chưa chắc chắn.
Roman Starkov

@romkyns, Tất nhiên, nó sẽ hoạt động sau khi bạn trích xuất từ ​​các phần tử jQuery bằng cách sử dụng [0] (Nó trở thành JS thuần túy), tôi muốn nói rằng $('.cssbuttongo').click();sẽ không hoạt động vì nó chỉ cung cấp bất kỳ giá trị nào của href, thay vì URL của trình duyệt sử dụng. Xin lỗi về những bình luận gây hiểu lầm.
Alan Dong

2
@LinDong: Nếu bạn biết điều đó hiệu [0].click()quả, tại sao câu trả lời của bạn không đề cập đến điều đó?
Timwi

location.hrefchấp nhận các đường dẫn tương đối, vì vậy việc sử dụng /listsẽ tự động thêm trước tên miền hiện tại. Vì vậy, nó hoạt động.
Tim

-1

Tôi đã gặp phải một vấn đề tương tự như thế nào để nhấp vào một nút, thay vì một liên kết. Nó không thành công trong các phương pháp .trigger ('click') hoặc [0] .click () và tôi không biết tại sao. Cuối cùng, những điều sau đây đã làm việc cho tôi:

$('#elementid').mousedown();
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.