如何避免从 jQuery 中的 contenteditable

中删除键入的文本

2024-01-13

我正在使用 jQuery UI 可拖动组件来添加<span>内容可编辑<p>.

预期产出是,段落<p>应该是可编辑的,并且可拖动组件应该能够拖放到段落以及段落的内容<p>应该可以编辑。我的代码有问题。当我在里面输入一些东西时<p>然后点击外面的<p>。从段落中删除的键入单词。

我的代码如下:

$(function() {
  function textWrapper(str, sp, btn) {
    if (sp == undefined) {
      sp = [0, 0];
    }
    var txt = "";
    if (btn) {
      txt = "<span class='w b'>" + str + "</span>";
    } else {
      txt = "<span class='w'>" + str + "</span>";
    }

    if (sp[0]) {
      txt = "&nbsp;" + txt;
    }

    if (sp[1]) {
      txt = txt + "&nbsp;";
    }

    return txt;
  }

  function chunkWords(p) {
    var words = p.split(" ");
    words[0] = textWrapper(words[0], [0, 1]);
    var i;
    for (i = 1; i < words.length; i++) {
      var re = /\[.+\]/;
      if (re.test(words[i])) {
        var b = makeTextBox(words[i].slice(1, -1));
        words[i] = "&nbsp;" + b.prop("outerHTML") + "&nbsp;";
      } else {
        if (words[0].indexOf(".")) {
          words[i] = textWrapper(words[i], [1, 0]);
        } else {
          words[i] = textWrapper(words[i], [1, 1]);
        }
      }
    }
    return words.join("");
  }

  function unChunkWords(tObj) {
    var words = [];
    $(".w", tObj).each(function(i, el) {
      console.log($(el).text(), $(el).attr("class"));
      if ($(el).hasClass("b")) {
        words.push("[" + $(el).text().trim() + "]");
      } else {
        words.push($(el).text().trim());
      }
    });
    return words.join(" ");
  }

  function makeBtn(tObj) {
    var btn = $("<span>", {
      class: "ui-icon ui-icon-close"
    }).appendTo(tObj);
  }

  function makeTextBox(txt) {
    var sp = $("<span>", {
      class: "w b"
    }).html(txt);
    makeBtn(sp);
    return sp;
  }

  function makeDropText(obj) {
    return obj.droppable({
      drop: function(e, ui) {
        var txt = ui.draggable.text();
        var newSpan = textWrapper(txt, [1, 0], 1);
        $(this).after(newSpan);
        makeBtn($(this).next("span.w"));
        makeDropText($(this).next("span.w"));
        $("span.w.ui-state-highlight").removeClass("ui-state-highlight");
      },
      over: function(e, ui) {
        $(this).add($(this).next("span.w")).addClass("ui-state-highlight");
      },
      out: function() {
        $(this).add($(this).next("span.w")).removeClass("ui-state-highlight");
      }
    });
  }

  $("p.given").html(chunkWords($("p.given").text()));

  $("p.given").on("click", ".b > .ui-icon", function() {
    $(this).parent().remove();
  });

  $("p.given").blur(function() {
    var w = unChunkWords($(this));
    console.log(w);
    $(this).html(chunkWords(w));
    makeDropText($("p.given span.w"));
  });

  $("span.given").draggable({
    helper: "clone",
    revert: "invalid"
  });

  makeDropText($("p.given span.w"));
});
p.given {
  display: flex;
  flex-wrap: wrap;
}

p.given span.w span.ui-icon {
  cursor: pointer;
}

div.blanks {
  display: inline-block;
  min-width: 50px;
  border-bottom: 2px solid #000000;
  color: #000000;
}

div.blanks.ui-droppable-active {
  min-height: 20px;
}

span.answers>b {
  border-bottom: 2px solid #000000;
}

