【问题标题】:select all text in contenteditable div when it focus/click [duplicate]聚焦/单击时选择contenteditable div中的所有文本[重复]
【发布时间】:2011-04-17 21:04:13
【问题描述】:

我有如下内容可编辑的 div。

<div style=" border:solid 1px #D31444" contenteditable="true">12 some text...</div>

我需要的是,当我点击 div 时,所有文本都会自动被选中。请问可以给我解决办法吗?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

试试这个:

<div style="border:solid 1px #D31444"
     contenteditable="true"
     onclick="document.execCommand('selectAll',false,null)">12 some text...</div>

更新:请注意,document.execCommand 现在是 deprecated,尽管它是 still works

【讨论】:

  • 最好使用focus 事件来完成,因为每当用户尝试单击以定位插入符号时,使用单击事件将突出显示所有内容。
  • 嗯,可能,但这取决于问题的作者想要什么。
  • 我刚刚在 Chrome 版本 24.0.1312.57 OS X 中尝试过。使用 jQuery 1.9.1,绑定到 focus 不起作用。绑定到click 事件确实选择了文本:$('.editable').on('click', function () { document.execCommand('selectAll', false, null); });
  • jsfiddle.net/rudiedirkx/MgASG/1/show 可能有帮助吗?
  • 当用户使用 'Tab' 键导航到 contenteditable div 时,这不起作用。
【解决方案2】:

div 上的 focus 事件的问题在于它无法触发,因为它认为 div 不应该是可编辑的。 DOM 中的可编辑内容在后台用tabindex 标记,因此为了让您的div 接收onfocus 事件,您需要显式声明divtabindex 属性。 HTML:

<div style=" border:solid 1px #D31444" contenteditable="true" tabindex="1" onfocus="document.execCommand('selectAll',false,null)" >12 some text...</div>

这应该适用于onfocus

【讨论】:

  • 这样做会导致它选择整个文档。您可以使用相同的代码,但我建议将setTimeout 用于150 毫秒,这样它就不会选择整个文档。希望对大家有帮助!
  • 使用&lt;style&gt;&lt;script&gt; 部分(或@ 987654336@ & .js pages),就像 jsGods 的意图一样,这不会成为问题;你也不应该需要tabindex。您可以使用类似#myDiv{border:solid 1px #d14;} 或其他样式的普通ol'&lt;div id='myDiv'&gt;&amp;nbsp;&lt;/div&gt; 和js myDiv.addEventListener('click', function(e){this.contentEditable = true; this.focus(); document.execCommand('selectAll', false, null);});。 (无论如何都适用于FF)
【解决方案3】:

这样就可以了。计时器适用于 Chrome 和 Safari,因为在这些浏览器中,选择整个元素的本机浏览器行为似乎在焦点事件之后触发,从而覆盖选择代码的效果,除非推迟到焦点事件之后:

var div = document.getElementById("editable");

div.onfocus = function() {
    window.setTimeout(function() {
        var sel, range;
        if (window.getSelection && document.createRange) {
            range = document.createRange();
            range.selectNodeContents(div);
            sel = window.getSelection();
            sel.removeAllRanges();
            sel.addRange(range);
        } else if (document.body.createTextRange) {
            range = document.body.createTextRange();
            range.moveToElementText(div);
            range.select();
        }
    }, 1);
};

【讨论】:

  • 难道不应该有一种方法可以使用 preventDefault 或 stopPropagation 吗?使用 setTimeout 看起来有点丑,因为你必须打破调用堆栈。
  • @Adam:我不这么认为。您不想阻止可编辑元素接收焦点,因此 preventDefault() 已退出。 stopPropagation() 只是阻止事件传播到下一个目标,这对此没有用。
  • 提姆,你为什么不是版主?
  • @think123:三个原因:我没有提出自己,我不是很想,我也不知道我是否会做好。
  • @Jonz: window.getSelection()document.createRange(),现在都是标准化的,大多数浏览器都支持,但 IE document.body.createTextRange().
猜你喜欢
  • 2012-10-06
  • 2014-12-27
  • 2012-08-27
  • 1970-01-01
  • 2012-09-28
  • 2010-11-13
  • 2021-04-16
  • 2013-11-16
  • 2012-08-25
相关资源
最近更新 更多