2009-05-06 2 views
22

Я хочу иметь Java Script, нажав на ссылку на page..I нашел что-то в сети, что предполагает добавление функции, как это:Эмуляция нажав на ссылку с JavaScript, который работает с 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); 
    } 
} 

Тогда звоните он использует:

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

Это, кажется, отлично работает для FF, но с IE он не работает!

Любые идеи?

ответ

36

Мне кажется, вам все равно нужно вызвать document.createEventObject - вы только проверили, что он есть. Неисследованный код следует, но на основе docs он должен работать.

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

Я пошел вперед и проверил это сам в IE 7, и она работает; хорошая работа! Я ненавижу тот факт, что все и их мама всегда прыгают на платформу, когда кто-то просто задал вопрос JavaScript. Да, мы знаем, мы знаем, что jQuery может делать все и делать обед для вас, но иногда приятно знать, как все работает без такой библиотеки. (Я использую jQuery и MochiKit, но мне по-прежнему нравится простой JavaScript. –

+1

Подождите, это не имеет смысла. Вы вызываете 'document.createEventObject()', но ничего не делаете с возвращаемым событием. Как это отличается от кода в вопросе и почему он (предположительно) работает? Я искушаюсь думать, что Джейсон изменил что-то еще, что заставило его код начать работать. – s4y

+0

@ Сид, ты прав, что Джейсон что-то меняет. Если вам нужно, ознакомьтесь с моей версией. – Louis

2

Это не сработало для меня сначала, а затем я увидел, что в коде отсутствует параметр для части IE. Вот обновление, которое должно работать:

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

Если вы хотите имитировать щелчки только для ссылок, вы можете использовать это:

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

Мы нашли простой способ для имитации правой кнопкой мыши (протестировано в IE8). Используйте двойной клик или два клика, затем щелкните правой кнопкой мыши, используя Shift-F10. Я точно не знаю, почему это работает, но это так. В приведенном ниже примере кода мы используем метод Selenium для двойного щелчка, затем с помощью драйвера IE найдите WebElement и отправьте последовательность клавиш Shift-F10, которая эмулирует щелчок правой кнопкой мыши. Мы используем это для тестирования веб-приложений на основе GWT. Одно место это не сработало, было в дереве управления, где контекстное меню было установлено, чтобы появляться в координатах мыши. Часто координаты мыши были отрицательными, поэтому щелчок правой кнопкой мыши по элементу меню не приводило к отображению параметров дочернего меню. Чтобы обработать этот случай, мы добавили немного кода в элемент управления, чтобы, если координаты мыши были отрицательными, контекстное меню появляется с 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

Я не уверен, что 'InternetExplorerDriver' является частью стандартной настройки ... –

1

Попробуйте это, если вы все еще получаете ошибку (использование Jquery + прототипа)

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

Хороший, распространяющий карму jQuery. –