2009-04-30 15 views
42

Trong IE, tôi chỉ có thể gọi element.click() từ JavaScript - làm cách nào để thực hiện cùng một tác vụ trong Firefox? Lý tưởng nhất là tôi muốn có một số JavaScript có thể hoạt động tốt như nhau, nhưng nếu cần, tôi sẽ có JavaScript cho mỗi trình duyệt khác nhau cho điều này.Làm thế nào để tôi lập trình bấm vào một phần tử trong JavaScript?

+1

Câu hỏi này cũng đã được trả lời [tại đây] (http://stackoverflow.com/questions/906486/how-can-i-programmatically-invoke-an-onclick-event-from-a-anchor-tag-while- giữ). –

+1

Vui lòng chấp nhận [câu trả lời của tôi] (http://stackoverflow.com/a/22469115/865175) làm giải pháp vì nhiều người dùng cũng đã yêu cầu. –

Trả lời

51

Các document.createEvent documentation nói rằng "Các createEvent phương pháp bị phản Sử dụng event constructors thay.."

Vì vậy, bạn nên sử dụng phương pháp này để thay thế:

var clickEvent = new MouseEvent("click", { 
    "view": window, 
    "bubbles": true, 
    "cancelable": false 
}); 

và bắn nó vào một yếu tố như này:

element.dispatchEvent(clickEvent); 

như được hiển thị here.

+5

chỉ có một trong đó làm việc cho tôi cả trong firefox và chrome – deej

+1

có lẽ nó phải được chấp nhận như câu trả lời vì hiện tại là từ '09 và sử dụng chức năng không được chấp nhận –

+1

Giải pháp tuyệt vời cho Chrome. Mã để lấy phần tử sau đó thực hiện 'dispatchEvent (clickEvent);' cho tôi là: 'var element = document.getElementById (" id-tag ");' – kbpontius

21

Sử dụng jQuery bạn có thể thực hiện chính xác những điều tương tự, ví dụ:

$("a").click(); 

Mà sẽ "nhấn" tất cả các neo trên trang.

+17

Cũng giống như một ghi chú, công việc này khi href sử dụng onclick, ví dụ: 'Click me' –

10

phần tử.click() là phương pháp chuẩn được vạch ra bởi W3C DOM specification. Mozilla's Gecko/Firefox follows the standard và chỉ cho phép phương thức này được gọi trên các phần tử INPUT.

+5

Hiểu, nhưng không hữu ích khi tôi muốn lập trình mô phỏng nhấp chuột vào các yếu tố phi INPUT. – Bruce

8

Bạn đang cố gắng thực sự theo liên kết hoặc kích hoạt onclick? Bạn có thể kích hoạt một onclick với một cái gì đó như thế này:

var link = document.getElementById(linkId); 
link.onclick.call(link); 
+1

thú vị, tôi sẽ thử. Đây là một phần của việc khai thác thử nghiệm, vì vậy chúng tôi không biết trước yếu tố cụ thể mà chúng ta sẽ nhấp vào - đó là bất kỳ trường hợp thử nghiệm nào nêu rõ. – Bruce

+3

Bạn không cần chỉ định ngữ cảnh; vì onclick là thuộc tính của 'link', bối cảnh đã được thiết lập một cách thích hợp. – James

+2

Tính năng này không hoạt động trong Chrome. Đã xảy ra lỗi trong bảng điều khiển cho biết phương thức "cuộc gọi" không tồn tại. – kbpontius

7

Dưới đây là một chức năng làm việc của trình duyệt chéo (có thể sử dụng cho khác hơn là xử lý nhấp chuột quá):

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

Tôi thấy tôi cần sử dụng 'el [etype]();' trên dòng 3 để khiến IE kích hoạt sự kiện gốc (tôi đã thử nghiệm bằng trình xử lý nhấp chuột - xem http://jsfiddle.net/Pc8qE/) –

+1

Để có được điều này để làm việc tôi đã phải sử dụng một đầu vào của loại trình cho firefox và một đầu vào của loại nút cho IE. –

29

Đối với liên kết firefox dường như là "đặc biệt". Cách duy nhất tôi có thể làm việc này là sử dụng createEvent described here on MDN và gọi hàm initMouseEvent. Thậm chí điều đó không làm việc hoàn toàn, tôi đã tự nói lên trình duyệt để mở một liên kết ...

var theEvent = document.createEvent("MouseEvent"); 
theEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 
var element = document.getElementById('link'); 
element.dispatchEvent(theEvent); 

while (element) 
{ 
    if (element.tagName == "A" && element.href != "") 
    { 
     if (element.target == "_blank") { window.open(element.href, element.target); } 
     else { document.location = element.href; } 
     element = null; 
    } 
    else 
    { 
     element = element.parentElement; 
    } 
} 
+2

làm thế nào nó khác với window.open (element.href, element.target) - tại Firefox của tôi nó hoạt động chính xác như nhau, và hiển thị thanh màu vàng xấu xí – iirekm

+1

Nếu bạn đặt tham số cuối cùng thứ ba của MouseEvent thành true (có nghĩa là metaKey (CMD) nút đã được tổ chức xuống khi bạn nhấp vào), điều này sẽ không mở tab trong một tab nền, phải không? Hay phải không? – Magne

1

tôi đã sử dụng chức năng KooiInc của liệt kê ở trên nhưng tôi đã phải sử dụng hai loại đầu vào khác nhau một 'nút' cho IE và một 'gửi' cho FireFox. Tôi không chắc chắn lý do tại sao nhưng nó hoạt động.

// HTML

<input type="button" id="btnEmailHidden" style="display:none" /> 
<input type="submit" id="btnEmailHidden2" style="display:none" /> 

// trong JavaScript

var hiddenBtn = document.getElementById("btnEmailHidden"); 

if (hiddenBtn.fireEvent) { 
    hiddenBtn.fireEvent('onclick'); 
    hiddenBtn[eType](); 
} 
else { 
    // dispatch for firefox + others 
    var evObj = document.createEvent('MouseEvent'); 
    evObj.initEvent(eType, true, true); 
    var hiddenBtn2 = document.getElementById("btnEmailHidden2"); 
    hiddenBtn2.dispatchEvent(evObj); 
} 

tôi đã tìm kiếm và cố gắng nhiều lời đề nghị nhưng đây là những gì đã kết thúc làm việc. Nếu tôi có thêm thời gian, tôi có thể muốn điều tra lý do tại sao gửi làm việc với FF và nút với IE nhưng đó sẽ là một sự sang trọng ngay bây giờ để tiếp tục vấn đề tiếp theo.