2009-12-03 2 views
46

Tôi muốn mô phỏng nhấp chuột vào bất kỳ liên kết nào trên trang bằng JavaScript. Nếu liên kết đó có một số hàm liên kết với sự kiện 'onclick' (bởi bất kỳ JS nào khác mà tôi không có quyền kiểm soát), thì hàm đó phải được gọi nếu không thì liên kết sẽ hoạt động bình thường và mở một trang mới.Mô phỏng nhấp chuột trong jQuery/JavaScript trên liên kết

Tôi không chắc chắn rằng việc kiểm tra giá trị của trình xử lý 'onclick' sẽ đủ. Tôi muốn xây dựng nó để nó hoạt động trên bất kỳ phần tử liên kết nào.

Tôi không thể kiểm soát chức năng nào có thể liên kết với sự kiện onclick của liên kết bằng cách sử dụng thư viện JS nào (không nhất thiết là jQuery) hoặc đơn giản bằng cách sử dụng JavaScript.

EDIT: Với sự trợ giúp của các câu trả lời bên dưới, có vẻ như bạn có thể kiểm tra trình xử lý sự kiện được đính kèm bằng jQuery hoặc sử dụng thuộc tính onclick. Làm cách nào để tôi kiểm tra trình xử lý sự kiện được đính kèm bằng cách sử dụng addEventListener/bất kỳ thư viện JS nào khác để thư viện đó dễ sử dụng?

+1

: "Làm sao tôi kiểm tra xử lý sự kiện gắn liền sử dụng addEventListener/bất kỳ thư viện JS khác để nó là hết sức rõ ràng"? Bây giờ * đó * là một bản sao;) Xem http://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node/447106#447106 –

+0

Vẫn không có độ phân giải, mặc dù:) Có thể đi theo cách khác vòng và cố gắng thực sự mô phỏng một nhấp chuột bằng cách tạo ra một MouseEvent? http://stackoverflow.com/questions/1421584/how-can-i-simulate-a-click-to-an-anchor-tag – ankit

+0

@Ankit: đúng vậy, câu trả lời thứ hai sẽ kích hoạt trình xử lý bất kể chúng được đính kèm như thế nào . Bạn vẫn nói "nếu không thì liên kết sẽ hoạt động theo cách thông thường và mở một trang mới". Bạn sẽ có vấn đề với điều đó. Xin lỗi tôi không có thời gian để hữu ích hơn ở đây. –

Trả lời

39

Bạn có thể sử dụng chức năng click để kích hoạt sự kiện nhấp chuột trên phần tử đã chọn.

Ví dụ:

$('selector for your link').click(); 

Bạn có thể tìm hiểu về bộ chọn khác nhau trong jQuery documentation.

CHỈNH SỬA: như những người bình luận bên dưới đã nói; điều này chỉ hoạt động trên các sự kiện được đính kèm với jQuery, nội tuyến hoặc theo kiểu "element.onclick". Nó không hoạt động với addEventListener, và nó sẽ không đi theo liên kết nếu không có trình xử lý sự kiện nào được định nghĩa. Bạn có thể giải quyết vấn đề này với một cái gì đó như thế này:

var linkEl = $('link selector'); 
if (linkEl.attr ('onclick') === undefined) { 
    document.location = linkEl.attr ('href'); 
} else { 
    linkEl.click(); 
} 

Không biết về addEventListener.

+0

Xem nhận xét cho câu trả lời ở trên bởi Robert – ankit

+1

Điều đó không đúng. Nó hoạt động trên tất cả các sự kiện bất kể nó bị trói buộc như thế nào. –

+1

Phương pháp nhấp chuột kích hoạt phương thức onclick của liên kết. Nó không theo url được định nghĩa trong thuộc tính href. – kgiannakakis

8

Dễ dàng! Chỉ cần sử dụng click chức năng của jQuery:

$("#theElement").click(); 
+1

