【问题标题】:Working with contenteditable使用 contenteditable
【发布时间】:2014-06-24 02:19:12
【问题描述】:

好的,所以我可以很好地编辑我的 DIV 的内容。但是,我正在尝试解决一些问题。

在我的可编辑 div 中,我有一个包含网站地址的 div(例如 twitter.com),我不希望它可以从可编辑的 DIV 中删除;它存在的原因是用户可以复制包括域在内的所有文本。

如果您删除除域之外的所有文本,则插入符号不会显示 - 或者它会一直显示在 DIV 右侧。

如果用户删除了域名,它会重新出现,但插入符号现在在它的左侧,我也不想要。

任何使插入符号始终可见并将其保持在域右侧的解决方案?

哦,由于某种原因,我不能在可编辑的 DIV 上使用 onKeyDown 来激活 anylyeText 函数(至少不是在 JSfiddle 中),所以我不得不执行 setTimeout 循环。

这是我的小提琴:jsfiddle


CSS:

.url {
    display: block;
    border: 1px solid rgb(140,140,140);
    padding: 5px;
    box-sizing: border-box;
    color: rgb(35,155,215);
    cursor: text;
    outline: none;
}
.url:focus {
    border-color: rgb(35,155,215);
}

.noedit {
    display: inline;
    color: rgb(140,140,140);
}

HTML:

<div class="url" contenteditable="true" id="textbox"><div class="noedit" contenteditable="false">http://twitter.com/</div>username</div>

JS:

var analyzeText = function() {
    var textbox = document.getElementById('textbox');
    var textVal = textbox.innerHTML;
    var urlString = '<div class="noedit" contenteditable="false">http://twitter.com/</div>';

    if (textVal.length < urlString.length) {
        textbox.innerHTML = urlString;
        textbox.focus();
    }
    setTimeout(function() { analyzeText(); }, 100);
};

(function(){analyzeText();})();

【问题讨论】:

  • 如何为要编辑的内容添加一个跨度并使该跨度可编辑?
    twitter.com/</div><span contenteditable="true" >用户名
  • 为什么是跨度?如果我制作可编辑的 div 内联块,也会出现同样的问题。
  • @SaravananS 哦,这不起作用,因为我不再能够同时复制域和用户名。
  • 是的。这将无法满足您的第一个用例。

标签: javascript css html contenteditable caret


【解决方案1】:

这是一个使用选择和范围的方法。

MDN Selection
MDN Range

(如果您查看 MDN,您会发现不支持 IE9 - 在 IE9 之前,您必须使用专有的 IE 脚本。Google 可以帮助您!)

我要做的第一件事是添加这两个变量:

var range = document.createRange();
var sel = window.getSelection();

然后,我像这样修改了你的脚本:

if (textVal.length < urlString.length) {
    textbox.innerHTML = urlString;

    // We create a text node and append to the textbox to select it
    textbox.appendChild(document.createTextNode(''));

    // Text node is selected
    range.setStart(textbox.childNodes[1], 0);

    // Collapse our range to single point (we're not selecting a word, after all!)
    range.collapse(true);

    // Let's clear any selections
    sel.removeAllRanges();

    // Alright, time to position our cursor caret!
    sel.addRange(range);

    textbox.focus();
}

就是这样!这是一个更新的 Fiddle 来演示:

编辑 - 更新以包含防止用户在域左侧插入文本的逻辑

http://jsfiddle.net/Qycw2/6/

【讨论】:

  • 嗯,这段代码似乎有点错误......有时当域重新出现时,它会将插入符号放在新行上。此外,如果用户只需单击域的左侧,他们就可以在那里键入(显然这比新行错误更简单)
  • @CharlesJohnThompsonIII 在 IE 评论中哈哈。我没有看到的新行错误-您使用什么浏览器进行测试? (我在 Mac 上 - 使用 Chrome 和 FireFox 进行了测试)
  • 如果您在重新出现后再次删除该域,则会创建一个新行
  • 这似乎只是一个 Safari 问题
  • 啊,我明白了。看起来如果您插入一个空文本节点,Safari 决定添加一些 br 标记以发出咯咯笑声(或者,检查器显示...)我更新为包含一个非空的 textNode,并且 Safari 采取更好。
猜你喜欢
相关资源
最近更新 更多
热门标签