【问题标题】:How to handle a carriage return when using jQuery append with textarea text使用带有textarea文本的jQuery追加时如何处理回车
【发布时间】:2023-03-10 13:12:01
【问题描述】:

我的文本来自用户可能有合法回车的文本区域。

如果文本有一个我想保留的回车,我该如何使用这个确切的 jQuery 追加示例来做到这一点。

我正在生成此 html 代码,如果变量 $text 中有回车符,它将中断。

例子:

$(".inner").append( "<textarea><?php echo $text; ?></textarea>" );

如果:

$text = "Cat

Dog";

然后我得到这个,它会导致错误。

$( ".inner" ).append( "<textarea>Cat

Dog</textarea>" );

当 append 创建这个 textarea html 时,我可以做些什么来保留回车?

【问题讨论】:

  • @CodeGodie AFAIK htmlentities 不编码换行符,这是 HTML 中的合法字符
  • 您可以将回车编码为
    ,尽管这可能会破坏格式。
  • @MichaelMcPherson 您不能在 textarea 中使用像 &lt;br&gt; 这样的 html 标签,您需要一个 \n 来在那里换行。
  • 你不能吗,@jeroen?嗯。显然不是我的力量。虽然这有一个有趣的可能解决方案:stackoverflow.com/questions/8627902/new-line-in-text-area

标签: javascript php jquery html append


【解决方案1】:

您需要确保将 php 值正确传递给 javascript。最好的方法是将其编码为 json。然后您可以使用例如.val() 来设置元素的值:

var myText = <?php echo json_encode($text); ?>;
$( ".inner" ).append( $('<textarea>').val(myText) );

【讨论】:

  • 有趣的是,这被否决了,它确实有效并且正确的解决方案恕我直言......
【解决方案2】:

php.net 文档中的这个示例现在对我有用。 来自Replace carriage return in an email

// Order of replacement
$order   = array("\r\n", "\n", "\r");
$replace = '<br />';

// Processes \r\n's first so they aren't converted twice.
$newstr = str_replace($order, $replace, $text);

“br”标签在 textarea 内工作,虽然我认为它不会。

【讨论】:

  • 是的。至少在 Chrome 和 Safari 中。
【解决方案3】:

你需要做的就是:

PHP:

$cleaned = str_replace("\r\n", "\\n", $text);

JS:

$(".inner").append("<textarea><?= $cleaned ?></textarea>");

【讨论】:

  • PHP_EOL 是服务器平台使用的换行符。你不能只假设文本的来源是同一个平台。
【解决方案4】:

使用addcslashes函数,它允许将回车编码为\n(与javascript兼容)。

$(".inner").append( "<textarea><?php echo addcslashes($text,"\r\n"); ?></textarea>" );

Function reference

更新

我拒绝回答@jeroen 的回答。如果您的旧 PHP 版本不支持 json_encode,您可以使用 Chengings' function

function escape_javascript_string($str){
    // if php supports json_encode, use it (support utf-8)
    if (function_exists('json_encode')) {
        return json_encode($str);
    }
    // php 5.1 or lower not support json_encode, so use str_replace and addcslashes
    // remove carriage return
    $str = str_replace("\r", '', (string) $str);
    // escape all characters with ASCII code between 0 and 31
    $str = addcslashes($str, "\0..\37'\\");
    // escape double quotes
    $str = str_replace('"', '\"', $str);
    // replace \n with double quotes
    $str = str_replace("\n", '\n', $str); 
    return $str;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 2018-04-14
    • 1970-01-01
    • 2011-09-29
    • 2010-10-30
    • 2013-03-26
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多