2009-05-06 27 views
22

Tôi muốn có kịch bản java nhấp chuột vào một liên kết trên page..I tìm thấy một cái gì đó trên mạng rằng đề xuất thêm một chức năng như thế này:Emulate nhấp chuột vào một liên kết với javascript làm việc với IE

function fireEvent(obj,evt){ 

    var fireOnThis = obj; 
    if(document.createEvent) { 
     var evObj = document.createEvent('MouseEvents'); 
     evObj.initEvent(evt, true, false); 
     fireOnThis.dispatchEvent(evObj); 
    } else if(document.createEventObject) { 
     fireOnThis.fireEvent('on'+evt); 
    } 
} 

Sau đó gọi nó sử dụng:

fireEvent(document.getElementById('edit_client_link'),'click'); 

Điều này có vẻ phù hợp với FF nhưng với IE không hoạt động!

Bất kỳ ý tưởng nào?

Trả lời

36

Tôi nghĩ bạn vẫn cần gọi document.createEventObject - bạn chỉ kiểm tra xem nó có ở đó không. Mã chưa được kiểm tra theo sau, nhưng dựa trên docs nó sẽ hoạt động.

function fireEvent(obj,evt){ 

    var fireOnThis = obj; 
    if(document.createEvent) { 
     var evObj = document.createEvent('MouseEvents'); 
     evObj.initEvent(evt, true, false); 
     fireOnThis.dispatchEvent(evObj); 

    } else if(document.createEventObject) { 
     var evObj = document.createEventObject(); 
     fireOnThis.fireEvent('on' + evt, evObj); 
    } 
} 
+17

tôi đã đi trước và thử nghiệm này bản thân mình trong IE 7 và nó hoạt động; công việc tốt! Tôi không thích một thực tế là mọi người và mẹ của họ luôn nhảy vào khuôn khổ khung khi ai đó chỉ đơn giản hỏi một câu hỏi JavaScript. Có, chúng tôi biết, chúng tôi biết, jQuery có thể làm mọi thứ và làm bữa tối cho bạn, nhưng đôi khi thật tuyệt khi biết cách mọi thứ hoạt động mà không có thư viện như vậy. (Tôi sử dụng cả jQuery và MochiKit, nhưng tôi vẫn thích JavaScript đơn giản). –

+1

Chờ đã, điều này không có ý nghĩa. Bạn đang gọi 'document.createEventObject()', nhưng không làm bất cứ điều gì với sự kiện nó trả về. Điều này khác với mã trong câu hỏi như thế nào và tại sao nó (được cho là) ​​hoạt động? Tôi bị cám dỗ khi nghĩ rằng Jason đã thay đổi một thứ khác khiến mã của anh ấy bắt đầu hoạt động. – s4y

+0

@Sid, bạn chính xác về việc Jason thay đổi thứ gì đó. Xem bản sửa đổi của tôi để biết chi tiết nếu bạn cần. – Louis

2

Điều này không hiệu quả với tôi lúc đầu và sau đó tôi thấy mã thiếu thông số cho phần IE. Dưới đây là một bản cập nhật mà nên làm việc:

function fireEvent(obj, evt) { 
    var fireOnThis = obj; 

    if (document.createEvent) { 
     // alert("FF"); 
     var evtObj = document.createEvent('MouseEvents'); 
     evtObj.initEvent(evt, true, false); 
     fireOnThis.dispatchEvent(evtObj); 
    } 

    else if (document.createEventObject) { 
     // alert("IE"); 
     var evtObj = document.createEventObject(); 
     fireOnThis.fireEvent('on'+evt, evtObj); 
    } 
} 
0

Nếu bạn muốn mô phỏng nhấp chuột chỉ cho các liên kết, bạn có thể sử dụng này:

function clickLink(id){ 
location.href=document.getElementById(id).href; 
} 
0

Chúng tôi tìm thấy một cách đơn giản hơn để mô phỏng kích chuột phải (thử nghiệm trong IE8). Sử dụng nhấp đúp hoặc hai nhấp chuột duy nhất, sau đó nhấp chuột phải bằng Shift-F10. Tôi không biết chính xác lý do tại sao nó hoạt động, nhưng nó có. Trong mã mẫu bên dưới, chúng tôi sử dụng phương pháp Selenium để nhấp hai lần, sau đó sử dụng trình điều khiển IE để tìm WebElement và gửi chuỗi phím Shift-F10, mô phỏng nhấp chuột phải. Chúng tôi sử dụng tính năng này để thử nghiệm các ứng dụng web dựa trên GWT. Một nơi mà điều này không hoạt động tốt trong điều khiển cây nơi menu ngữ cảnh được đặt để xuất hiện tại tọa độ của chuột. Thông thường, tọa độ chuột là số âm, do đó, việc nhấp chuột phải vào mục menu không làm cho các tùy chọn menu con được hiển thị. Để xử lý trường hợp này, chúng tôi đã thêm một chút mã vào điều khiển để nếu tọa độ chuột là số âm, menu ngữ cảnh xuất hiện ở mức 0,0.

selenium.click("//td[@role='menuitem' and contains(text(), 'Add')]"); 
selenium.click("//td[@role='menuitem' and contains(text(), 'Add')]"); 
new InternetExplorerDriver().findElement(By.xpath("//td[@role='menuitem' and contains(text(), 'Add')]")).sendKeys(Keys.SHIFT, Keys.F10); 
+0

Tôi không chắc chắn nếu 'InternetExplorerDriver' là một phần của thiết lập chuẩn ... –

1

Hãy thử điều này nếu bạn vẫn nhận được lỗi (Sử dụng Jquery + nguyên mẫu)

function fireEvent(element,event){ 
if (document.createEventObject){ 
// dispatch for IE 
try { 
     var evt = document.createEventObject(); 
     jQuery(element).change(); 
     return element.fireEvent('on'+event,evt); 
} catch(e) { }     
} 
else{ 
// dispatch for firefox + others 
var evt = document.createEvent("HTMLEvents"); 
evt.initEvent(event, true, true); // event type,bubbling,cancelable 
return !element.dispatchEvent(evt); 
} 
} 
+0

Người tốt truyền bá nghiệp chướng jQuery. –

Các vấn đề liên quan