Từ những gì tôi đã đọc, chức năng click() của jQuery chỉ kích hoạt các chức năng đã được giới hạn trong sự kiện nhấp của phần tử bằng jQuery? Nó không hoạt động. – ankit

+0

@Ankit: nó cũng kích hoạt bất kỳ trình xử lý sự kiện nội tuyến (tức là 'onclick =" ... "), nhưng có, nếu không bạn là chính xác. –

+0

@Crescent Cảm ơn, tôi không biết rằng – ankit

1

Lúc đầu thấy question này để xem làm thế nào bạn có thể tìm thấy nếu một liên kết có một handler jQuery được gán cho nó.

sử dụng tiếp theo:

$("a").attr("onclick") 

để xem nếu có một sự kiện javascript gán cho nó.

Nếu bất kỳ điều nào ở trên là đúng, thì hãy gọi phương thức nhấp. Nếu không, hãy liên kết:

$("a").attr("href") 

và làm theo.

Tôi sợ tôi không biết phải làm gì nếu addEventListener được sử dụng để thêm trình xử lý sự kiện. Nếu bạn chịu trách nhiệm về toàn bộ nguồn trang, chỉ sử dụng các trình xử lý sự kiện jQuery.

+0

Đúng, nhưng các sự kiện bị ràng buộc với "JS khác tôi không có bất kỳ sự kiểm soát nào" (như các đề cập OP) như 'addEventListener' hoặc' attachEvent' jQuery không có cách nào để biết về những điều đó: http://stackoverflow.com/question/446892/how-to-find-event-listeners-on-a-dom-node/447106 # 447106 –

+0

Sẽ dễ dàng hơn nhiều nếu tôi chịu trách nhiệm về nguồn trang. Thật không may, tôi đang xây dựng này như là một plugin và do đó, nó cần phải được hoàn toàn foolproof. – ankit

27

Chỉ

$("#your_item").trigger("click"); 

sử dụng .trigger(), bạn có thể mô phỏng nhiều loại sự kiện, chỉ cần đi qua nó như là tham số.

+0

Đã giải quyết được vấn đề của tôi. Cảm ơn bạn. –

0

Tất cả điều này có thể không giúp ích khi bạn sử dụng nút biểu mẫu từ xa đường ray để mô phỏng nhấp chuột. Tôi đã cố gắng để mô phỏng sự kiện mô phỏng tốt đẹp từ nguyên mẫu ở đây: my snippets. Chỉ cần làm điều đó và nó làm việc cho tôi.

7

Hãy thử điều này

function submitRequest(buttonId) { 
    if (document.getElementById(buttonId) == null 
      || document.getElementById(buttonId) == undefined) { 
     return; 
    } 
    if (document.getElementById(buttonId).dispatchEvent) { 
     var e = document.createEvent("MouseEvents"); 
     e.initEvent("click", true, true); 
     document.getElementById(buttonId).dispatchEvent(e); 
    } else { 
     document.getElementById(buttonId).click(); 
    } 
} 

và bạn có thể sử dụng nó như

submitRequest("target-element-id"); 
+2

Điều này hoạt động rất tốt. Cảm ơn bạn đã đăng phiên bản không phải jquery. –

37

Tại sao không chỉ là ol tốt' javascript?

$('#element')[0].click()

+52

Làm thế nào là tốt này ol 'javascript? Đây là jQuery! – SNag

+6

Bằng cách truy cập phần tử đầu tiên trong tập hợp jQuery, bạn có được một phần tử DOM, và tiếp theo bạn đang gọi một phương thức từ giao diện HTMLElement, thực tế là, tốt ol 'javascript – frankies

+0

Ah! lỗi của tôi. Tôi không chú ý đến '[0]'. Nhưng tại sao làm điều này? jQuery cũng hỗ trợ phương thức '.click()', vì vậy chỉ đơn giản là '$ ('# element'). click()' là đủ. Nếu, mặt khác, bạn thực sự thực sự muốn làm điều đó trong đồng bằng ol 'javascript, 'document.getElementById (' element '). Click()' sẽ làm, phải không? – SNag