キーイベントに関連付けられた文字の変更をシミュレートした「編集可能」のidを持つcontenteditable divがあります。ここで実際の動作を確認できます: http://jsfiddle.net/Ukkmu/66/
ご覧のとおり、ユーザーがどの英数字キーを押しても、"Singinme." という文字列が出力されます。divに入力します。var リスト内の単語間のスペースは無視されます。出力にスペースを含めて、「Sing in me」と読みたいと思います。現在、私のjavascriptコードの最初の行に書かれているためです。問題が insertTextAtCursor 関数にあることを少なくとも特定するための助けを得ましたが、その関数を変更して、許容される出力文字としてスペースを含めるにはどうすればよいですか? または、「Sing in me」と入力するように var リストを書き直すことはできますか。divで?
便宜上、以下にも JavaScript を貼り付けました。
PS: これはブラウザの問題であることがわかりました。Chromeでは、私が説明したとおりです。IE では、"Sing in me" のように動作します。スペース付き。これをChromeで機能させる方法はありますか? firefoxで動くかどうかはわかりません。
var list = "Sing in me.".split('');
function transformTypedCharacter(charStr) {
return (/[a-zA-Z]/).test(charStr) ? list.shift()||" " : charStr;
}
function insertTextAtCursor(text) {
var sel, range, textNode;
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0).cloneRange();
range.deleteContents();
textNode = document.createTextNode(text);
range.insertNode(textNode);
// Move caret to the end of the newly inserted text node
range.setStart(textNode, textNode.length);
range.setEnd(textNode, textNode.length);
sel.removeAllRanges();
sel.addRange(range);
}
} else if (document.selection && document.selection.createRange) {
range = document.selection.createRange();
range.pasteHTML(text);
}
}
$("#editable").keypress(function(evt) {
if (evt.which) {
var charStr = String.fromCharCode(evt.which);
var transformedChar = transformTypedCharacter(charStr);
if (transformedChar != charStr) {
insertTextAtCursor(transformedChar);
return false;
}
}
});
</p>