span.given {
  margin: 5px;
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="row">
  <p class="given" contenteditable="true">Lorem Ipsum is simply dummy text of the printing and typesetting industry. [Lorem] Ipsum has been the industry's standard dummy text ever since the 1500s, Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p>
</div>

<div class="divider"></div>
<div class="section">
  <section>
    <div class="card blue-grey ">
      <div class="card-content white-text">
        <div class="row">
          <div class="col s12">
            <span class="given btn-flat white-text red lighten-1" rel="1">the Santee, thDakota</span>
            <span class="given btn-flat white-text red lighten-1" rel="2">America</span>
            <span class="given btn-flat white-text red lighten-1" rel="3">Qatar</span>
            <span class="given btn-flat white-text red lighten-1" rel="4">Philippines</span>
          </div>
        </div>
      </div>
    </div>
  </section>
</div>

该问题间歇性地发生。


有时用户输入的文本又被删除了,原因就在函数中unChunkWords:

该函数仅迭代elements(使用类“w”),但它不会迭代这些元素之间可能出现的纯文本节点。在内容可编辑元素中,用户确实可以在区域中键入文本between元素。所以这个循环unChunkWords永远不会访问此类文本,并在返回的数组中省略它。

您可以通过将光标放在单词末尾的空格之前,然后按向右箭头键来强制执行此操作。这要么将光标移动到下一个单词的开头,要么它不明显移动(它只是移出了单词的范围)span它是在)。无论哪种方式,您的光标现在都位于分隔两个单词的文本节点中。输入一些内容并单击其他地方。 ...异常发生了。

有很多方法可以规避这个问题。其中之一是使用 jQuerycontents()方法,它还收集文本节点。更改以下代码:

$(".w", tObj).each(function(i, el) {
  if ($(el).hasClass("b")) {
    words.push("[" + $(el).text().trim() + "]");
  } else {
    words.push($(el).text().trim());
  }
});

...对此:

$(tObj).contents().each(function (i, el) {
  if (el.nodeType !== 3 && !$(el).is(".w")) return; // Only regard ".w" or text nodes
  if ($(el).hasClass("b")) {
    words.push("[" + $(el).text().trim() + "]");
  } else {
    words.push($(el).text().trim());
  }
});

现在您输入的文本将不会被省略words,即使您在作为内容可编辑元素的直接子元素的文本节点中键入它。

添加空格

您的代码正在添加空格.join(" ")无需验证文本片段是否确实由内容中的空格分隔p元素。所以,我只想抓住all内容,包括间距,然后将其连接起来。这样你就会得到与它们在文本中完全相同的单词分隔符。p元素。

那么你的函数将是:

  function unChunkWords(tObj) {
    var words = "";
    $(tObj).contents().each(function (i, el) {
      if ($(el).hasClass("b")) {
        words += "[" + $(el).text() + "]";
      } else {
        words += $(el).text();
      }
    });
    return words.replace(/\s+/g, " ").trim();
  }

免责声明:我只看过这个特别的问题,指出为什么你会遇到这个问题特别的行为,以及如何解决它。这并不意味着现在您的代码将在其所有预期功能中正常工作,这超出了问题的范围。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免从 jQuery 中的 contenteditable

