您可以尝试根据字符码猜测文本方向。
如果至少 50% 的字符串被 RTL 符号填充,则该字符串处于 RTL 文本方向。
// Some helper function
function isNumberInRanges(number, ranges) {
for (var i = 0; i < ranges.length; ++i)
if (number >= +ranges[i][0] && number <= +ranges[i][1])
return true;
return false;
}
function guessTextDirection(text) {
/*
* https://www.w3schools.com/charsets/ref_html_utf8.asp
* [?] Non-letter symbolic ranges: 0..64, 91..96, 123..126, 127, 128..159, 160..191, 247, 8592..8703, 8704..8959, ...
* [LTR] Cyrillic, latin, greek, etc letters: 65..90, 97..122, 256..383, 384..591, 768..879, 880..1023, 1024..1279, 1280..1327
* [RTL] Arabic, Hebrew, etc letters: 1470..1920 (in facebook's humble opinion)
*/
text = text.trim();
var symbolsCounter = {
ltr: 0,
rtl: 0
};
for (var i = 0; i < text.length; ++i) {
var keyCode = text.charCodeAt(i);
switch (true) {
case (isNumberInRanges(keyCode, [[1470, 1920]])):
// this is rtl symbol
symbolsCounter.rtl++;
break;
case (isNumberInRanges(keyCode, [[65, 90], [97, 122], [256, 591], [768, 1327]])):
// this is ltr symbol
symbolsCounter.ltr++;
break;
// otherwise, this is non-letter symbol, omitting it
}
}
if (symbolsCounter.ltr > symbolsCounter.rtl) {
return 'ltr';
} else if (symbolsCounter.ltr < symbolsCounter.rtl) {
return 'rtl';
}
return '';
}
用法:
var label = document.querySelector('.some-label');
label.setAttribute('dir', guessTextDirection(label.textContent));
PS 方法可以优化,而且我相信需要某种基准测试;)