【问题标题】:Why is toLowerCase() reversing text — why?为什么 toLowerCase() 反转文本 - 为什么?
【发布时间】:2017-08-15 11:46:06
【问题描述】:

我正在使用 toLowerCase() 将内容可编辑的 div 转换为小写。但它也在反转文本!有人可以告诉我为什么会这样吗?

$(document).ready(function() {
  $('#user').bind('keyup', function() {
    $(this).text($(this).text().toLowerCase());
  });
});
#user {
  background: #f1f1f1;
  padding: 1em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="user" contenteditable="true"></div>

小提琴: https://jsfiddle.net/professorsamoff/8zyvc202/3/

谢谢, 蒂姆

【问题讨论】:

  • 因为每次你按下一个键你都在重写内容并且你的光标被设置到位置 0
  • 啊!我知道了。我没有那样想。谢谢!
  • 发生这种情况是因为您使用 div 输入文本并且浏览器光标自动将其位置设置为第一个索引。
  • 对。现在找到一个真正有效的方法......

标签: javascript jquery lowercase


【解决方案1】:
Please try the following:

$(document).ready(function() {
    $('#user').bind('keyup', function() {
        $(this).val($(this).val().toLowerCase());
    });
});

【讨论】:

  • 抱歉,val() 不适用于内容可编辑的 div,只能用于输入字段。
【解决方案2】:

这是一个非常有趣的。 toLowerCase() 没有反转文本(您可以验证这是删除函数,您会看到文本仍在反转)。真正发生的是光标位置在放置新文本后移动到开头。

正如其他答案中提到的,解决此问题的一种简单方法是通过 css 来解决。但是,如果您只需要通过 javascript 执行此操作,请查看此解决方案。放置新文本后,我们手动将光标位置移动到末尾。

placeCaretAtEnd 函数的实现受到this answer 的启发。

$(document).ready(function() {
  $('#user').bind('keyup', function() {
    $(this).text($(this).text().toLowerCase());
    placeCaretAtEnd(this);
  });
});

function placeCaretAtEnd(el) {
    el.focus();
    if (typeof window.getSelection != "undefined"
            && typeof document.createRange != "undefined") {
        var range = document.createRange();
        range.selectNodeContents(el);
        range.collapse(false);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    } else if (typeof document.body.createTextRange != "undefined") {
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.collapse(false);
        textRange.select();
    }
}
#user {
  background: #f1f1f1;
  padding: 1em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="user" contenteditable="true"></div>

【讨论】:

  • 不知道为什么你被否决了——事实上,这就是我的答案。谢谢!
  • 这种方法不允许您使用左箭头来编辑您输入的内容,如果您单击中间并开始输入,您的插入符号将被发送到末尾,而不是之前的位置. dana 发布的 css 解决方案是最容易获得的。但如果你真的想要那种过渡效果,真的应该检查键码,并跟踪插入符号的位置。如果我正确理解您的情况,如果它是用于游戏,如果您需要小写的信息来使用该信息,只需将文本的副本发送到回调,并在其上应用小写()而不是直接在输入上。
  • 啊,对……这是个问题。当然,一个简单的条件可以解决这个问题,尽管它不能处理 Cmd/Ctrl+A 进行文本选择。而且,是的,我喜欢“以小写形式发送”选项——这个问题让我非常烦恼。
【解决方案3】:

可以用css实现

#user {
  background: #f1f1f1;
  padding: 1em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="user" contenteditable="true" style="text-transform: lowercase"></div>

【讨论】:

  • 文本本身必须被转换,而不仅仅是样式。不过,谢谢。
【解决方案4】:

这与浏览器的怪癖有关...设置文本时,光标会移动到可编辑区域的开头。

一个不那么古怪的解决方案可能是在用户键入时使用 CSS 转换为小写。然后,如果您想超越,请在 JavaScript 中对 blur 事件进行实际转换。

$(document).ready(function() {
  $('#user').blur(function() {
    console.log('Converting from '+$(this).text()+' to '+$(this).text().toLowerCase());
    $(this).text($(this).text().toLowerCase());
  });
});
#user {
  background: #f1f1f1;
  padding: 1em;
  text-transform:lowercase;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="user" contenteditable="true"></div>

【讨论】:

  • 在我的测试中,blur() 函数实际上并没有转换文本……我理解 blur() 的工作,但在这种情况下它似乎不起作用……?
  • 这在哪个浏览器中失败了?我对 Edge、Chrome 和 Firefox 进行了快速测试。
  • 所有浏览器。请记住,此测试将始终“显示”以使用适当的 CSS。
  • 啊,等等……我看到文本实际上是在 div 失去焦点时转换的。那么,如果 div 保持焦点,我该如何转换文本?
  • 我对这里的用例有点好奇。如果您必须在用户键入时进行实际对话,那么下面@OmarAlEisa 的答案可能是您最好的选择。就个人而言,我认为 CSS 解决方案在打字时感觉更干净(光标不闪烁)。但如果最终目标是小写文本,那么使用 blur() 最终会实现这一点。如果您将某些内容发布到服务器,您也可以在那里进行转换。
猜你喜欢
  • 2020-08-18
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 2019-04-02
  • 2019-08-18
  • 1970-01-01
相关资源
最近更新 更多