中删除键入的文本 的相关文章

  • 从一个页面导航到另一个页面时,JavaScript 不会执行

    我正在构建我的第一个 Ruby on Rails 应用程序 并尝试创建一个动画导航栏 我正在使用 jQuery 和 Turbolink 这是我的application js under app assets javascripts docu
  • 克隆元素对应表单中所有元素的事件

    我成功克隆了表行 其中包含从数据库检索的值 不过我对它没有什么问题 我对所有元素使用了类 因为克隆会重复 ID 不会出现问题 因为它无法唯一地定位每个元素 使每个元素 行在这里唯一的方法是什么 功能如何工作 当第一次选择框时 所选 ID 的
  • 如何在html中创建字体选择栏

    我想创建一个下拉菜单 在其中我们可以看到所有可用的字体 并且可以选择我们选择的任何字体 我还想创建一个字体颜色选择小部件 存在大量的字体样式 我想知道如何获取所有这些字体以及如何创建一个小部件 用户可以使用该小部件选择他选择的颜色 为了创建
  • Google App Script postMessage 与收件人窗口的来源不匹配

    我有一个 Google App 脚本部署为Web应用程序 https developers google com apps script guides web 它工作正常 直到今天晚上我发现它无法在 Firefox 或 Chrome 中加载
  • CKEDITOR.styleSet.add - 'a' 元素的新样式

    由于某种原因如果我改变 p to a 它不再出现在样式列表中 有什么理由吗 CKEDITOR stylesSet add default name Wys wiersza 1 element p styles line height 18p
  • 使用 ECMA 脚本向节点(页面)添加新属性

    我需要在页面激活时向页面添加属性 我决定建立一个工作流程 在激活步骤之前执行相同的操作 我的自定义工作流程步骤 激活步骤之前的步骤 使用 ECMA 脚本来实现此目的 这是我到目前为止所拥有的 var workflowData granite
  • 名称属性的 CSS 选择器?

    这可能是一个愚蠢的问题 但是属性的 CSS 选择器是什么 a 那是 名字 document body innerHTML myString anchor HTML String 这段 JavaScript 创建了一个 a 带有名称的元素 H
  • 如何使用Javascript获取ASP.NEt Web Forms标签的值?

    我有以下标签控件
  • 类型错误:require.config 不是一个函数

    我正在使用 require js 作为早午餐项目的一部分 这段代码抛出错误 require config require config is not a function paths jquery lib jquery underscore
  • 从变量值动态设置 ng-controller

    我正在使用 AngularJs 和 NodeJS 开发一个应用程序 我对将控制器的名称设置为主控制器中的变量的值感到震惊 为了更好地解释它 我的 index html 看起来像这样 tbody tr td td td member task
  • 删除数组中所有对象的属性

    我想删除bad数组中每个对象的属性 有没有比使用更好的方法for循环并从每个对象中删除它 var array bad something good something bad something good something for var
  • 如何使用 Soundcloud api 将流传输到 html5 音频播放器中?

    我刚刚开始学习 javascript 作为我的第一次尝试 我想创建自定义音频播放器 它使用 soundcloud 的 api 作为音乐源 到目前为止 这就是我的设置
  • Angular2 - 防止复选框被选中

    我有一个每行包含一个复选框的表 在表头中 我有一个Check All切换所有表格行框的复选框 我正在尝试实现一些逻辑 如果复选框的数量将超过特定限制 则显示错误并且不切换表行复选框或checkall盒子本身 有一个问题允许checkAll即
  • javascript 函数后面括号中的值

    我正在尝试重新利用我在 SO 的答案中找到的一些 Javascript 代码 但我想首先更好地理解它的语法 其大纲是 function root ns factory some code window detectZoom function
  • 如何应对 WebStorm 中大量未解决的变量警告?

    我有一个从服务器获取数据的函数 function getData data console log data someVar 网络风暴说someVar是一个未解决的变量 我怎样才能摆脱这样的警告 我看到几个选项 禁止 IDE 设置中的警告
  • 如何使用 jQuery 检测浏览器是否关闭

    我需要使用 jQuery 检测浏览器是否被关闭 如果是这样 则执行一个事件 我的网站上有一个聊天功能 很像 Facebook 可以让用户在导航到网站结构中的其他页面时保持登录状态 但如果他们单击 则需要将他们从聊天中注销 这样他们就不会在线
  • 角度距离计算

    我正在使用角度制作距离计算应用程序 Html
  • CSS 或 Javascript - 如果背景图像未加载,则显示后备文本[重复]

    这个问题在这里已经有答案了 如果徽标图形文件未加载或丢失 如何显示文本而不是徽标 我有带有背景 PNG 图像的 div div class iHaveBgImage this text should be displayed if bg i
  • 如何在 Servlet 中打开弹出窗口,然后重定向页面

    我想在调用 servlet 时打开一个弹出窗口 然后想将 servlet 重定向到某个 jsp page 这就是我所做的 protected void doGet HttpServletRequest request HttpServlet
  • 如何在输入时格式化 contenteditable div?

    我正在尝试编写一个函数 允许 contenteditable div 在用户输入 div 时执行一些自动格式化 到目前为止我只能让它在 IE 中运行 有人可以帮助我吗 function formatOnKeyUp if window get

