Javascript 删除@和carret之间的单词

Javascript 删除@和carret之间的单词,javascript,jquery,contenteditable,Javascript,Jquery,Contenteditable,在搜索了几乎所有关于如何删除contenteditable div中@和carret position等字符之间的文本的相关问题后,我几乎得出结论,这个问题已不可能被社区接受。 请参阅下面的问题,其中没有一个实际解决了删除任务。 , 我也被卡住了。我们要找的是 创建内容可编辑div和按钮value=“playing” 在contenteditable div中键入任何内容,并以任何字符开头,例如@ 例如,假设|符号代表“我是@sch | ool和朋友”一句中的carret 因为carret在单

在搜索了几乎所有关于如何删除contenteditable div中@和carret position等字符之间的文本的相关问题后,我几乎得出结论,这个问题已不可能被社区接受。 请参阅下面的问题,其中没有一个实际解决了删除任务。 ,


我也被卡住了。我们要找的是

  • 创建内容可编辑div和按钮value=“playing”
  • 在contenteditable div中键入任何内容,并以任何字符开头,例如@
  • 例如,假设|符号代表“我是@sch | ool和朋友”一句中的carret
  • 因为carret在单词school上,所以将单词@school替换为playing。记住@symbol将不再存在
  • 如果可能,在单词播放后设置卡雷特
  • 最终的预期结果是“我在和朋友玩”


  • 我们中的一些人不熟悉范围和选择,特此请求帮助。同时,让我试着创作一把小提琴。谢谢

    函数将_替换为_播放(){
    var-sel='';
    if(window.getSelection){//webkits+firefox
    var sel=document.getSelection();
    选择修改(“扩展”、“背景词”、“单词”);
    范围=选择范围(0);
    range.deleteContents();
    var el=document.createElement('span');
    el.innerHTML='Playing';
    $(el).attr('contenteditable','false');
    var frag=document.createDocumentFragment(),节点;
    while(node=el.firstChild){
    frag.appendChild(节点);
    }
    range.insertNode(frag);
    range.collapse();
    //此代码添加了playing一词,但没有删除@school一词
    }
    else if(document.selection){//IE
    //我不知道IE的代码
    }
    }
    $(文档)。在('单击','.bt',函数()上{
    var el=document.getElementById('editable_div');
    将_替换为_playing();
    });
    
    .parent\u容器{
    位置:相对位置;
    }
    .编辑部{
    宽度:200px;
    填充物:5px10px;
    最小高度:50px;
    边框:1px#dcdc实心;
    }
    .bt{
    宽度:70px;
    边框:1px#000实心;
    位置:绝对位置;
    左:100px;
    底部:-30px;
    背景#ffff00;
    填充:2px8px;
    }
    .说明{
    边缘顶部:10px;
    }
    
    玩
    键入am“@school”,使carret在放学后播放,然后单击播放
    
    您好,我可能误解了您的问题,或者您在处理问题的方式上有一些限制。 但是一个简单的方法是使用string.replace()方法

    $(文档).ready(函数(){
    $(“.bt”)。单击(函数(){
    让str=$(“#可编辑的_div p”).html();
    str=替换学校(str,“玩”);
    $(“#可编辑分区p”).html(str);
    });
    功能(内容、单词){
    return content.replace(“@school”,word);//您可以使用regExp捕获以@
    };
    })
    .parent\u容器{
    位置:相对位置;
    }
    .编辑部{
    宽度:200px;
    填充物:5px10px;
    最小高度:50px;
    边框:1px#dcdc实心;
    }
    .bt{
    宽度:70px;
    边框:1px#000实心;
    位置:绝对位置;
    左:100px;
    底部:-30px;
    背景#ffff00;
    填充:2px8px;
    }
    .说明{
    边缘顶部:10px;
    }
    
    玩
    我是保罗的学校

    键入am“@school”,使carret在放学后播放,然后单击播放
    如果我理解正确,那么您的问题并非无法解决。你可以尝试下面我做的方法。基本上,您希望检查用户为
    目标提供的输入字符串
    字符(本例中为“@”)。如果在字符串中找到
    目标
    ,则
    将输入字符串拆分为一个数组。一旦拥有了该数组,就可以在其上使用
    array.prototype.map
    方法来创建新数组。您的
    映射
    回调应该检查当前元素是否包含
    目标
    ——如果包含,只需将其替换为所需的替换字符串,否则只需保持输入不变:

    const divEditable=document.getElementById('editable_div');
    document.getElementById('btnPlaying')。addEventListener('click',function(){
    var input=divEditable.innerHTML;
    var target='@';
    if(input.length&&input.indexOf(target)>-1){
    divEditable.innerHTML=doReplace(输入,目标,“播放”);
    }
    });
    功能数据替换(输入、目标、替换){
    var words=input.split(“”).map(函数(word){
    if(单词索引of(目标)>-1){
    退换货;
    }
    返回词;
    });
    返回单词。join(“”);
    }
    
    键入am“@school”,使carret在放学后播放,然后单击播放
    
    播放
    而不是创建小提琴,按Ctrl+M或单击问题编辑器上的
    按钮,以打开“现场片段”工具。在现场为您树立榜样。@Taplar希望您了解我在寻找什么。我目前正在创建一个代码段我相信我理解您的要求,但我正在等待该代码段。在我看来,如果没有这个片段,问题就倾向于“过于宽泛”的一面。在你的问题中,你似乎问了很多问题。是的,我知道这是一个相当宽泛的话题,但请稍等,我给你看一下我的答案。正如你所看到的,在我刚才提供的片段中,单词playing将在放学后追加。在添加单词playingyour code之前,我想删除单词@school。我希望您的代码符合我的要求,让我看看替换后是否会影响contenteditable div中的节点。我将在之后进行评论。根据我的需要,您的代码很有用,但我可能需要检查执行我需要的操作是否有任何错误。谢谢,我稍后会评论