Могу ли я сделать SendKeys в Javascript? - PullRequest
17 голосов
/ 13 мая 2011

SendKeys - это метод отправки нажатия клавиши приложению.
Можно ли сделать это в Javascript, чтобы отправить нажатие клавиши в браузере?

REF:
http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx

Ответы [ 4 ]

6 голосов
/ 13 мая 2011

Если бы вы могли отправлять нажатия клавиш на уровне ОС, это было бы большой проблемой безопасности.Вы можете (например) установить любое программное обеспечение на клиентском компьютере, если вы можете посылать нажатия клавиш в необходимые диалоговые окна установки.

Да, вы можете создать элемент управления active-x или некоторые другие инструменты.быть установленным на клиентском компьютере.Но из-за проблем безопасности с таким инструментом я бы не стал этого делать - даже в контролируемой среде.

В большинстве случаев есть способ достичь необходимой функциональности, не нарушая безопасность.

Обновление: Если вы хотите перейти к следующему полю табуляции, вы должны использовать метод focus (), чтобы установить фокус на следующий элемент.К сожалению, вы должны найти следующий элемент самостоятельно в javascript, но это не должно быть большой проблемой - вы можете хранить упорядоченный список всех ваших элементов в javascript.

btw: http://forums.devarticles.com/javascript-development-22/moving-to-next-tabindex-on-event-2382.html

4 голосов
/ 13 мая 2011

На веб-странице реализовано множество симуляций событий, реализованных в 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);
}

А внутри события «ввод текста равен максимальной длине текстового поля»:

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(), чтобы восстановить список.

0 голосов
/ 13 сентября 2016

Это работает для меня.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);
                        }
                    }
0 голосов
/ 13 мая 2011

Не по умолчанию в большинстве браузеров, нет.Однако вы можете заставить его работать, используя ActiveX, если он будет работать в Internet Explorer.

...