随机推荐

  • android.database.sqlite.SQLiteException:无法将 Android 短信数据库的数据库从版本 58 降级到 55

    当我的 Android 应用程序尝试读取 Android 短信数据库时 我遇到此崩溃 读取android短信数据库的代码类似于以下代码片段 String SMS URI content sms Uri uri Uri parse SMS U
  • 如何在 Windows 上用 C/C++ 为文件预分配空间?

    我正在向使用纯 C 函数的现有代码库添加一些功能 fopen fwrite fclose 将数据写入文件 不幸的是 我无法更改文件 i o 的实际机制 但我必须为文件预先分配空间以避免碎片 这会影响读取期间的性能 有没有比实际将零或随机数据
  • WebRTC 视频不显示

    我正在创建一对一的 webrtc 视频聊天室 但此代码不起作用 我想知道为什么 function hasUserMedia navigator getUserMedia navigator getUserMedia navigator we
  • 从 Android 设备发送 HTTPS/HTTP POST 时出现 UnknownHostException

    我正在尝试创建一个到 Google 服务器的 HTTP POST 来获取 ClientLogin Auth 如所述here http code google com android c2dm index html push 这篇文章的源代码
  • 视图中的 ASP.NET Web Api [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在这种情况下通过 webapi 创建一个登录页面 我不想使用令牌 但视图应该是安全的 不是直接在 URL 中调用 如果用户是管理员
  • CSS 替代行 - 隐藏一些行

    我正在尝试设计表格 使每一行都有不同的颜色 奇数 偶数 我有以下 CSS woo tr nth child even td background color f0f9ff woo tr nth child odd td background
  • 两阶段查找 - 需要解释

    编译器使用两阶段查找来编译模板类是什么意思 模板被编译 至少 两次 如果没有实例化 则会检查模板代码本身的语法 例如 任何语法错误 例如 etc 在实例化时 当确切类型已知时 将再次检查模板代码以确保所有调用对于该特定类型都有效 例如 模板
  • httr 有时会将 URL 中的“%”替换为“%25”

    使用时httr GET 在某些查询中它会替换 具有安全代表 25 但在其他查询中则不然 我找不到任何规则可以实现这种情况 我正在使用 httr 1 4 1 示例查询在哪里 被替换 请注意错误代码 并且输入的 URL 与返回的响应对象中的 U
  • Google Chromecast SDK 在后台拆解

    使用 iOS Sender API 框架 当我的应用程序进入后台时 SDK 会断开所有连接 并且我无法启动更多媒体 直到应用程序返回前台 我的应用程序播放音频并允许在后台运行和流式传输 是否有一个选项可以告诉 Googlecast 框架保持
  • 从 C# 中的 Richtextbox 中选择文本

    我想选择 RichTextBox 文本的最后一个 和 之间的文本 我有下一个代码 但 LastIndexOf 函数有错误 我不知道如何修复它 有人可以给我一些帮助吗 private void highlightText mRtbxOpera
  • 我应该如何将 Java 代码转换为 C# 代码?

    我正在将 Java 库移植到 C 我使用的是 Visual Studio 2008 因此没有已停止使用的 Microsoft Java 语言转换助手程序 JLCA 我的方法是创建一个与 Java 库类似的项目结构的新解决方案 然后将 jav
  • 单元测试 ASP.NET MVC 重定向

    如何对 MVC 重定向进行单元测试 public ActionResult Create Product product productTask Save product return RedirectToAction Success pu
  • 我可以将本机依赖项放在子文件夹中吗

    当我发布 dotnet core 项目时 它生成了一个文件夹 其中包含数百个框架和本机运行时文件 我知道这些文件是使一切正常工作所必需的 但是我可以将它们移到子文件夹中并仍然让我的应用程序运行吗 例如 MYAppFolder MyApp e
  • 为什么在 collections.deque 中间添加或删除比在那里查找慢?

    This wiki python org https wiki python org moin TimeComplexity关于某些数据结构的算法复杂性的页面说以下内容collections deque object deque 双端队列
  • 在自定义文本区域中显示插入符号而不显示其文本

    我有一个自定义文本区域 在此示例中 它随机地将字母变为红色或绿色 var mydiv document getElementById mydiv myta document getElementById myta function upda
  • 填写 BigQuery 中联接表的缺失值

    我在 BigQuery 中有一个表 其中包含发生某些交易时每天的净库存数量以及包含价格历史记录的表 如下所示 WITH trans AS SELECT DATE 2018 10 02 trans date 10 0 quantity UNI
  • 即使提供记录 ID 也无法更新嵌套属性

    我正在尝试更新嵌套记录 但由于某种原因它不起作用并且我的更新操作被忽略 如果我在控制台中运行以下代码 它会返回 true 但 field values attributes 实际上没有更新任何内容 只有 steps attributes 按
  • JIRA JQL:按阻止状态对卡片进行着色

    我正在尝试使用 JIRA Agile 的 卡片颜色 功能以及 ScriptRunner 插件 为 JIRA Agile 板上的阻塞卡片着色 我对 被阻止 的定义是 票证具有 被阻止 字段的值 或者以 被阻止 关系链接到未解决的票证 我能做的
  • 在 Pillow 中打开和加载图像时出现“打开文件过多”错误

    当运行以下代码时 KEEP for file in glob glob KEEP thing tT iI fF m pattern search file filename m group 1 keep Image open file ke
  • 如何避免从 jQuery 中的 contenteditable

    中删除键入的文本

    我正在使用 jQuery UI 可拖动组件来添加 span 内容可编辑 p 预期产出是 段落 p p 应该是可编辑的 并且可拖动组件应该能够拖放到段落以及段落的内容 p p 应该可以编辑 我的代码有问题 当我在里面输入一些东西时 p p 然