【问题标题】:Can I do SendKeys in Javascript?我可以在 Javascript 中执行 SendKeys 吗?
【发布时间】:2023-03-31 22:00:03
【问题描述】:

SendKeys 是向应用程序发送击键的方法。
我可以用 Javascript 在浏览器中发送击键吗?

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

【问题讨论】:

  • 这将是一个巨大的安全漏洞,我不建议走 ActiveX 路径——它会提示用户并且只能在 IE 中工作。另一种选择是,如果您创建一个承载 WebBrowser 控件的应用程序。好像有点可疑,是干什么用的?
  • 用于 tabIndex 目的。如果我能做到这一点,我就不需要在事件处理中实现下一个 tabIndex 元素逻辑。
  • 你的意思是表单元素的tabindex属性? htmlcodetutorial.com/forms/_INPUT_TABINDEX.html 为什么需要为此发送击键?
  • 当文本输入等于文本字段最大长度时,我将执行跳转到下一个文本字段的功能。所以如果我使用tabIndex,我必须自己寻找下一个元素。但是如果我能模拟制表键,事件就很简单了。只需按下 Tab 键并为此使用 html tabindex 机制。
  • 为了您的目的,您可以评估 onkeyup 您正在输入的输入的长度(焦点输入文本框)。然后,如果输入的文本长度条件得到验证,您可以使用类似this.nextSibling.focus();

标签: javascript sendkeys


【解决方案1】:

如果您能够在操作系统级别发送击键,这将是一个很大的安全问题。 如果您能够将击键发送到所需的安装对话框,您可以(例如)在客户端计算机上安装任何类型的软件。

是的,您可以在客户端计算机上安装一个 active-x 控件或其他一些工具。但由于这种工具存在安全问题,我不会这样做——即使在受控环境中也是如此。

大多数时候,有一种方法可以在不破坏安全性的情况下实现您所需的功能。

更新:如果你想跳转到下一个tabfield,你必须使用focus()方法来设置焦点到下一个元素。不幸的是,您必须自己在 javascript 中找到下一个元素,但这应该不是什么大问题 - 您可以在 javascript 中保留所有元素的有序列表。

顺便说一句:http://forums.devarticles.com/javascript-development-22/moving-to-next-tabindex-on-event-2382.html

【讨论】:

  • 您可以在操作系统级别发送击键。
  • @fjf2002 你能在 jsfiddle.net 中举个例子吗?
  • 我希望我没有被误解。我想说 SendKeys 在 VBA 或 C# 或 Powershell 中可用。但当然不是在 Javascript 沙箱中。
  • 啊,是的。对不起,我确实理解错了,但现在已经澄清了。您也可以使用 javascript 发送击键,但我猜不是在沙盒浏览器中,只能来自“受信任的”javascript
【解决方案2】:

网页中有很多JS框架实现的事件模拟。

Is it possible to simulate key press events programmatically? 用于 jQuery

Javascript: simulate a click on a link 代表 YUI

然而,更简单的方法是 Ralf 给出的链接的第三篇文章,它关注关于表单元素内元素的 tabIndex 属性的“下一个”文本字段.

如果您制作一个文本字段的 ID 列表和您想要的顺序,可能会有更出色的方法。

当然,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() 重新生成列表。

【讨论】:

    【解决方案3】:

    这对我有用。 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);
                            }
                        }
    

    【讨论】:

      【解决方案4】:

      在大多数浏览器中默认情况下不是,不是。但是,如果它要在 Internet Explorer 中运行,您也许可以使用 ActiveX 使其工作。

      【讨论】:

      • 现在不需要特定于浏览器的解决方案。有太多优秀的 JS 库可以满足您的需求。
      • @Maladon:如果有一个与浏览器无关的 JavaScript 库允许操作系统解释发送的击键,我会非常担心。
      猜你喜欢
      • 2018-02-17
      • 2021-02-14
      • 2016-12-25
      • 2012-05-18
      • 2012-05-06
      • 2011-01-27
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      相关资源
      最近更新 更多