在光标位置拆分div内容

Asp*_*ian 7 html javascript jquery

我需要在用户点击它之后拆分元素,并且attr'contenteditable'变为'true'.这个小提琴适用于第一段,但不适用于第二段,因为后者属于ap标签.类似的在这个小提琴中,你会看到当元素中有html标签时,计数器会失去准确性,因此光标前后的文本不是你所期望的.

这里假设用户将以帮助标签保持不变的方式拆分数据.正如dandavis在这里指出的那样,例如div有<i>Hello</i> <b>Wo*rld</b>,用户只需要将div分成两个div,第一个将有<i>Hello</i>,第二个div将<b>Wo*rld</b>在其中.

HTML:

<div><mark>{DATE}</mark><i>via email: </i><mark><i>{EMAIL- BROKER OR TENANT}</i></mark></div>
Run Code Online (Sandbox Code Playgroud)

JS:

var $splitbut = $('<p class="split-but">Split</p>');
$(this).attr('contenteditable', 'true').addClass('editing').append($splitbut);

var userSelection;
if (window.getSelection) {
    userSelection = window.getSelection();
}
var start = userSelection.anchorOffset;
var end = userSelection.focusOffset;

var before = $(this).html().substr(0, start);
var after = $(this).html().substr(start, $(this).html().length);
Run Code Online (Sandbox Code Playgroud)

"拆分"按钮不起作用,因为一旦我得到正确的"之后"和"之前"文本,生成html不是问题.关于我在这里做错了什么想法?

Gab*_*oli 4

像这样的东西可能适用于您描述的具体情况

$('div, textarea').on('click', function(e) {
 var userSelection;
    if (window.getSelection) {
        userSelection = window.getSelection();
    }
    var start = userSelection.anchorOffset,
        end = userSelection.focusOffset,
        node = userSelection.anchorNode,
        allText = $(this).text(),
        nodeText = $(node).text();

// before and after inside node
  var nodeBefore = nodeText.substr(0, start);
  var nodeAfter = nodeText.substr(start, nodeText.length);

// before and after for whole of text
    var allExceptNode = allText.split(nodeText),
        before = allExceptNode[0] + nodeBefore,
        after = nodeAfter + allExceptNode[1];

  console.log('Before: ', before);
  console.log('------');
  console.log('After: ', after);

});
Run Code Online (Sandbox Code Playgroud)

更新了演示https://jsfiddle.net/gaby/vaLz55fv/10/


如果标签的内容在整个文本中重复,则可能会出现问题。(由于分裂造成的问题)