Meteor 中的 ExecCommand 不工作
ExecCommand in Meteor is not working
我正在尝试在 Meteor 中实现 ContentEditable 的基本富文本编辑功能,但我遇到了 execCommand 问题。
撤消和重做命令工作正常,但所有其他命令(如粗体和斜体)都不起作用并且没有给出任何错误。
该代码作为常规页面也能正常工作(我已经为 Meteor 做了明显的改编,例如模板和事件)。
我的html:
<body>
{{> buttons}}
<div id="editor" class="textZone" contenteditable="true"></div>
</body>
<template name="buttons">
<div id="rtfOptions">
<div class="separate">
<div class="rtfOption" id="undo">undo</div>
<div class="rtfOption" id="redo">redo</div>
</div>
<div class="separate">
<div class="rtfOption" id="bold">bold</div>
<div class="rtfOption" id="italic">italic</div>
</div>
</div>
</template>
我的事件(只有 2 个无效 + 有效的撤消。至于其余的几乎相同):
if (Meteor.isClient) {
Template.buttons.events({
"click #bold": function() { // Toggles bold on/off for the selection or at the insertion point
document.execCommand("bold", false, "null");
},
"click #italic": function() { // Toggles italics on/off for the selection or at the insertion point
document.execCommand("italic", false, "null");
},
"click #undo": function() { // Undoes the last executed command.
document.execCommand('undo', false, "null");
}
)};
}
有人知道这个问题吗?与文档或范围有关吗?
如果您将 div
标签改为 button
(对于可点击的元素),或者使 div 文本不可选择(例如禁用 user-select
和 css) 它应该如您所愿地工作。
原因是当你点击里面有文字的 div
时,execCommand
会指向 div
的文字(不是 contenteditable
)所以该命令静默失败。尝试将 contenteditable="true"
添加到 div,您会发现如果单击 div
的文本,它会以粗体显示。或者,尝试添加 css 规则 -webkit-user-select: none;
(在 Chrome 上,供应商前缀在其他浏览器上不同)以禁用 div 上的文本选择,您会看到execCommand
工作正常。
查看工作演示 here。
代码示例,为清楚起见:
选项 1
<template name="buttons">
<div id="rtfOptions">
<div class="separate">
<div class="rtfOption" id="bold" style="user-select: none; -webkit-user-select: none; -webkit-touch-callout: none;">bold</div>
</div>
</div>
</template>
选项 2
<template name="buttons">
<div id="rtfOptions">
<div class="separate">
<button class="rtfOption" id="bold">bold</button>
</div>
</div>
</template>
我正在尝试在 Meteor 中实现 ContentEditable 的基本富文本编辑功能,但我遇到了 execCommand 问题。 撤消和重做命令工作正常,但所有其他命令(如粗体和斜体)都不起作用并且没有给出任何错误。 该代码作为常规页面也能正常工作(我已经为 Meteor 做了明显的改编,例如模板和事件)。
我的html:
<body>
{{> buttons}}
<div id="editor" class="textZone" contenteditable="true"></div>
</body>
<template name="buttons">
<div id="rtfOptions">
<div class="separate">
<div class="rtfOption" id="undo">undo</div>
<div class="rtfOption" id="redo">redo</div>
</div>
<div class="separate">
<div class="rtfOption" id="bold">bold</div>
<div class="rtfOption" id="italic">italic</div>
</div>
</div>
</template>
我的事件(只有 2 个无效 + 有效的撤消。至于其余的几乎相同):
if (Meteor.isClient) {
Template.buttons.events({
"click #bold": function() { // Toggles bold on/off for the selection or at the insertion point
document.execCommand("bold", false, "null");
},
"click #italic": function() { // Toggles italics on/off for the selection or at the insertion point
document.execCommand("italic", false, "null");
},
"click #undo": function() { // Undoes the last executed command.
document.execCommand('undo', false, "null");
}
)};
}
有人知道这个问题吗?与文档或范围有关吗?
如果您将 div
标签改为 button
(对于可点击的元素),或者使 div 文本不可选择(例如禁用 user-select
和 css) 它应该如您所愿地工作。
原因是当你点击里面有文字的 div
时,execCommand
会指向 div
的文字(不是 contenteditable
)所以该命令静默失败。尝试将 contenteditable="true"
添加到 div,您会发现如果单击 div
的文本,它会以粗体显示。或者,尝试添加 css 规则 -webkit-user-select: none;
(在 Chrome 上,供应商前缀在其他浏览器上不同)以禁用 div 上的文本选择,您会看到execCommand
工作正常。
查看工作演示 here。
代码示例,为清楚起见:
选项 1
<template name="buttons">
<div id="rtfOptions">
<div class="separate">
<div class="rtfOption" id="bold" style="user-select: none; -webkit-user-select: none; -webkit-touch-callout: none;">bold</div>
</div>
</div>
</template>
选项 2
<template name="buttons">
<div id="rtfOptions">
<div class="separate">
<button class="rtfOption" id="bold">bold</button>
</div>
</div>
</template>