我如何以编程方式检查浏览器将某些字符作为RTL在JavaScript?
也许创造一些透明的DIV,看着这里的文字被置于?
上下文的位。 Unicode的5.2增加阿维斯塔字母的支持。 因此,如果浏览器对Unicode 5.2的支持,它把字符,如U + 10B00作为RTL(目前只有Firefox没有)。 否则,它把这些字符作为LTR,因为这是默认的。
如何以编程方式检查呢? 我写的阿维输入脚本,我想重写比迪烟的方向,如果浏览器是太愚蠢。 但是,如果浏览器支持Unicode,比迪烟的设置不应被覆盖(因为这将允许混合斯陀语和斯拉夫语)。
我现在这样做:
var ua = navigator.userAgent.toLowerCase();
if (ua.match('webkit') || ua.match('presto') || ua.match('trident')) {
var input = document.getElementById('orig');
if (input) {
input.style.direction = 'rtl';
input.style.unicodeBidi = 'bidi-override';
}
}
但是,很明显,这将使得脚本可以使用较少的后Chrome和Opera开始支持Unicode的5.2。
function isRTL(s){
var ltrChars = 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF'+'\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF',
rtlChars = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC',
rtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']');
return rtlDirCheck.test(s);
};
操场页
我意识到这是相当长的一段原有人问后,并回答了,但我发现垂直同步的更新是相当有用的,只是想补充一些意见。 我会在他的回答添加评论这一点,但我的名声不够高呢。
取而代之的是正则表达式,从线路零个或多个非LTR字符的开始,然后一个RTL字符的搜索,那岂不是更有意义,从行的开始搜索零个或多个弱/中性字符,然后一个RTL性格吗? 否则,你有不必要的匹配许多RTL人物的潜力。 我会欢迎我弱/中性字符组的一个更彻底的检查,因为我只是用结合LTR和RTL字符组的否定。
此外,不应该字符如LTR / RTL标记,嵌入代码,覆盖被包括在相应的字符的分组?
我想那么最终的代码应该是这个样子:
function isRTL(s){
var weakChars = '\u0000-\u0040\u005B-\u0060\u007B-\u00BF\u00D7\u00F7\u02B9-\u02FF\u2000-\u2BFF\u2010-\u2029\u202C\u202F-\u2BFF',
rtlChars = '\u0591-\u07FF\u200F\u202B\u202E\uFB1D-\uFDFD\uFE70-\uFEFC',
rtlDirCheck = new RegExp('^['+weakChars+']*['+rtlChars+']');
return rtlDirCheck.test(s);
};
更新
可能有一些方法来加快上述正则表达式。 使用否定字符类惰性限定符似乎有助于提高速度(上测试http://regexhero.net/tester/?id=6dab761c-2517-4d20-9652-6d801623eeec ,网站需要的Silverlight 5)
此外,如果该字符串的方向性不明,我的猜测是,大多数情况下,字符串将是LTR,而不是RTL和创建isLTR
函数将返回结果更快,如果是这样的话,但是作为OP是要求isRTL
,将提供isRTL
功能:
function isRTL(s){
var rtlChars = '\u0591-\u07FF\u200F\u202B\u202E\uFB1D-\uFDFD\uFE70-\uFEFC',
rtlDirCheck = new RegExp('^[^'+rtlChars+']*?['+rtlChars+']');
return rtlDirCheck.test(s);
};
首先解决在标题中的问题:
有在JavaScript中没有工具,例如用于访问字符的Unicode属性。 你需要找到为宗旨库或服务(恐怕这可能是困难的,如果你需要的东西可靠),或提取从Unicode字符“数据库”的相关信息(文本文件中的特定格式的集合),并编写自己的代码来使用它。
然后在邮件正文中的问题:
这似乎更让人绝望。 但是,因为这很可能是东西谁是知识渊博,知道阿维的用户数量有限,也许不会太糟糕,在适当的方向性的他们的图像一起显示的阿维字符的字符串,并要求用户点击一个按钮,如果顺序是错误的。 而你可以保存在cookie这个选择,使用户需要做的仅此一次(每个浏览器,但它应该是相对短暂的cookie,因为浏览器可能会更新)。
感谢您的意见,但似乎我这个做自己:
function is_script_rtl(t) {
var d, s1, s2, bodies;
//If the browser doesn’t support this, it probably doesn’t support Unicode 5.2
if (!("getBoundingClientRect" in document.documentElement))
return false;
//Set up a testing DIV
d = document.createElement('div');
d.style.position = 'absolute';
d.style.visibility = 'hidden';
d.style.width = 'auto';
d.style.height = 'auto';
d.style.fontSize = '10px';
d.style.fontFamily = "'Ahuramzda'";
d.appendChild(document.createTextNode(t));
s1 = document.createElement("span");
s1.appendChild(document.createTextNode(t));
d.appendChild(s1);
s2 = document.createElement("span");
s2.appendChild(document.createTextNode(t));
d.appendChild(s2);
d.appendChild(document.createTextNode(t));
bodies = document.getElementsByTagName('body');
if (bodies) {
var body, r1, r2;
body = bodies[0];
body.appendChild(d);
var r1 = s1.getBoundingClientRect();
var r2 = s2.getBoundingClientRect();
body.removeChild(d);
return r1.left > r2.left;
}
return false;
}
使用的例子:
Avestan in <script>document.write(is_script_rtl('