Добавьте keyListener для имитации щелчка мышью по ссылке, страница сделана с помощью сервлетов Javax jspx.getElementById возвращает ноль - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь добавить горячие клавиши в веб-приложение, которое мы используем на работе.Решением было применить сценарий Greasemonkey, но веб-система использует Liferay Portal, созданный с помощью серверных апплетов JavaX и jspx.

Я НЕ ЗНАЮ, КАК ПРИМЕНИТЬ "WAITFORKEYELEMENTS" ответ мои знания не настолько продвинуты.

В чем проблема?Мне нужно найти ярлык для ссылки, то есть «история файла дела», добавить событие keylistener и смоделировать щелчок мышью.Вот пример ссылки:

<a id="form1:commandLink1211" name="form1:commandLink1211" 
onclick="submitForm('form1',1,{source:'form1:commandLink1211'});
return false;" 
class="linkMenu" href="#">
Look case file history
</a>

Мне нужно, чтобы она имитировала щелчок мышью по этой ссылке, но getElementById возвращает ноль.Страница загружается «пусто», а затем загружает модуль jspx.Я знаю, что greasemonkey ставит сценарий первым.Я пытался использовать

window.onload=funcion
document.ready() //didn´t know how to add this to my code

Другие решения включают использование таймера, но я не знаю, как его применить.

Текущий скрипт greasemonkey:

(function(){
document.addEventListener('keydown', function(e) {
// pressed alt+g
if (e.keyCode == 71 && !e.shiftKey && !e.ctrlKey && e.altKey && !e.metaKey)
{
console.log ("key pressed");
document.getElementById('form1:commandLink1211').click();
}
}, false);
})();

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Вместо document.getElementById('form1:commandLink1211').click(); можно вместо submitForm('form1',1,{source:'form1:commandLink1211'});.Он должен делать то же самое, верно?

0 голосов
/ 13 декабря 2018

Поведение по умолчанию GreaseMonkey и подобных альтернатив заключается в запуске пользовательских скриптов после загрузки DOM (document-object-model), т. Е. Как только HTML был проанализирован, но до завершения загрузки включенных ресурсов.

Некоторые скрипты должны делать что-то до загрузки DOM.Для этого они используют запись метаблока @run-atdocument-start.Это дает вам возможность перехватить все, что сайт делает во время загрузки.Однако с этой записью ваши скрипты ничего не знают о документе, когда они запускаются.(Обратите внимание на ограниченную поддержку в GM 4.0)

Если вам не нужно ничего делать до загрузки сайта, используйте мета-запись @run-at document-end или вообще не указывайте эту запись.

Более точный подход заключается в реализации прослушивателя событий.Современные браузеры поддерживают событие DOMContentLoaded, ранее известное как событие "domready" в некоторых JS-инфраструктурах.

document.addEventListener('DOMContentLoaded', evt =>
{
  // Do DOM-based stuff here...
  document.addEventListener('keydown', evt =>
  {
    document.getElementById('form1:commandLink1211').click();
  });
});

Используя JQuery, также будет работать сокращение $(evt => {/* DOM ready stuff */} );.

0 голосов
/ 10 декабря 2018

Элемент еще не был загружен во время работы Javascript, поэтому элемент с указанным идентификатором не был найден.Попробуйте обернуть функцию вокруг вашего кода:

function loaded(){
document.addEventListener('keydown', function(e) {
// pressed alt+g
if (e.keyCode == 71 && !e.shiftKey && !e.ctrlKey && e.altKey && !e.metaKey)
{
console.log ("key pressed");
document.getElementById('form1:commandLink1211').click();
}
}, false);
}

и убедитесь, что в теге body есть

onload="loaded()"

.

...