ネットサービスの開発に役立ちそうな話題を中心にお届けします。
F.Ko-Jiの「一秒後は未来」 > Javascript > jQuery
2012年05月10日 15:07

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です。

2012年04月15日 14:45

JavaScriptで動的に生成したform要素は明示的にDOMに追加しないとsubmitできない

2012年03月25日 16:20

jQueryの.clone()でdata属性までコピーするには?

2011年03月09日 01:59

jQueryで動的に作ったradioボタンがIE6とIE7で動作しない場合の対処

2011年02月14日 13:17

JavaScriptでtextareaにフォーカスした際にカーソルが先頭に来てしまう場合の対処

2010年05月30日 14:39

jQueryとTopsy APIを使ってそのページを言及したツイートを表示するスクリプトを作った

2009年01月14日 21:36

GoogleがホスティングしてるjQueryなどのJavaScriptライブラリを使う方法

2008年10月03日 08:24

jQueryでホットペッパーのAPIをリクエストしてGoogle ストリートビューを表示するまで

2008年09月30日 22:50

jQueryのみでLightboxっぽいものを実現する方法