Можно ли отправлять 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);
                        }
                    }