textarea 的 .val() 不考虑换行

Posted

技术标签:

【中文标题】textarea 的 .val() 不考虑换行【英文标题】:The .val() of a textarea doesn't take new lines into account 【发布时间】:2012-01-18 20:13:55 【问题描述】:

<textarea> 的 jQuery 中项目的 .val() 属性似乎不适用于新行。我需要这个功能,因为文本区域是为了识别回车键并将其显示为预览,并且新行是完整的。

但是,这个小提琴显示了发生的事情:http://jsfiddle.net/GbjTy/1/。显示文本,但不在新行中。

如何实现包含新行的预览,我知道这是可能的,因为它在 Stack Overflow Post Question 预览中做到了这一点。

谢谢。

P.S 我在 SO 上看到了与此相关的其他链接,但他们都说让最终用户使用一些代码,这对我来说不是一个理想的方法。在没有最终用户编写任何特定代码的情况下如何实现这一点,就像在 SO Question Preview 上一样,Enter 在预览中应该可以正常工作。

【问题讨论】:

【参考方案1】:

这是一个 CSS 问题,而不是 javascript 问题。默认情况下,html 会折叠空白 — 这包括忽略换行符。

white-space: pre-wrap 添加到输出 div。 http://jsfiddle.net/mattball/5wdzH/

所有现代浏览器都支持此功能:https://caniuse.com/#feat=css3-tabsize

【讨论】:

如果您不想使用 CSS,也可以将 <div> 更改为 <pre>【参考方案2】:

textarea 中的强制换行是\ns,除 textarea 之外的其他 HTML 标记将忽略这些。您必须使用 <br /> 在这些元素处强制换行。

我建议您使用 JavaScript 而不是 CSS 来解决这个问题,因为您已经依赖 JavaScript。

$( "#watched_textarea" ).keyup( function() 
   $( "#output_div" ).html( $( this ).val().replace(/\n/g, '<br />') );
); 

您可以在此处找到更新版本:http://jsfiddle.net/GbjTy/2/

【讨论】:

【参考方案3】:

试试这样的:

$( "#watched_textarea" ).keyup( function() 
   $( "#output_div" ).html( $( this ).val().replace('\n', '<br/>') );
); 

在 HTML 中,默认情况下会忽略空格。

您也可以将&lt;div&gt; 标签更改为&lt;pre&gt; 标签:

<pre id="output_div"></pre>

这样也行。

【讨论】:

【参考方案4】:

在这种情况下

您没有在另一个页面中显示 textarea 的 .val()(例如,将表单提交到 Servlet 并转发到另一个 JSP)。

在 Javascript/JQuery 中使用 textarea 的 .val() 作为 URL 编码的一部分(例如,mailto: 正文作为 textarea 内容)

然后,您需要对 textarea 描述进行 URLEncode,如下所示:

var mailText = $('#mailbody').val().replace(/(\r\n|\n|\r)/gm, '%0D%0A');

【讨论】:

谢谢,它帮助我解决了一个长期悬而未决的问题。【参考方案5】:
$( "#watched_textarea" ).keyup( function() 
   $( "#output_div" ).html( $( this ).val().replace(/[\r\n]/g, "<br />") );
);

您需要将换行符替换为&lt;br&gt; 标记以进行 HTML 输出。

这是一个演示:http://jsfiddle.net/GbjTy/3/

【讨论】:

【参考方案6】:

您的换行符输出完美,但 HTML 忽略了换行符:它需要 &lt;br&gt;

像这样使用一个简单的换行符函数:

function nl2br_js(myString) 
var regX = /\n/gi ;

s = new String(myString);
s = s.replace(regX, "<br /> \n");
return s;


$( "#watched_textarea" ).keyup( function() 
       $( "#output_div" ).html( nl2br_js($( this ).val()) );
    ); 

jsfiddle 在这里:http://jsfiddle.net/r5KPe/

来自这里的代码:http://bytes.com/topic/javascript/answers/150396-replace-all-newlines-br-tags

【讨论】:

【参考方案7】:

有一个简单的解决方案:用pre标签制作容器。

        <textarea id="watched_textarea" rows="10" cols="45">test </textarea>
        <pre class="default prettyprint prettyprinted"><code ><span class="pln" id="output_div">fdfdf</span></code></pre>
        <script>
        $("#watched_textarea").keyup(function() 
            $("#output_div").html($(this).val());
        );
        </script>

【讨论】:

【参考方案8】:

我找到了一个使用 jquery 的更方便的方法。

示例代码

HTML

    <textarea></textarea>
    <div></div>
    <button>Encode</button>

JS

$('button').click(function() 

    var encoded = $('<label>').text($('textarea').val()).html();//the label element can be replaced by any element like div, span or else

    $('div').html(encoded.replace(/\n/g,'<br/>'))
);

【讨论】:

【参考方案9】:
<?php 

//$rsquery[0] is array result from my database query
//$rsquery[0] = 1.1st Procedure \n2.2nd Procedure
//txtRisks is a textarea

//sample1
function nl2br2($string) 
$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
return $string;


//sample2
function nl2br2($string) 
$string = str_replace(array("\r\n", "\r", "\n"), "\\n", $string);
return $string;


echo "$('#txtRisks').val('".nl2br2($rsquery[0])."')";

?> 

PHP Manual link

【讨论】:

OP 从未提及 PHP【参考方案10】:

我曾尝试在 laravel Blade 模板中使用 jquery 设置 textarea 值,但由于变量中有新行,因此代码中断了。

我的代码 sn-p 是

$("#textarea_id").val(" $php_variable ");

我通过更改我的代码 sn-p 解决了我的问题,如下所示。

$("#textarea_id").val(" str_replace(array('\r', '\n', '\n\n'), '\n', $php_variable ");

如果你们中的任何人面临这个问题,可能会从中受益。

【讨论】:

以上是关于textarea 的 .val() 不考虑换行的主要内容,如果未能解决你的问题,请参考以下文章

js实现 textArea 的 placeholder 换行

替换textarea文本值中的换行符

如何在 textarea 上设置克拉位置时考虑 Windows 换行符 ( \r\n )?

textarea去掉回车换行

jQuery:在 Textarea 的内容中附加一个不间断的空格

由一个项目需求引发的 - textarea中的换行和空格