Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检测文本区域中键入的文本是RTL_Javascript_Jquery_Html_Css_Right To Left - Fatal编程技术网

Javascript 如何检测文本区域中键入的文本是RTL

Javascript 如何检测文本区域中键入的文本是RTL,javascript,jquery,html,css,right-to-left,Javascript,Jquery,Html,Css,Right To Left,我有一个文本区,用户可以在其中输入英语(或任何其他从左到右的语言)或RTL语言的文本 当用户在RTL中写入时,用户必须按Right shift+ctrl以使文本向右对齐并成为RTL。然而,在windows(可能还有其他现代操作系统)中,用户可以设置任意组合键来切换语言和文本方向 我知道如何将文本显示为RTL,但如何知道显示的方向 有没有办法检测在textarea/text字段中键入的文本是否为RTL?您可以使用正则表达式快速编写一段JavaScript/jQuery代码。不过,正则表达式在Jav

我有一个文本区,用户可以在其中输入英语(或任何其他从左到右的语言)或RTL语言的文本

当用户在RTL中写入时,用户必须按Right shift+ctrl以使文本向右对齐并成为RTL。然而,在windows(可能还有其他现代操作系统)中,用户可以设置任意组合键来切换语言和文本方向

我知道如何将文本显示为RTL,但如何知道显示的方向


有没有办法检测在textarea/text字段中键入的文本是否为RTL?

您可以使用正则表达式快速编写一段JavaScript/jQuery代码。不过,正则表达式在JavaScript中是有限的,因此您需要使用具有完全Unicode支持的库—如果您添加了。然后,您可以使用如下表达式检查字符,查看它们属于哪个Unicode块\p{Hebrew}

面对同样的困境,我自己编写了一个函数,循环遍历每个字符串中的字符,并统计希伯来文字符出现的次数(我的站点是双语的意第绪语/英语)。然后字符串得到一个分数,“rtl”类应用于分数较高的元素。您可以轻松地将Unicode中的所有RTL语言添加到for循环中,以使其更通用

请注意JSFIDLE中链接到XRegExp库的外部资源

$('p').each(function() {
    if(isRTL($(this).text()))
        $(this).addClass('rtl');
});

function isRTL(str) {
    var isHebrew = XRegExp('[\\p{Hebrew}]');
    var isLatin = XRegExp('[\\p{Latin}]');
    var partLatin = 0;
    var partHebrew = 0;
    var rtlIndex = 0;
    var isRTL = false;

    for(i=0;i<str.length;i++){
        if(isLatin.test(str[i]))
            partLatin++;
        if(isHebrew.test(str[i]))
            partHebrew++;
    }
    rtlIndex = partHebrew/(partLatin + partHebrew);
    if(rtlIndex > .5) {
        isRTL = true;
    }
/*
console.log('Latin score: ' + partLatin);
console.log('Hebrew score: ' + partHebrew);
console.log('trlIndex score: ' + rtlIndex);
console.log('isRTL: ' + isRTL);
*/

    return isRTL;
}
$('p')。每个(函数(){
if(isRTL($(this.text()))
$(this.addClass('rtl');
});
功能isRTL(str){
var isHebrew=XRegExp(“[\\p{Hebrew}]”);
var isLatin=XRegExp('[\\p{Latin}]');
var-partLatin=0;
var partHebrew=0;
var-rtlIndex=0;
var-isRTL=false;
对于(i=0;i.5){
isRTL=真;
}
/*
console.log('拉丁语分数:'+部分拉丁语);
log('希伯来语分数:'+部分希伯来语);
log('trlIndex分数:'+rtlIndex);
console.log('isRTL:'+isRTL);
*/
返回isRTL;
}

我想出了一个更简单、更好的解决方案。只需将
dir=“auto”
添加到元素中,浏览器就会完成它的工作

请参阅:

尝试以下操作:

var rtl_rx = /[\u0591-\u07FF]/;
$('textarea').on('keyup',function(){
    this.style.direction = rtl_rx.test(this.value) ? 'rtl' : 'ltr';
});
我使用了一个简化的RegExp来检测RTL

/[\u0591-\u07FF]/

虽然它不会捕获Unicode表中的每个RTL字符,但它可能涵盖了所有实际情况。它包括所有普通的希伯来语和阿拉伯语字符,包括元音化字符。

在所谓的BiDi模式中,有一些特定的unicode字符用于指示文本方向,但我不知道它是否适用于您的情况。这些字符是否包含在保存在文本区域的实际文本中?我想在大多数情况下,UI强制用户在必要时使用英语字母表,并在表单中为特定语言的输入提供特定字段,因此不需要检测代码。我不知道输入是否能处理这个问题。如果输入值包含混合文本,我想他们会这样做,但否则我无法判断。您可能可以在textarea中设置一个文本更改事件处理程序来查找这些字符,并测试您是否有支持BiDi的操作系统。嘿,谢谢。我知道这个解决方案,它还是很新的,并不是所有浏览器都能很好地实现它(Firefox22开始处理它)谢谢,很高兴知道。这也将是很好的拿出一个支持表,所以如果有人发现一个,请让我知道!您可以在中看到摘要表,它在IE 11中不受支持,在cordova应用程序中测试,并像charmjust use dir=“auto”一样工作