2015-10-26 176 views
0

我试图比较两个相同的字符串:textarea值(或textContentinnerHTML)和一个字符串作为属性存储在骨干模型,例如, "A string↵with line break"。 而这个比较总是返回false
比较这些字符串的长度可以发现差异(存储的字符串长一个符号)。 问题是如何准备第一个字符串(从textarea中提取)以使其完全等于第二个字符串(存储在模型中)。JS比较字符串与换行符

P.S.他们都是typeof === 'string'

P.P.S. 主要问题是如何使Backbone在设置属性时看到相等性:

this.model.set({ attr: textareaValue })

骨干网使用下划线的方法,只是在这种情况下,两个字符串比较:

return '' + a === '' + b;

我对两个字符串应用encodeURIComponent:结果是Some%0Atext VS Some%0D%0Atext。所以第二个有\r个字符(它是由Handlebars渲染的)。我应该在每个\n之前插入这个字符吗?

P.P.P.S.是的,这是诀窍:textarea.value.replace(/\n/gm, '\r\n');

+0

上'替换/ \ r \ n/g'所以你不要用'结束\ r \ r \ N'如果字符串确实有'\ r' –

回答

1

的问题是在\r字符:通过把手渲染textarea的值为Some\ntext而存储在模型的字符串是Some\r\ntext)。 而这并获得成功:textarea.value.replace(/\n/gm, '\r\n');

+0

而不是更换自己的行结束,我发现它是有用的使用https://github.com/ryanve/eol –

3

我的第一个想法是从两个字符串中删除所有非字母字符,并在之后进行比较。

str.replace(/[^a-zA-Z]/g, ""); 
+0

?是的,它的工作原理!但问题是如何让Backbone在设置属性时看到这种相等性:'''this.model.set({attr:textareaValue})'''。它使用了Underscore的方法,它在这种情况下简单地比较两个字符串:'''return''+ a ===''+ b;''' –

+0

哪个字符串有换行符? –

+0

我在两个字符串上应用了encodeURIComponent:结果是'''某些%0Atext vs某些%0D%0Atext'''。所以你看到第二个字符是/ r(它是由Handlebars渲染的)。 –