Chrome textarea 错误 - 当 dir="auto" + 占位符 + 1 rtl 字符使用 right/left 箭头时挂起 chrome

Chrome textarea bug - when dir="auto" + placeholder + 1 rtl character using right/left arrows hangs chrome

您可以在 attached codepen 中看到导致 chrome 挂起的场景,解决它的唯一方法是关闭选项卡。
这也发生在我的一个电子项目中,所以这不是 chrome 特有的。

重现步骤:
1. 有一个带有 dir="auto" 的文本区域和一个占位符以及希伯来语
中的 1 个字符 2. 关注文本区域并点击左右箭头
3. chrome 永远挂起

<textarea dir="auto" cols="5" rows="3" placeholder="write something">ע</textarea>

很高兴听到解决此错误的想法,直到 google 修复它(报告它)

编辑
这个问题比我想的更糟糕,如果你有一个占位符并不重要,如果 dir="auto" 并且英文字符串中有一个希伯来字母,使用箭头导航将崩溃 chrome 当你得到希伯来字母(你可以粘贴 dגd 看看)。
如果您添加两个希伯来字母(如 aaaגגbbb)并使用箭头导航,它不会崩溃,但会表现得很奇怪,在希伯来字母之间输入某种光标循环
请在此处为这个错误加注星标 https://bugs.chromium.org/p/chromium/issues/detail?id=625739

编辑 2
chromium 团队修复了这个错误,并且已经在 Canary 上修复了 :)

编辑 3 该修复程序现已在 Chrome 52 上生效,您可以使用 this 检查 chrome 版本并禁用左箭头键

我选择的 "solution" 是在未按下 shift 且文本区域包含 rtl 字符时禁用左箭头键。 在此处更新代码 http://codepen.io/avipinto/pen/kXwBWq

代码如下:

var rtlPattern =/[\u0590-\u085F,\u08A0-\u08FF,\uFB1D-\uFEFF]|\uD802[\uDC40-\uDFFF]|\uD803[\uDC00-\uDCFF]|\uD803[\uDE60-\uDE7F]|\uD83B[\uDE00-\uDEFF]/;    
$(document).on("keydown","textarea",function(event){
   if (!event.shiftKey && (event.keyCode === 37))
   {
     if(this.value && rtlPattern.test(this.value))
     { 
       event.preventDefault();
     }
   }
});

通过以下方式获得此模式:

//Unicode Ranges
// \u0590-\u05FF Hebrew
// \u0600-\u06FF Arabic
// \u0700-\u074F Syriac
// U+0750-U+077F Arabic Supplement
// U+0780-U+07BF Thaana Letter Paviyani
// U+07C0-U+07FF NKo
// U+0800-U+083F Samaritan
// U+0840-U+085F Mandaic
//--------------------
// U+08A0-U+08FF Arabic Extended-A
//--------------------
// U+FB1D-U+FB4F Alphabetic Presentation Forms  (part of it)
// U+FB50-U+FDFF Arabic Pres. Forms-A
// U+FE70-U+FEFF Arabic Pres. Forms-B
//--------------------
// U+10840-U+1085F Imperial Aramaic
// U+10860-U+1087F Palmyrene
// U+10880-U+108AF Nabataean
// U+108E0-U+108FF Hatran
// U+10900-U+1091F Phoenician
// U+10920-U+1093F Lydian
// U+10980-U+1099F Meroitic Hieroglyphs
// U+109A0-U+109FF Meroitic Cursive
// U+10A00-U+10A5F Kharoshthi 
// U+10A60-U+10A7F Old South Arabian
// U+10A80-U+10A9F Old North Arabian
// U+10AC0-U+10AFF Manichaean
// U+10B00-U+10B3F Avestan 
// U+10B40-U+10B5F  Inscriptional Parthian
// U+10B60-U+10B7F Inscriptional Pahlavi
// U+10B80-U+10BAF Psalter Pahlavi
// U+10C00-U+10C4F Old Turkic 
// U+10C80-U+10CFF Old Hungarian
// the top range is calculated by https://github.com/mathiasbynens/regenerate :
//  console.log(regenerate().addRange(0x10840,0x10CFF).toString());
//  > \uD802[\uDC40-\uDFFF]|\uD803[\uDC00-\uDCFF]
//-----------------------------------------
// U+10E60-U+10E7F Rumi Numeral Symbols
//  console.log(regenerate().addRange(0x10E60,0x10E7F).toString());
//  > \uD803[\uDE60-\uDE7F]
//-----------------------------------------
// U+1EE00-U+1EEFF Arabic Mathematical Alphabetic Symbols
//  console.log(regenerate().addRange(0x1EE00,0x1EEFF).toString());
//   > \uD83B[\uDE00-\uDEFF]