js中<input>如何获得焦点

js中<input>如何获得焦点,第1张

用自带的focus()就可以了

利用js中<input/>实现文本框默认获取输入焦点完整代码实现如下:

<html>

 

<head>

     

<meta >

<script type="text/javascript">       

//输入框获取鼠标焦点       

function autoFocus(){

           

var pFocus = documentgetElementById("password");

pFocusfocus();

   

pFocusselect();

   

}    

</script>

 

</head>

 

<body onload="autoFocus()">

     

<div id="loginform">

     

<h1 style="font-size:15em;padding:20px;">输入密码</h1>

     

<form action="${pageContextrequestcontextPath}/" method="post">

   

<input id="password" type="password" name="password">

 

<input type="submit" value="提交">

   

</form>

   

</div>

 

</body>

</html>

扩展资料:

JavaScript 使我们有能力创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个元素都可以产生某些可以触发JavaScript函数的事件。比方说,我们可以在用户点击某按钮时产生一个 onClick 事件来触发某个函数。事件在 HTML 页面中定义 。

参考资料:

JavaScript官方API接口-:focus

百度百科-JavaScript

W3cschool-获得字段焦点

相信很多刚接触AndroidTV开发的开发者,都会被各种焦点问题给折磨的不行。不管是学技术还是学习其他知识,都要学习和理解其中原理,碰到问题我们才能得心应手。下面就来探一探Android的焦点分发的过程。

Android焦点事件的分发是从ViewRootImpl的processKeyEvent开始的,源码如下:

源码比较长,下面我就慢慢来讲解一下具体的每一个细节。

dispatchKeyEvent方法返回true代表焦点事件被消费了。

ViewGroup的dispatchKeyEvent()方法的源码如下:

(2)ViewGroup的dispatchKeyEvent执行流程

(3)下面再来瞧瞧view的dispatchKeyEvent方法的具体的执行过程

惊奇的发现执行了onKeyListener中的onKey方法,如果onKey方法返回true,那么dispatchKeyEvent方法也会返回true

可以得出结论:如果想要修改ViewGroup焦点事件的分发,可以这么干:

注意:实际开发中,理论上所有焦点问题都可以通过给dispatchKeyEvent方法增加监听来来拦截来控制。

(1)dispatchKeyEvent方法返回false后,先得到按键的方向direction值,这个值是一个int类型参数。这个direction值是后面来进行焦点查找的。

(2)接着会调用DecorView的findFocus()方法一层一层往下查找已经获取焦点的子View。

ViewGroup的findFocus方法如下:

View的findFocus方法

说明:判断view是否获取焦点的isFocused()方法, (mPrivateFlags & PFLAG_FOCUSED) != 0 和view 的isFocused()方法是一致的。

其中isFocused()方法的作用是判断view是否已经获取焦点,如果viewGroup已经获取到了焦点,那么返回本身即可,否则通过mFocused的findFocus()方法来找焦点。mFocused其实就是ViewGroup中获取焦点的子view,如果mView不是ViewGourp的话,findFocus其实就是判断本身是否已经获取焦点,如果已经获取焦点了,返回本身。

(3)回到processKeyEvent方法中,如果findFocus方法返回的mFocused不为空,说明找到了当前获取焦点的view(mFocused),接着focusSearch会把direction(遥控器按键按下的方向)作为参数,找到特定方向下一个将要获取焦点的view,最后如果该view不为空,那么就让该view获取焦点。

(4)focusSearch方法的具体实现。

focusSearch方法的源码如下:

可以看出focusSearch其实是一层一层地网上调用父View的focusSearch方法,直到当前view是根布局(isRootNamespace()方法),通过注释可以知道focusSearch最终会调用DecorView的focusSearch方法。而DecorView的focusSearch方法找到的焦点view是通过FocusFinder来找到的。

(5)FocusFinder是什么?

它其实是一个实现 根据给定的按键方向,通过当前的获取焦点的View,查找下一个获取焦点的view这样算法的类。焦点没有被拦截的情况下,Android框架焦点的查找最终都是通过FocusFinder类来实现的。

(6)FocusFinder是如何通过findNextFocus方法寻找焦点的。

下面就来看看FocusFinder类是如何通过findNextFocus来找焦点的。一层一层往下看,后面会执行findNextUserSpecifiedFocus()方法,这个方法会执行focused(即当前获取焦点的View)的findUserSetNextFocus方法,如果该方法返回的View不为空,且isFocusable = true && isInTouchMode() = true的话,FocusFinder找到的焦点就是findNextUserSpecifiedFocus()返回的View。

(7)findNextFocus会优先根据XML里设置的下一个将获取焦点的View ID值来寻找将要获取焦点的View。

看看View的findUserSetNextFocus方法内部都干了些什么,OMG不就是通过我们xml布局里设置的nextFocusLeft,nextFocusRight的viewId来找焦点吗,如果按下Left键,那么便会通过nextFocusLeft值里的View Id值去找下一个获取焦点的View。

可以得出以下结论:

1 如果一个View在XML布局中设置了focusable = true && isInTouchMode = true,那么这个View会优先获取焦点。

2 通过设置nextFocusLeft,nextFocusRight,nextFocusUp,nextFocusDown值可以控制View的下一个焦点。

Android焦点的原理实现就这些。总结一下:

为了方便同志们学习,我这做了张导图,方便大家理解~

这是属性兼容问题导致的错误。

在IE和FireFox浏览器中,DOM的nextSibling方法的使用存在部分差异:

1 在FireFox中,html标记中空行和换行会被当做节点来处理,所以会出现startNodenextSibling取不到目标节点的情况,得到的元素反而是undefined或是nodeType为text的节点;

2解决方法是:判断startNodenextSibling的nodeType类型:

if(startNodenextSiblingnodeType==3)

{

brotherNode=startNodenextSiblingnextSibling; //如果浏览器是FireFox

}

else

{

brotherNode=startNodenextSibling; //如果浏览器是IE

}

正常情况下应该只将readOnly设为false即可,如:

<input type="text" readonly="readonly" onclick="javascript:thisreadOnly=false;">

但在IE下,有时必须使控件重新获得焦点才能使只读失效,所以,可以用

<input type="text" readonly="readonly" onclick="javascript:thisreadOnly=false;thisblur();thisfocus();">

来确保readOnly=false立即生效

以上就是关于js中<input/>如何获得焦点全部的内容,包括:js中<input/>如何获得焦点、Android TV 焦点原理源码解析、我这样写在IE可以获取焦点,在chrome和火狐浏览器上获取不到焦点。问题出在哪里等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9581284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存