2012-01-30 90 views
2

我正在使用javascript函数,我刚刚发现了一个liitle问题。我希望函数将“进入”替换为“”,因此我使用:coment = coment.replace(/\\n/gi,"*#*");,当coment确实有任何“输入”但当注释没有任何“输入”或注释是空白,它停止工作,并将它说的错误:JavaScript替换函数

“NoneType”对象有没有属性“取代”

如何控制,如果有任何“进入”,它取代了,如果没有,不做任何事情

的 “COMENT” 来源于此:

<textarea id="coment"></textarea>

谢谢!

+0

'coment'从哪里来?你可以在[jsfiddle](http://jsfiddle.net)中重现这个吗? – 2012-01-30 16:53:43

回答

3

问题取决于什么是在COMENT实际。如果COMENT中有一个DOM元素,那么你就需要从输入字段的值,所以它有一个字符串:

coment.value = coment.value.replace(/\n/g,"*#*"); 

如果该问题是COMENT有时是null或undefined,我会建议检查首先看是否COMENT中有一个有效的字符串:

if (coment) { 
    coment = coment.replace(/\n/g,"*#*"); 
} 

为空或未定义的情况下,你也可以只预处理coment这样的:

coment = coment || ""; 
coment = coment.replace(/\n/g,"*#*"); 

您可能请注意,我在替换函数中也改变了一些东西。如果您只是试图替换换行符,则不需要正则表达式定义中的双反斜杠,因为在模式中没有任何字母,所以没有理由在正则表达式中使用“我”标志。

要具体了解哪些适用,您需要向我们展示获取值的代码,以便我们可以看到它的实际内容,或者需要在调试器或console.log中检查coment看看它里面有什么。

2

这听起来像一个“空白”评论不是一个字符串,但像null而不是,因此它没有replace函数。

尝试

coment= (comment && coment.length>0)?coment.replace(/\\n/gi,"*#*"):coment; 
4

声明

coment = coment.replace(/\\n/gi,"*#*"); 

...说“替换为反斜线后面的字母n与#字符串的所有部分(不区分大小写)。如果你的目标是取代换行符,你有一个太多的反斜杠:

coment = coment.replace(/\n/gi,"*#*"); 

这本身就不会是问题,虽然从错误信息,这听起来好像有时coment不是ST环,因此没有replace功能。可能是undefinednull。如果你知道这将是undefinednull,或字符串,你可以这样做:

if (coment) { 
    coment = coment.replace(/\n/gi,"*#*"); 
} 

如果它可能是一些什么,也不管你总是希望一个字符串到底,则:

coment = (coment === undefined || coment === null) 
     ? "" 
     : String(coment).replace(/\n/gi,"*#*"); 

(不要只是做coment = coment ? ...因为如果coment是多少0,不会给你预期的结果。)


由于某些浏览器对于换行符使用 \r\n,而其他浏览器使用 \n,所以在正则表达式中,您最好使用 \r?\n(或 \r{0,1}\n)而不是 \n
+0

'\ r {0,1}'=='\ r?' – georg 2012-01-30 17:24:37

+0

@ thg435:是的,它的确如此。由于某种原因,我处于明确模式。 :-) – 2012-01-30 17:25:34