【问题标题】:Text field won't focus unless window is in focus除非窗口处于焦点,否则文本字段不会聚焦
【发布时间】:2015-01-10 00:49:50
【问题描述】:

我有一个自动输入用户信息的 Greasemonkey 脚本。但是在提交表单之前,这些字段必须是焦点(我认为他们使用 AngularJS 来验证是否输入了有效的姓名/电子邮件)。所以在我的代码中我这样做:

document.getElementById('name').value = "Name here"; //Enter name in field
document.getElementById('name').focus(); //Focus on the field

这工作正常,但仅当窗口处于活动状态时。如果窗口未激活,它将输入名称但该字段不会成为焦点(因此无法提交)。是否有任何修改可以解决此问题?

编辑:我很难提供示例,因为代码必须从非活动窗口运行,但这里是输入字段的代码。

<input id="namefield[name]" name="name" ng-model="nameField.form.name" ng-pattern="nameRegex()" placeholder="John Doe" required="" style="width: 246px" type="text" class="ng-valid-pattern ng-dirty ng-valid ng-valid-required">

【问题讨论】:

  • 这道题还是不完整的;我们没有足够的信息来复制问题。如果下面的答案不起作用,那么页面正在动态改变焦点(或目标节点),你真的必须提供对有问题页面的访问权限,或者将其缩减为一个简洁的、公开发布的示例,展示相同的行为。

标签: javascript angularjs forms greasemonkey


【解决方案1】:

AngularJS 很大程度上是由 AJAX 驱动的,所以它可能是一个时间问题。 JS,尤其是定时器,is slowed down on pages that don't have focus.

因此,可能只使用 AJAX 感知技术就足够了。例如:

// ==UserScript==
// @name     _Focus the name input
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/
waitForKeyElements ("#name", focusInput, true);

function focusInput (jNode) {
    jNode[0].focus ();
}

注意问题代码列表:&lt;input id="namefield[name]"... 但搜索 id name.
如果这不是错误,则表明 AngularJS 正在重写 HTML(我还没有学到很多 AngularJS)——这将进一步证明原始脚本完全有效是由于赢得了竞争条件.也就是说,根本不可靠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    相关资源
    最近更新 更多