1

我试图将每个单词的第一个字母转换为大写,例如:“hello world”应该是“hello world”。

这是我目前的代码。

函数测试(){var doc=document.getElementById(“testInput”).value;var str=doc.replace(/\w\S*/g,doc.charAt(0).toUpperCase()+doc.substring(1).toLowerCase(;document.getElementById(“tst”).innerHTML=str;}

假设我的输入是“hello world”,预期结果是“hello world”但我得到的是“你好世界你好世界”。

所以我的问题是,它只指定了第一个单词,跳过了第二个单词,但它打印了两次句子。

6个答案6

重置为默认值
2

实际上,您是在用连接复制这些值。

通过执行以下操作,您将只传入与正则表达式模式匹配的子字符串,然后被替换:

函数测试(){var doc=document.getElementById(“testInput”).value;var str=doc.replace(/\w\S*/g,函数(txt){return txt.charAt(0).toUpperCase()+txt.substr(1).toLowerCase(;});document.getElementById(“tst”).innerHTML=str;}
4
  • 这就像我想要的一样!但你能解释一下为什么会这样吗?为什么“函数(txt)”知道它应该以doc作为参数?
    – 马利克
    评论 2017年2月25日22:33
  • .abc格式成为.抗体+美国广播公司成为+抗体这有效吗? 评论 2017年2月25日22:37
  • 所以这里发生的大部分情况是,您一次只传递一个子字符串。首先,您自己传递“hello”,它被分配给txt变量。然后返回为“Hello”。然后,您将通过“world”本身传递给txt变量。然后返回为“世界”。这提供了“Hello World”的最终结果。 评论 2017年2月25日22:39
  • @易卜拉欣梅里尔是的,这是有效的或者不会将“+”传递给函数。该函数只接受正则表达式匹配。 评论 2017年2月25日22:42
1

尝试使用:

str.split(“”).map(e=>e[0].toUpperCase()+e.slice(1)).join(“”
5
  • 您的代码将大写每一个不仅仅是第一封信。 评论 2017年2月25日22:17
  • 我刚刚发布了我的答案,并意识到了这一点。在发布答案后几秒钟内使用编辑功能是很正常的。 评论 2017年2月25日22:18
  • 这就是SO创始人实现代码片段的原因。修复它,我将删除我的反对票。 评论 2017年2月25日22:18
  • @Kinduser我已经添加了修复程序。 评论 2017年2月25日22:34
  • 现在它是完美的。 评论 2017年2月25日22:37
0
String.prototype.toUpperCaseWords=函数(){返回this.replace(/\w+/g,函数(a){将a.charAt(0).toUpperCase()+a.slice(1).toLowerCase(})}

用法:

var stringVariable=“首次放入var”;stringVariable.toUpperCaseWords();//输出:首次输入变量

资料来源:https://blog.smalldo.gs/2014/06/easily-add-phps-ucwords-ucfirst到javascript/

2
  • 不要污染字符串.原型。只需使用一个简单的命名函数。 评论 2017年2月25日22:18
  • 1
    你说污染String.protype是什么意思?对于一个不知道该做什么的人来说,为什么这比“简单命名函数”更糟糕?
    – 马利克
    评论 2017年2月25日22:29
0

使用代替,charAt(0).toUpperCase()第一个字母和substr(1).toLowerCase()剩下的部分。在上执行此操作输入改变事件。如果你想照你的方式做,就不要用内部HTML,使用text内容而不是。

SNIPPET公司

var inp1=文档.getElementById('input1');inp1.addEventListener(“输入”,函数(e){var inp2=文档.getElementById('input2');var文本=this.value;var res=titleCase(文本);inp2.value=res;},错误);函数titleCase(str){return str.replace(/\w\S*/g,函数(txt){return txt.charAt(0).toUpperCase()+txt.substr(1).toLowerCase(;});}
<input id='input1'><input id='input2'>

4
  • 为什么选择textContent而不是innerHTML?
    – 马利克
    评论 2017年2月25日22:40
  • 抱歉没有解释,只是速度更快。 评论 2017年2月25日22:48
  • 我同意,textContent是更好的选择。不仅因为它提供了一些更好的性能,而且还提供了一些针对跨站点脚本的保护。 评论 2017年2月25日22:49
  • 事实上,我尽量避免使用它,现在它就像是一种反射。如果我想写出动态元素,我将使用创建元素()。如果我不担心XSS,那么我将使用插入相邻HTML()照原样内部HTML服用类固醇。 评论 2017年2月25日23:01
0

您可以使用:

函数大写(str){var arr=str.split(“”);对于(var i=0;i<arr.length;i++){arr[i]=arr[i].charAt(0).toUpperCase()+arr[i.切片(1);}var结果=arr.join(“”);console.log(结果);}大写(“hello world”);

你知道只有通过CSS才能做到这一点吗?

div:悬停{文本转换:大写;}
<div>悬停在我身上!</div>

0
函数capitalizeFirstLetterOfEachWord(str){str=str.split(“”)for(var i=0;i<str.length;i++){str[i]=str[i][0].toUpperCase()+str[i:substr(1)}返回str.join(“”)}console.log(capitalizeFirstLetterOfEachWord(“你好,你好”)

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.