Re: 用輸入法打字時 input.value 被更改的情形

下面回文
(11/05/09 4:25), John Hax wrote:
> 这确实是个麻烦事,我也遇到过。字打到一半结果因为脚本的关系,光标乱飞或
> 者文字丢失。类似的情况似乎并不仅限于浏 览器,比如似乎
> thunderbird(mozilla出品的mail client)在用输入法时,光标有一定概率会
> 乱飞。
>
> 先说后一个问题。其实我认为当焦点处于文本框时,合理的行为应是不允许脚本
> 修改文本值,比较好的方式是:
>
> 1. 阻塞脚本。不过这也会阻塞ui。所以只适用于手机等设备。

我不太懂為什麼手機等設備沒有問題,敬請指教。

> 2. 设值失败,甚至扔异常 。不过这会导致破坏向前兼容性,也可能因不符合脚
> 本开发者的预期导致程序逻辑错乱。

同意,設值失敗是一種很意外的結果。

>
> 所以只好在值被修改后将光标移动到最后,这通常不是最终用户期望的。FF的行
> 为是做了少许优化,减少这种对最终用户的干扰,是可取的,其他浏 览器可以
> 学习FF。

這樣啊。我那時候是覺得全部移到後面比較有一致性[1],然後一個禮拜前
Hixie(Ian Hickson)在 WHATWG 回信[2]說他在規範[3]裡面加上了一行

  if the element has a text entry cursor position, should move the text
entry cursor position to the end of the text field, unselecting any
selected text and resetting the selection direction to none.
(如果元素裡有光標,移至最後並取消所有文字的選取跟選取方向)

當然,規範再改成 FF 那個樣子也是可能,雖然會長一點。一般碰到這種情況就會
把 IE 的情形寫進規範,因為影響兼容性最小,有誰能試試看 IE 的情形?(手上
沒有)

另外,你怎麼看文字選取的部份?是不管怎麼樣都取消選取,但是在光標的位置上
用 FF 的優化較好?

[1] http://lists.w3.org/Archives/Public/public-webapps/2011JanMar/0694
[2]
http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2011-June/031971.html
[3]
http://www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#dom-input-value

> 当使用输入法时,我个人感觉取消输入法已经输入的内容不是很好,会严重干扰
> 最终用户。所以还是和不用输入法时一样, 仅仅移动光标到最后。

同意,我信裡也是這樣寫的,不過 Hixie 的回答是輸入法是 UI 的東西不在規範
範圍內所以不寫進 HTML5。這我不太服氣,因為我覺得這好像會影響瀏覽器觸發
DOM3 Events 的 compositionend[4] 事件的個數。但我還不清楚這個事件的實作
情形,手上也沒有 IE (有 CompositionEvent 的實作)可以試驗一下。

[4] http://www.w3.org/TR/DOM-Level-3-Events/#event-type-compositionend

> 最终这个问题,需要通过开发者来自行处理解决。当文本框获得焦点时,不直接
> 修改值,而是调用text range相关api及未来的输入法api来做合理的处置。

瀏覽器實作不一樣就會造成後來的人碰壁,還是減少這種情形好。不過我是覺得如
果我們要寫一份文件,比起寫排版的東西我會更傾向於寫這些輸入法、 non-BMP
之類的這些容易忽略的東西,當然對象就不是瀏覽器開發者而是網頁開發者了(尤
其是西方人不用輸入法)。並竟 non-BMP 字符 length 不是 1 這件事不是瀏覽器
的錯,反而是網頁開法者要注意的倒楣極端情形。


此致
Kenny, W3C
Twitter: http://twitter.com/kanghaolu
Plurk: http://www.plurk.com/kennyluck

Received on Wednesday, 15 June 2011 01:50:17 UTC