搜狗发布了很有意思的javascript输入法 : 搜狗云输入法
基本原理即是:将一段js代码当作书签,当选择时执行,执行时动态插入一个script文件,来监控页面所有框并根据输入拼音异步请求服务器获得中文文字。
目前来看,尚存在一点问题:
1。':' 冒号mac下输不出来,看来是组合键处理上存问题
2。没有处理选择一段文本输入后替换原文字,目前是仍然插入输入区域后面
光标问题 :
其中重要一步,就是识别当前输入框的当前光标位置,并劫持用户输入,再选择汉字后将汉字插入当前输入位置。
而获取光标位置对于 IE 来说可是相当变态,缘于其复杂的 textrange 特性,而其他浏览器则实现了html5的相关属性,处理很简洁。
html5 selectionStart
ie textrange
在
TextArea Cursor Position with JavaScript
的评论中,Strifer 提出了一个比较好的思路,我对其封装修改了一下 :
演示@google code
核心在于对 ie textarea 编辑方面的封转
,使得其和标准浏览器表现一致。
PS :
注意这里的选择区域在规范中和页面的选择区域
并不同,参见规范:
Mostly for historical reasons, in addition to the browsing context
's selection
, each textarea
and input
element has an independent selection. These are the text field selections.
PS2 :
由于 ie 中选择区域只有一块,那么当 textarea 失去焦点时,下次再 focus textarea,在 ie 下光标每次都会跑到前面了,记不住曾经textare的选择区域了,而由于规范区分 textarea 与 input 的选择区域,则没这个问题,在 iframe
下也有类似问题。解决方案为每次 textarea 内的点击都要记录选择区域,当 textarea focusin
时立即恢复:
if (IE) {
var savedRange;
textarea.onmousedown
= textarea.onmouseup
= textarea.onkeydown
= textarea.onkeyup = function() {
savedRange = document.selection.createRange();
};
textarea.onfocusin = function() {
savedRange && savedRange.select();
};
}
PS3 :
moveStart
注意
在 ie 下 textarea 内容中的换行表示为 "\r\n" 长度为 2 ,而 range moveStart 当参数为 "character" 每次移动并指定数值为 1 时,会一次性掠过 \r\n,而会导致获得位置与实际的 textarea.value 字符串中位置不符。另外 range 的某一端(开始或结束)一定不会停留在\r与\n之间,于是当遇到计数光标位置的前方是 "\n",可加一跳过:
for (var sel_end = 0;
(flag = range_all.compareEndPoints('StartToEnd', range)) < 0;
sel_end++) {
if (textarea.value.charAt(sel_end) == '\n') {
sel_end++;
}
range_all.moveStart('character', 1);
}
//光标不可能停在\r,\n之间
if (textarea.value.charAt(sel_end) == '\n') {
sel_end++;
}
如图所示:
如果当前选择为 x\r\n
,则当实际计数位置从 1 经过 ++ 循环到 2 时,range 位置也经过 move 跳过 2 进入 3 ,导致 if 失败,从而计数位置到达 2 ,而实际应返回 3 ,这时可经过判断 2 位置的下一个字符为 “\n” 而执行 ++。
应用示例
身份证号输入即时验证,除了 keydown 外的 keyup 监控解决方案,利用 keyup 监控键入字符,前17位必须为数字,第18位可以是数字或x,X。
问题:
keyup 时木已成舟,无法阻止,若用户输错只能通过重新设置 input 的值,但是会使得光标随改动移至末尾,而不是保留在输入前的中间位置。
解决:
通过设置前保存光标位置,设置后重新restore光标位置,注意 ie 和标准浏览器的差别
demo:
身份证输入即时验证
- 大小: 14.3 KB
- 大小: 3.9 KB
分享到:
相关推荐
这通常发生在用户不直接通过鼠标点击输入框,而是由程序逻辑控制光标位置的情况,比如编辑图片描述或使用某些富文本编辑器。在本篇讨论中,我们将探讨如何用JavaScript来实现这个功能,主要涉及`HTMLElement`对象的`...
JavaScript获取光标位置是网页开发中的一个重要功能,它在用户输入、文本编辑或者富文本处理等场景中扮演着关键角色。这个功能可以帮助开发者精确地控制用户在文本输入框中的光标定位,例如在某些特定字符后插入文本...
这个压缩包很可能包含了一个示例文件,用于演示如何用JavaScript来控制输入框的光标位置,以及实现选中特定文本的效果。 【描述】虽然描述部分重复了多次,但我们可以推测这可能是一个强调重点的提示,可能意味着这...
很好的兼容了IE、Chrome、火狐等多种主流浏览器,轻松获得指定控件光标所在位置的坐标。 用法: var elem = document.getElementById(控件id); var p = kingwolfofsky.getInputPositon(elem); p.left;//获得指定...
直接上代码 代码如下: var kingwolfofsky = { /** * 获取输入光标在页面中的坐标 * @param {HTMLElement} 输入框元素 * @return {Object} 返回left和top,bottom */ getInputPositon: function (elem) { if (document...
在网页开发中,有时我们需要在用户输入的文本框(`<input>`或`<textarea>`)的光标位置动态插入内容。JQuery提供了一个方便的方法来实现这一功能,特别是考虑到不同浏览器之间的兼容性问题,例如IE和Firefox的差异。...
此外,文档中通过使用`substring()`方法来获取和修改输入框中当前光标位置之前和之后的字符串,以及使用`text`、`val`、`focus`等方法来与输入框交互,这些都是常见的JavaScript操作,是开发者必须掌握的基本技能。...
要获得文本框中光标位置,首先需要明白`<input>`和`<textarea>`在DOM中表示的是文本字段,它们拥有相似的属性和方法,但也有不同之处。例如,`<input>`元素是一个单一的文本行,而`<textarea>`元素可以包含多行文本...
在这个方法中,我们可以判断当前活跃的UITextField,如果还有其他UITextField需要填写,那么可以使用`becomeFirstResponder`使下一个输入框获得焦点,同时设置光标位置。这类似于许多应用中的“下一步”功能,让用户...
在网页开发中,有时我们需要动态地获取或设置文本输入框中的光标位置,以及获取或选中用户已经选中的文本。本文将介绍如何使用JavaScript来实现这些功能。 首先,我们来看看如何获取光标的位置。可以通过一个名为...
当用户在某个输入框中按下"Enter"键时,事件处理函数会防止默认的表单提交行为,并计算出下一个应该获得焦点的输入框。如果当前输入框是最后一个,`nextInput`将被设置为第一个输入框,确保循环导航。 通过这种方式...
同时,要确保输入框在获得焦点时,光标在正确的位置开始。 5. **错误提示**: 当用户输入无效的IP地址时,程序应提供反馈。这可以通过设置控件的背景色、显示错误信息或者弹出警告对话框来实现。在VB6中,可以利用...
而设置光标位置则是指在文本框中指定光标应该出现在哪个字符之后。 在jQuery中,我们可以利用`.focus()`方法来为一个元素设置聚焦。然而,这并不会自动将光标移动到文字的末尾。为了实现这一功能,我们需要自定义两...
5. 使用Popup或ContextMenuStrip控件显示提示列表,根据光标位置调整其位置和大小。 6. 当用户选择一个提示项时,更新输入框的内容,并关闭提示列表。 在开发过程中,还需要考虑到性能优化,避免因大量数据匹配导致...
总的来说,这段代码展示了如何在JavaScript中利用特定的浏览器API(如`TextRange`)来控制文本输入框的光标位置,虽然它只适用于IE浏览器。在现代浏览器环境下,开发者需要使用不同的方法来实现相同的功能,以确保...
`setText()`方法用于设置EditText的文本内容,`setSelection()`方法用于设置光标位置,使其位于插入的表情之后: ```java rEditText.setText(sBuilder.toString()); rEditText.setSelection(index + insertEmotion....
最后,使用`setSelection()`方法确保光标始终位于输入的末尾。 为了统计一个字符在字符串中出现的次数,我们编写了一个辅助函数`counter()`,它遍历字符串并计数指定字符出现的次数。 总结一下,实现Android金额...
- 首先,通过`object.createTextRange()`检查当前浏览器是否支持IE的方式设置光标位置。如果支持,创建一个TextRange对象,然后通过`range.collapse(false)`将光标放置在文本的末尾,最后调用`range.select()`选择...
当控件获得焦点时,调用`HideCaret`方法隐藏光标;当失去焦点时,如果控件仍具有焦点,则显示光标。 2. **在窗体中使用自定义控件** 在`Form1.Designer.cs`文件中,将原来的`RichTextBox`控件替换为我们的`...