在JavaScript中,如果将textarea设置为focus(),并且作为子窗口调用,它将无效。

25

我有一个简单的测试页面,该页面在oninit函数中将焦点设置到一个文本区域。但是,如果将页面作为子页面调用,则精确代码无法实现此目标。

放置警报框可以证明oninit函数被调用,但未能将焦点置于文本框中。然而,单击重新加载后可以正确地聚焦。

因此,考虑到我的代码在主页面上调用时完美运行,并且在调用子页面时也可以通过重新加载工作,那么为什么第一次不起作用呢?

<html>
<body onload="init()">
<script type="text/javascript">
function init()
{
    document.getElementById("message").focus();
}

</script>
<textarea id="message" rows=10 cols=40></textarea>
</body>
</html>

这里没有什么巧妙的东西,就是如果页面是通过window.open("test2.html")加载的话就无法正常工作。


1
“如果页面被称为子页面”,这句话是什么意思? - jfriend00
@jfriend00,我想他的意思是 window.open('') - Dvir
非js解决方案:有autofocus,像这样<textarea autofocus>Hello</textarea> - neoneye
2个回答

18

无论事件如何,您都可以使用setTimeout。

setTimeout(function() {
    document.getElementById("elementId").focus();
}, 0);

1
这是在问题需要指定的 JavaScript 的情况下利用 jQuery。我知道这似乎很微小,但有些情况下可能无法使用 jQuery。 - Bueno
1
我知道,但是最好提供备选答案,这样社区就可以从中受益,而不是重复问题并重新发布相同的答案。我认为你最好学习一下社区指南。 - Ishan Liyanage
Ishan Liyanage是对的@Bueno。我刚刚得到了他的答案帮助。 - David Dutra
在响应式语言(React、Preact、Svelte等)中,这解决了 focus() 方法可能无法正常工作的问题。+1,谢谢。 - cssyphus
对我来说很有效 :) - undefined

8

您使用的是哪个浏览器? 我在Firefox、Chrome和IE中进行了检查。 您的代码运行完美,并且聚焦于文本区域。

我在同一目录下创建了两个文件test1.html和test2.html。 在test1.html中,我插入了以下代码...

<html>
<body>
<script type="text/javascript">
function init()
{
    window.open('test2.html');
}

</script>
<button onclick="init()">test</button>
</body>
</html>

在test2.html中...

<html>
<body onload="init()">
<script type="text/javascript">
function init()
{
    document.getElementById("message").focus();
}

</script>
<textarea id="message" rows=10 cols=40></textarea>
</body>
</html>

然后,我运行了test1.html并点击了按钮,test2.html出现了,并且焦点在文本框上。


我正在使用我的Chromebook上的Google Chrome浏览器。现在,我通过将打开调用更改为window.open('test2.html',“”,'width = 530px,height = 230px')来复制了您的测试代码中的故障。 - Ian Smith
根据您的更改,我也在window.open中进行了更改。但是代码运行完美,并且聚焦于文本区域。 - Hasib Tarafder
终于找到了如何在Chromebook上打开80端口并连接我的Mac。在Mac上使用Safari、Chrome和Firefox测试页面都能正常工作。看起来这是Chrome的Arm版本存在的一个bug,这也是为什么我感到困惑的原因,因为我认为它应该可以工作。 - Ian Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接