2017-03-23 5 views
3

私はtoLowerCase()を使用して、コンテンツ編集可能なdivを小文字に変換しています。しかしそれはまたテキストを逆転させている!誰かがなぜこれが起こっているのか教えてもらえますか?toLowerCase()がテキストを逆転させる理由 - なぜですか?

$(document).ready(function() { 
 
    $('#user').bind('keyup', function() { 
 
    $(this).text($(this).text().toLowerCase()); 
 
    }); 
 
});
#user { 
 
    background: #f1f1f1; 
 
    padding: 1em; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="user" contenteditable="true"></div>

フィドル:https://jsfiddle.net/professorsamoff/8zyvc202/3/

おかげで、 ティム

+2

ので、あなたがコンテンツを書き換えているキーを押すと、カーソルが0 – Shinigami

+1

可能な重複のを配置するsettedされるたび:http://stackoverflow.com/questions/14508707/updating-カーソル位置無しの入力値 – Ultimater

+0

ああ!そうですか。私はそんなことは考えていませんでした。ありがとうございました! –

答えて

-1

を用いて達成することができます。 toLowerCase()はテキストを反転していません(これは関数を削除していることを確認することができ、テキストがまだ反転していることがわかります)。本当に起こっているのは、新しいテキストを配置した後、カーソル位置が最初に移動するということです。

他の回答に記載されているように、これを解決する簡単な方法はcss経由で行うことです。しかし、javascriptだけで行う必要がある場合は、この解決策をチェックしてください。新しいテキストを配置した後、手動でカーソル位置を最後まで移動します。

placeCaretAtEnd関数の実装は、this answerからインスピレーションを受けています。

$(document).ready(function() { 
 
    $('#user').bind('keyup', function() { 
 
    $(this).text($(this).text().toLowerCase()); 
 
    placeCaretAtEnd(this); 
 
    }); 
 
}); 
 

 
function placeCaretAtEnd(el) { 
 
    el.focus(); 
 
    if (typeof window.getSelection != "undefined" 
 
      && typeof document.createRange != "undefined") { 
 
     var range = document.createRange(); 
 
     range.selectNodeContents(el); 
 
     range.collapse(false); 
 
     var sel = window.getSelection(); 
 
     sel.removeAllRanges(); 
 
     sel.addRange(range); 
 
    } else if (typeof document.body.createTextRange != "undefined") { 
 
     var textRange = document.body.createTextRange(); 
 
     textRange.moveToElementText(el); 
 
     textRange.collapse(false); 
 
     textRange.select(); 
 
    } 
 
}
#user { 
 
    background: #f1f1f1; 
 
    padding: 1em; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="user" contenteditable="true"></div>

+0

あなたがなぜこれについて投票したのか分かりません - それは実際は私の答えです。ありがとうございました! –

+2

このアプローチでは、左矢印を使用して入力内容を編集することはできません。途中でクリックして入力を開始すると、前の場所ではなく最後までキャレットが送信されます。 danaによって投稿されたCSSソリューションは、最もアクセスしやすいものです。しかし、実際にそのトランジション効果が必要な場合は、実際にキーコードをチェックし、キャレットの位置を追跡する必要があります。私があなたのケースを正しく理解していれば、それが情報のために小文字の情報を必要とするならば、テキストのコピーを入力に直接ではなく小文字()を適用してコールバックに送るだけです。 – Ultimater

+0

ああ、そうです...それは問題です。もちろん、テキスト選択のためにCmd/Ctrl + Aを処理することはできませんが、シンプルな条件付きで処理することは可能です。 そして、はい、「小文字で送信」オプションが好きです。この問題はちょっとひどいです。 –

8

それはブラウザのquirkinessと関係しています...テキストが設定されています、カーソルが編集可能領域の先頭に移動します。

ユーザーが入力中にCSSを使用して小文字に変換することは、あまり風変わりではないかもしれません。その後、JavaScriptをblurイベントで実際の変換を行います。

$(document).ready(function() { 
 
    $('#user').blur(function() { 
 
    console.log('Converting from '+$(this).text()+' to '+$(this).text().toLowerCase()); 
 
    $(this).text($(this).text().toLowerCase()); 
 
    }); 
 
});
#user { 
 
    background: #f1f1f1; 
 
    padding: 1em; 
 
    text-transform:lowercase; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="user" contenteditable="true"></div>

+0

私のテストでは、blur()関数は実際にはテキストを変換していませんが...私はblur()の仕事は理解していますが、動作していないようですこの場合…? –

+0

このブラウザにはどのブラウザが失敗していますか? Edge、Chrome、Firefoxで簡単にテストしました。 – dana

+0

すべてのブラウザ。このテストは、常にCSSが動作するように「現れる」ことに注意してください。 –

2

は、これは非常に興味深いものであるCSS

#user { 
 
    background: #f1f1f1; 
 
    padding: 1em; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="user" contenteditable="true" style="text-transform: lowercase"></div>

+0

テキスト自体は、スタイリングだけでなく、変換する必要があります。しかし、ありがとう。 –

-1
Please try the following: 

$(document).ready(function() { 
    $('#user').bind('keyup', function() { 
     $(this).val($(this).val().toLowerCase()); 
    }); 
}); 
+0

申し訳ありませんが、コンテンツ編集可能なdivではval()が機能しません。入力フィールドのみです。 –

関連する問題