【问题标题】:handling long string in javascript在javascript中处理长字符串
【发布时间】:2016-11-24 05:19:30
【问题描述】:

我有一个页面,用户可以在其中编辑一些值(名称、描述等),除了添加长字符串作为描述外,这些值都可以正常工作。

当用户更改输入字段的值时,会调用一个 javascript 函数来检查是否有任何值与初始值不同(当网站首次加载 PHP 时,初始值存储为变量)。它看起来像这样:

<script>
    //checks if a field has changed value, if yes, change class
    function check(div, text){
        if(div.val()===text){
            div.parent().removeClass("has-warning");
            return 0;
        } else{
            div.parent().addClass("has-warning");
            return 1;
        }
    }
</script>
*here goes the html stuff*
<script>
    //whenever the form content changes
    $('#horse1').bind('input', function() {
        //the form div
        var horseDiv = $('#horse1');
        //count all the fields with changed value
        var error = check(horseDiv.find($('#name')), 'Rinaldo')
                   +check(horseDiv.find($('#race')),'-')
                   +check(horseDiv.find($('#date')),'1988-01-01')
                   +check(horseDiv.find($('#use')), 'Showpferd')
                   +check(horseDiv.find($('#shortDesc')), 'short Description')
                   +check(horseDiv.find($('#description')),'This can be a long text over multiple lines');

                   //if there is at least one field with a
                   //changed value, display an error message
        var errorDiv = horseDiv.find($('#notSaved'));
        if(error==0){
            errorDiv.hide();
        } else{
            errorDiv.show();
        }
    });
</script>

首先,如果有人知道如何使这种行为更优雅,我愿意接受建议。

但是我遇到的问题是,如果文本(描述)超过一行,这个脚本就会完全停止工作。我不知道为什么或如何解决这个问题,所以任何帮助将不胜感激。

***更新:比较 javascript 中的多行文本

如果有人遇到同样的问题,以下是对我有用的解决方案:

var textNew = text.replace(/%0D/g, '');
var divNew = encodeURIComponent(div.val()).replace(/!/g, '%21')
                                          .replace(/'/g, '%27')
                                          .replace(/\(/g, '%28')
                                          .replace(/\)/g, '%29')
                                          .replace(/\*/g, '%2A');

变量“text”是来自 php-Script 的 rawlurlencode() 字符串,而 div.val() 是从 textarea 读取的明文。使用上面的代码,textNew===divNew 会返回 true,即使它们包含逗号、变音符号、换行符和其他讨厌的东西

【问题讨论】:

  • 请提供将值存储在 JavaScript 变量中的 PHP 代码

标签: javascript html string


【解决方案1】:

尝试将描述字符串传递到json_encode 以正确转义它。

【讨论】:

  • 问题是关于 JavaScript 的。但问题出在 PHP 方面。 PHP在写文本,所以需要转义,这样javascript才能正确解析。
  • hm,后续问题:知道如何将 div.val() 与 json 字符串进行比较吗? (检查功能现在显然不再工作了)
  • 在check函数里面,如果你打印div和text变量,你会看到什么?
  • 花了我一段时间,相同输出的解决方案最终看起来像这样: var textNew = text.replace(/%0D/g, ''); var divNew = encodeURIComponent(div.val()).replace(/!/g, '%21') .replace(/'/g, '%27') .replace(/(/g, '%28') .replace(/)/g, '%29') .replace(/*/g, '%2A');
【解决方案2】:

当然它会停止工作。

在 PHP 端,如果字符串中有换行符,则需要正确连接字符串。

preg_replace( "/\r|\n/", "", $yourString );

【讨论】:

    【解决方案3】:

    Juliette,我认为最好使用事件change 而不是input,而您不需要立即检查文本是否已更改。浏览器将为您完成所有日常工作。
    如果还不知道,您还需要知道脚本停止的原因)您可以在浏览器的开发工具窗格中查看控制台选项卡。
    如果您确实需要在用户按下某个键后立即看到更改,那么我建议您使用 String 方法 localeCompare
    这是关于比较Optimum way to compare strings in Javascript?
    的答案 希望对你有所帮助!

    【讨论】:

    • 我尝试了更改,但没有成功问题是我需要对字符串进行 json 编码,以便可以将其作为参数传递
    【解决方案4】:

    我假设#description&lt;textarea&gt;,因为你提到它可能是多行的。

    您发布的脚本应该包含字符\n,而不是脚本中的实际换行符。您需要在 PHP 中进行替换以实现此目的,但不是 Lemmy 发布的替换,因为它只是删除了换行符。您也可以像前面讨论的那样只进行 JSON 编码。

    另外,请注意,在 Windows 上,浏览器会将换行符处理为 \r\n 而不仅仅是 \n。您还需要在 JS 中进行替换以在比较之前删除任何 \r 字符以处理此问题。

    另外,您可以使用.find("#selector") 代替.find($("#selector"))

    【讨论】:

    • 感谢 find 的提示 - dodopok 的 json 版本有效,但检查功能不再有效,因为我无法将 div.val() 与 json 文本进行比较现在编码。我在 javascript 中尝试了 JSON.stringify,但比较仍然不起作用
    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 2017-06-23
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多