Можно ли отправлять SendKeys в Javascript?
SendKeys - это метод отправки нажатия клавиши в приложение.
Могу ли я сделать это в Javascript, чтобы отправить нажатие клавиши в браузере?
REF:
http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx
Ответы
Ответ 1
Если вы сможете отправлять нажатия клавиш на уровне ОС, это будет большой проблемой безопасности.
Вы могли бы (например) установить какое-либо программное обеспечение на клиентскую машину, если вы можете отправлять нажатия клавиш в нужные диалоги установки.
Да, вы можете придумать элемент управления active-x или некоторые другие инструменты, которые будут установлены на клиентской машине. Но из-за проблем с безопасностью с таким инструментом я бы этого не сделал - даже в контролируемой среде.
В большинстве случаев существует способ достичь необходимой функциональности, не нарушая безопасность.
Обновление:. Если вы хотите перейти к следующему полю табуляции, вы должны использовать метод focus(), чтобы установить фокус на следующий элемент. К сожалению, вам нужно найти следующий элемент самостоятельно в javascript, но это не должно быть большой проблемой - вы можете сохранить упорядоченный список всех ваших элементов в javascript.
btw: http://forums.devarticles.com/javascript-development-22/moving-to-next-tabindex-on-event-2382.html
Ответ 2
В веб-странице реализовано много событий, связанных с JS Framework.
Можно ли программно имитировать события нажатия клавиш? для jQuery
Javascript: имитировать клик по ссылке для YUI
Однако, более простой способ заключается в том, что третий столбец ссылки, заданный Ralf, который фокусирует "следующее" текстовое поле относительно свойства tabIndex элементов внутри элемента формы.
Может быть, более яркий способ, если вы составите список идентификаторов текстовых полей и порядок, которым вы хотите быть.
Конечно, список tabIndex может не генерироваться самостоятельно, но, обойдя текстовое поле.
Создайте цикл для создания списка при загрузке документа (DOMContentLoaded):
var tabIndexList = new Array();
function tabIndexListGeneration(){
var form = document.getElementById("Your form ID"), // remember to fill in your form ID
textfields = form.getElementsByTagName("input"),
textfieldsLength = textfields.length;
for(var i=0;i<textfieldsLength;i++){
if(textfields[i].getAttribute("type") !== "text" || textfields[i].getAttribute("tabIndex") <= 0)continue;
/* tabIndex = 0 is neglected as it places the latest, if you want it, change 0 to -1
* and change tabIndexPointer = 0 into tabIndexPointer = -1 below */
tabIndexList[textfields[i].getAttribute("tabIndex")] = textfields[i];
}
}
// You can use the function of JS Framework if you don't like the method below.
if(document.addEventListener){
document.addEventListener("DOMContentLoaded", tabIndexListGeneration, false);
}else{
window.attachEvent("onload", tabIndexListGeneration);
}
И внутри события "текстовый ввод равно текстовой области maxlength":
var tabIndexPointer = target.getAttribute("tabIndex"); // target is the DOM object of current textfield
while(!(++tabIndexPointer in tabIndexList)){
if(tabIndexPointer >= tabIndexList.length)
tabIndexPointer = 0; // or other action after all textfields were focused
}
tabIndexList[tabIndexPointer].focus(); // if other action needed, put it right after while ended
Примечание: структура текстовых полей формы не должна быть мутирована, иначе будет выдана ошибка.
Если текстовое поле генерируется динамически, запустите tabIndexListGeneration()
, чтобы восстановить список.
Ответ 3
По умолчанию в большинстве браузеров нет. Однако вы можете заставить его работать с ActiveX, если он будет запущен в Internet Explorer.
Ответ 4
Это работает для меня. ActiveXObject необходимо открыть в IE.
var PaintProg = new ActiveXObject("WScript.Shell"); //paste to mspaint
PaintProg.Run("mspaint.exe \\\\srv4\\photos\\image1.jpg",9,false);
var PaintTimer = window.setInterval(PaintPaste,1000);
function PaintPaste()
{
if (PaintProg.AppActivate("Paint",true) == true)
{
PaintProg.SendKeys('"^(v)""%(F)""x""~"',true);
window.clearInterval(PaintTimer);
}
}