gpt4 book ai didi

javascript - 在自动更正的同时跟踪文本字段中光标位置的更好方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:02:17 25 4
gpt4 key购买 nike

我正在开发一个 jQuery 插件,用于将拉丁字符实时(自动更正)转换为日文假名符号 ( live example ),如果我打字速度不快,它可以正常工作。这是个问题.

例如:

wakarimasu -> わかります

但是,当我以正常速度打字时,我得到了这个:

wakarimasu -> わかりあすm (which is actually wakariasum, cursor between "す" and "m" in the end)

如果我输入时不带“su”,我会得到:

wakarima -> わかりあm (which is actually wakariam, cursor between "あ" and "m" in the end)

我弄清楚了这是为什么以及如何发生的。基本上,“ri - り”符号仍在从拉丁语转换为日语假名,而我已经输入了“m”,并且在我设法输入“a”之前完成了一点点。因为我的函数在每次转换后都会定位光标,它将光标定位在“ri”和“m”之间,这就是我的“a”结束的地方。

其他词也会出现这种情况,但我以这个为例。

有没有一种方法可以更智能地跟踪光标位置,或者有没有一种方法可以只更新/转换/替换文本字段的一部分而不更新整个文本字段(它现在的工作方式是获取文本字段中的内容)文本字段,在函数内的变量内用假名替换拉丁语,用变量中的新字符串更新文本字段,然后定位光标)?告诉访问者不要打得太快并不是正确的方法..

Legend: wa=わ ka=か ri=り ma=ま su=す a=あ

可以在我提供的链接中查看源代码。谢谢。

编辑:需要考虑的另一件事是用户可能会左右移动光标以添加或删除字符/符号。这会使定位变得有点复杂,但目前可以使用。

最佳答案

function translateWord( textarea, oldText, newText ) {
var ctpos = getCaretPosition( textarea );

var textStr = textarea.value;

var oldTextLen = oldText.split("").length;
var newTextLen = newText.split("").length;

var txtDiffLen = ( newTextLen - oldTextLen );

var escText = oldText.replace( /([()\[\]\\\/+*?.-])/g, "\\$1" );
var regExpr = new RegExp( "\\b"+escText+"\\b", 'gi' );
var diffStr = textStr.match( regExpr );
diffStr = ( diffStr ) ? diffStr.length : 1;

var newStr = textStr.replace( regExpr, newText );
ctpos = ( ctpos + ( txtDiffLen * diffStr ) );

textarea.value = newStr;
setCaretPosition( textarea, ctpos );
}

function getCaretPosition( textarea ) {
if ( textarea.selectionStart ) {
return textarea.selectionStart;
}
else if ( !document.selection ) {
return 0;
}

var c = "\001",
sel = document.selection.createRange(),
dul = sel.duplicate(),
len = 0;

dul.moveToElementText( textarea );
sel.text = c;
len = dul.text.indexOf( c );
sel.moveStart( 'character', -1 );
sel.text = "";
return len;
}

function setCaretPosition( textarea, pos ) {
if ( textarea.setSelectionRange ) {
textarea.focus();
textarea.setSelectionRange( pos, pos );
}
else if ( textarea.createTextRange ) {
var range = textarea.createTextRange();
range.collapse( true );
range.moveEnd( 'character', pos );
range.moveStart( 'character', pos );
range.select();
}
}

translateWord( document.getElementById('text-input'), 'wakarimasu', 'わかります' );

我知道这是一个老问题,但这段代码可以帮助像我这样的新手 :)来自其他一些答案的混合功能:)

关于javascript - 在自动更正的同时跟踪文本字段中光标位置的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12662376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com