【问题标题】:Capitalise the first letter of every word as user types unless user insists on lower case除非用户坚持小写,否则用户键入时每个单词的首字母大写
【发布时间】:2017-06-05 06:59:48
【问题描述】:

我正在编写脚本,我希望第一个字母和空格后的字母大写。如果一个单词跟在连字符 (-) 后面,那么它不应该大写,除非连字符 (-) 后面跟一个空格。如果用户想要将任何单词的首字母小写,它应该是动态工作的。

这是我使用以下脚本实现的。

这里的挑战是,用户应该可以在输入时将大写字母更改为小写

我无法实现该功能。

例子:

如果用户键入“hello world”,输出将是“Hello World”,如果用户想通过删除字母“W”并重新键入“World”中的字母“W”来小写字母“w”,预期结果应该是“Hello world”。

$.fn.capitalize = function() {
  $.each(this, function() {
    var split = this.value.split(' ');
    for (var i = 0, len = split.length; i < len; i++) {
      split[i] = split[i].charAt(0).toUpperCase() + split[i].slice(1);
    }
    this.value = split.join(' ');
  });
  return this;
};

$('textarea').on('keyup', function() {
  $(this).capitalize();
}).capitalize();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<textarea></textarea>

【问题讨论】:

  • 也许保留一个类型化值的数组,如果一个值从大写变为小写,标记它

标签: javascript jquery html frontend


【解决方案1】:

困难在于确定用户是否将大写字母“更正”回小写字母或出于其他意图进行更改。例如,如果用户继续更改原始单词的其他字符,是否应该将第一个字母再次转换为大写?这种情况以及许多其他情况可能会给用户带来意想不到的结果。

我会建议一个替代方案,您等待用户键入一个空格,然后将 该空格之前的单词的第一个字母大写 .然后,如果用户返回并再次将其变为小写,它将保持原样。用户必须键入空格(或换行符或制表符)才能再次触发前一个单词的自动大写。

这是如何工作的:

$.fn.capitalize = function() {
    $.each(this, function() {
        var pos = this.selectionStart,
            s = this.value,
            i = s.lastIndexOf(' ', pos-1)+1;
        // Don't do anything if text is selected
        if (this.selectionEnd !== pos) return;
        // Uppercase first character of word
        this.value = s.substr(0, i) + s.charAt(i).toUpperCase() + s.substr(i+1);
        // Restore caret position
        this.selectionStart = this.selectionEnd = pos;
    });
    return this;
};

$('textarea').on('keypress', function(e) {
    if (' \n\r\t'.indexOf(String.fromCharCode(e.which)) > -1) {
        $(this).capitalize();
    }
});
textarea { width: 100% }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea></textarea>

【讨论】:

  • 有什么方法可以作为用户类型来实现。请看一下
  • 有什么方法可以作为用户类型来实现,而不是在按下空格键时触发事件,用于具有相同类名和预定义值的多个输入。请查看下面的链接,我为一个输入实现了 jsfiddle.net/madhudvmask007/xj595z74/9 如果我使用具有预定义值的多个输入,我会遇到问题。请看下面的代码。 jsfiddle.net/madhudvmask007/xj595z74/6@trincot
  • 如果你想这样工作(我不建议这样做),那么将 prevEntry 存储为元素的数据属性而不是使用全局变量:var prevEntry = $(this).data('prevEntry') || '' 并在需要时更新它:$(this).data('prevEntry', finalValue).
  • 请检查这个。 jsfiddle.net/madhudvmask007/p4srb3mq这里的问题是如果我使用光标指针删除第一个字母。在我删除第一个字母后,光标指向字符串的末尾。如果开始,我希望将字符串放在开头。需要解决这个问题。谢谢!!
  • 我的意思是第一个单词的第一个字母。第二,第三个单词的第一个字母工作正常。
【解决方案2】:

请检查一下。

jsfiddle.net/madhudvmask007/p4srb3mq

这里的问题是,如果我使用光标指针删除第一个字母。在我删除第一个字母后,光标指向字符串的末尾。如果开始,我希望将指针放在开头。 需要解决这个问题。

谢谢!!

【讨论】:

  • 我的意思是第一个单词的第一个字母。第二,第三个单词的第一个字母工作正常。
【解决方案3】:

你去吧:)

function useName (str) {
  if(!str) return '';
  return str
  .split(' ')
  .map(function (word) {
    if(word && word[0])
      return (word[0].toUpperCase() + word.substring(1).toLowerCase());
     else
      return '';
   })
  .join(' ')
}

【讨论】:

  • 如何回答这个问题?也许把问题读到最后?
猜你喜欢
  • 2015-12-10
  • 2016-10-31
  • 2020-08-30
  • 2013-06-07
  • 2016-12-05
  • 2015-11-10
  • 1970-01-01
  • 2016-12-23
  • 2015-11-04
相关资源
最近更新 更多