【问题标题】:Preserving new lines and spaces in text area not working在文本区域中保留新行和空格不起作用
【发布时间】:2017-02-07 15:36:13
【问题描述】:

我正在使用文本区域输入文本并在提交表单时,视图中显示的文本未保留任何换行符和空格。

文本区域:

<textarea type="text" id="topicDetails"></textarea>

尝试使用以下替换文本:

postTopic(){
    var content = document.getElementById('topicDetails').value;
//            textcontent = content.replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ "" +'$2'); 
//            textcontent = content.replace("\r\n", "\\r\\n"); 
//            textcontent = content.replace(/\r?\n/g, '<br />');
//            textcontent = content.replace(/\r?\n/g, '&#13');
//            var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';
//            textcontent = (content + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
    textcontent = content.replace(/\n/g,"<br>")

    var topic = {
        "topicId" : new Date().getTime(),
        "title": document.getElementById('title').value,
        "details": textcontent,
        "username": DataMixin.data.username,
        "userImage": "assets/img/Logos Divine Light/6.png",
        "dayPosted": new Date().toLocaleString()
    }

    console.log('posting blog..... ', topic);
    self.data.blogTopicsArr.push(topic);

    $.ajax({
        url: "/new_topic",
        type: "POST",
        data: JSON.stringify(self.data.blogTopicsArr),
        contentType: "application/json",
        success: function (res) {
            console.log('res is ', res);
            if (res == 'Authentication failed'){
                self.data.blogTopicsArr.splice( - 1, 1);
                self.update(self.data.blogTopicsArr);
                riot.route("signup_popup");
            } else if (res == 'saved'){
                console.log('blog posted successfully: ', self.data.blogTopicsArr);
                document.getElementById('title').value = '';
                document.getElementById('topicDetails').value = '';
                self.update();
            } else if (typeof res.redirect == 'string'){
                console.log('res.redirect ', res.redirect);
                riot.route(res.redirect)
            }
        },
        error: function (err) {
        console.log('err>>>>', err);
        }
    });
    $('#myModal').modal('hide');
}

尝试了三种不同的方法,但没有成功。

第三种方法给出带有&lt;br /&gt; 标签的输出。如何保留新行?

输出是:

Lorem Ipsum is simply dummy text.<br /> Industry's standard text ever since the 1500s, <br /><br />Why do we use it?<br />It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. <br /><br />

更新:

表单发布成功后,我正在使用 riot 的 self.update();this.update() 更新视图

更新2

实际上,我正在将表单数据发送到数据库并从数据库中取回文本以呈现它。但是发送到数据库的文本在保存到数据库之前插入了&lt;br&gt;标签,所以为什么它显示文本为Lorem Ipsum is simply dummy text.&lt;br /&gt; Industry's standard text ever since the 1500s, &lt;br /&gt;??

【问题讨论】:

  • 请告诉我们您想要达到什么目标?
  • @ZakariaAcharki 如标题中所述,我想在文本中保留新行和空格。我正在使用 textarea 输入文本并在提交时,不会保留空格或新行
  • @ÁlvaroGonzález 我只是将表单发布到服务器。我正在使用 riotjs。我猜这是不是 riotjs 的问题?
  • 愚蠢的问题,但你尝试过吗:postTopic(){ var content = document.getElementById('topicDetails').value; var topic = {“详细信息”:内容,}}
  • @ÁlvaroGonzález 好的,我现在用更多代码更新问题,以便您了解。我只是在表单发布后更新视图

标签: javascript jquery html textarea riot.js


【解决方案1】:

实际上我只需要添加pre-wrap,如下所示。

<p style="white-space: pre-wrap;">{data.post_details.details}</p>

这也保留了新行的间距。

【讨论】:

    【解决方案2】:

    您可以使用.replace(/\n/g,"&lt;br&gt;") 将换行符替换为&lt;br&gt;

    function postTopic() {
      var content = document.getElementById('topicDetails').value;
    
      var textcontent = content.replace(/\n/g,"<br>");
    
      var topic = {
        "details": textcontent,
      }
    }
    

    【讨论】:

    • 输出还是这样:asdasd&lt;br&gt;asd&lt;br&gt;asd&lt;br&gt;&lt;br&gt;&lt;br&gt;asd
    【解决方案3】:

    你想用

    &amp;#10; 作为 \r 和

    &amp;#13; 为 \n

    将这些值插入您的替换函数,它应该可以工作。

    More info:

    【讨论】:

    • 点赞content.replace(/\r?\n/g, '&amp;#13;');
    • 然后打印 在输出中
    • 更新了问题。实际上,我正在从 DB 中获取文本,但是当我在视图(html 页面)上显示它时,它会在文本中呈现 &lt;br&gt; 标签。我刚刚检查了数据库,它包含 asdasd&lt;br&gt;asd&lt;br&gt;asd&lt;br&gt;&lt;br&gt;&lt;br&gt;asd 之类的文本
    【解决方案4】:

    当您在服务器端处理表单时,您可以简单地处理这个问题。例如,如果您的表单操作设置为“companyForm.php”,那么在您的 companyForm.php 中,您可以使用类似 nl2br 的函数,例如:

    $companyName = nl2br($_POST['companyName']);
    

    http://php.net/manual/en/function.nl2br.php

    如果出于某种原因您绝对必须在客户端执行此操作,您可以通过添加以下代码来使用nl2br on php.js

    function nl2br (str, is_xhtml) {
    
        if (typeof str === 'undefined' || str === null) {
            return ''
        }
    
        var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';
        return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
    }
    

    然后使用:

    nl2br(textcontent, false)
    

    【讨论】:

    • 但我没有将文本直接发送到服务器。我正在调用一个名为 postTopic() 的函数,它调用 ajax 将文本发送到服务器。
    • 我的编辑是为了以防他需要使用 JS。我最初的回答只是建议这种类型的事情通常在服务器端处理。我仍然认为他的工作流程有误。即使 postTopic 函数通过 AJAX 调用将文本字段数据发送到服务器,您也可以在服务器端转换空白。
    • 但他明确表示
      标签不起作用?
    • Uncaught ReferenceError: is_xhtml is not defined
    • 有些浏览器不能很好地处理空引用。请查看我最近的编辑。
    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2021-10-15
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多