F.Ko-Jiの「一秒後は未来」

preタグの内容をjQueryの.text()で取得するとIEでは改行が消える?

ドットインストールに「ソースコードをコピーしやすくする機能」をつけました。

» ドットインストールでソースコードのコピーがしやすくなりました #dotinstall | IDEA*IDEA

これに絡んで、 jQueryを使って pre タグに表示している内容をそのまま textarea に入れるということをしようとしたら、IEだけ挙動が違ったという話です。

サンプルは以下。「Copy by text」ボタンを押すと jQuery の .text() で pre タグの内容を取得、「Copy by html」ボタンを押すと .html() で取得して、その内容を textarea に .val() でセットするというものです。

<!DOCTYPE HTML>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>jQuery from pre to textarea</title>
    <script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
</head>
<body>
    <pre id="from">
        <span>1行目</span>
        2行目
        3行目
    </pre>
    <textarea id="to" cols="30" rows="5"></textarea>
    <br>
    <input type="button" id="copy_t" value="Copy by text">
    <input type="button" id="copy_h" value="Copy by html">
    <script>
        $('#copy_t').click(function() {
            var t = $('#from').text();
            $('#to').val(t);
        });
        $('#copy_h').click(function() {
            var h = $('#from').html();
            $('#to').val(h);
        });
    </script>
</body>
</html>

これを IE で実行すると、 .text() を使った場合に改行が消えます。 .html() を使う場合は改行は消えませんが、 pre タグ内にタグを実体参照で記述していると、textareaには「&lt;span&gt;」のような状態でセットされてしまいます。

ChromeやFirefoxなら .text() で改行もそのまま取得できるんですが、IEだけはうまくいきませんでした。

というわけで最終的には「pre タグを非表示にし、あらかじめ非表示にしておいた textarea を表示して .select() を実行することで全選択状態にする」という方法に変えたのですが、なんともモヤモヤっとするIEです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など