javascript - 像 twitter 一样将插入符号放在可编辑的 div 的末尾

标签 javascript jquery html

http://jsfiddle.net/m45uM/

用 a 标签替换效果很好,但它会将我设置到可编辑 div 内的第一个位置。

我该如何解决这个问题?我如何才能触发一个事件,我目前将我的插入符号放在一个标签内,就像 Twitter 那样?

function replacer(match, p1, p2, p3, offset, string) {
    var name = '';
    var user = '';
    $.each(ar.data, function (i, item) {
        var keyword = match.substring(1, (match.length - 1));
        if (keyword == item.name) {
            user = item.user;
            name = item.name;
        }
    });
    return '<a href="/' + user + '">' + name + '</a>';
}
$(document).ready(function (e) {
    $('body').on('keyup', '#cont', function (e) {
        var cont = $('#cont').html();
        var cont2 = cont.replace(/\@\w+\s/gi, replacer);
        $('#cont').html(cont2);
        console.log($('#cont').html());
    });
});
var ar = {
    "data": [{
        "user": "testuser1",
            "name": "testname1"
    }, {
        "user": "testuser2",
            "name": "testname2"
    }]
};
console.log(ar);

最佳答案

在我尝试这个之前有几件事:

  1. 请不要将元素作为字符串添加到 dom - “return ..”。您将很难使用此节点执行其他操作。相反,我建议您使用 DOM API(创建/删除/替换/附加/等)来执行这些功能。当您通读时,我的建议会很清楚。

  2. 您返回一个新字符串并盲目地将 HTML 设置为该特定字符串 - 您将丢失它之前的所有文本。示例:Hello my name is @testuser1 变成了 @- 你失去了“Hello my name is”

解决方法:

要照顾胡萝卜的放置,您必须记住用户的选择。注意 - 如果您更改 HTML,浏览器将丢失此选择;因此,您需要手动跟踪它。

在“替换”文本之前,您可以通过以下方式获得选择:

//IE & Others
if (window.getSelection) {
    userSelection = window.getSelection();
} else if (document.selection) {
    userSelection = document.selection.createRange();
}
selectedNode = userSelection.anchorNode;
selectedOffset = userSelection.anchorOffset;

替换文本后,您需要将选择设置回容器。

//IE & Others


var range,
        selection;
    if (window.getSelection) {
        selection = window.getSelection();
        range = document.createRange();
        range.setStart(targetElement, targetOffset);
        range.setEnd(targetElement, targetOffset);
        selection.removeAllRanges();
        selection.addRange(range);
    } else if (document.selection) {
        range = document.selection.createRange();
        range.moveToElementText(targetElement.parentElement);
        range.collapse(true);
        range.moveEnd('character', targetOffset);
        range.moveStart('character', targetOffset);
        range.select();
    }
}

目标元素和目标偏移量是您要定位的节点和您希望光标所在的位置(从左侧开始)。

既然基础知识已经完成,那么困难的部分来了:

  • 当您通过放入 anchor 元素来分解文本 (TextNode) 时,您需要将目标元素作为 anchor 元素,并将偏移量设为 anchor 元素内文本的长度。如果您使用 DOM API 并将此元素存储为变量,这会容易得多。

  • 您需要迎合用户可能转到文本的任何部分并输入@username1 的情况;这应该相当简单。

您也可以使用 Rangy JS 库来实现这一点。

玩得开心!

关于javascript - 像 twitter 一样将插入符号放在可编辑的 div 的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18274285/

相关文章:

javascript - 删除jquery中 'live'输入字段中的逗号

javascript - 通过单击按钮获取特定的HTML页面? (HTML/JavaScript)

javascript - 使用ajax过滤结果时加载部分html页面

json - Struts ajax 表单验证

javascript - 将颜色十六进制混合算法与标准 CMYK 彩色按钮相结合

javascript - Div 扩展到特定内容的大小

javascript - 调整窗口大小后,检测到的百分比宽度 div 的高度仍然相同? jQuery

javascript - 用于 html、php、css 等网络代码的语法荧光笔

html - Adsense 广告导致边栏在 flex 布局中离开屏幕

html - 我希望背景图片模糊