Chrome 版本 58 的 Redactor 编辑器文本格式问题
Redactor editor text format issues with Chrome version 58
我们使用的是 Redactor(https://imperavi.com/redactor/) 版本 10.1.1,由于对项目有很多依赖性,所以没有迁移到 Redactor II。
最近我们在 Chrome 58 版中遇到了一个非常奇怪的问题。问题是:
-- 无法为所选文本设置粗体、斜体、下划线、sup、sub 等格式
请告知我们是否有解决此问题的方法。任何形式的帮助将不胜感激。
根据已接受的解决方案更新:
// Provided solution is tested for Redactor version 10.1.1
createMarkers: function()
{
this.selection.get();
var node1 = this.selection.getMarker(1);
this.selection.setMarker(this.range, node1, true);
if (this.range.collapsed === false) {
var node2 = this.selection.getMarker(2);
this.selection.setMarker(this.range, node2, false);
// Fix for Chrome58 Issues
if (this.utils.browser('chrome')) {
this.caret.set(node1, 0, node2, 0);
}
// End Chrome58 Issues
}
this.savedSel = this.$editor.html();
},
我想我可能已经找到了解决方案:似乎 Chrome 58(有时)在我们调用 Range.insertNode
时重置了选择。
我建议的解决方案是在 Redactor 添加选择标记时恢复选择:在 createMarkers
函数中,在设置 node2
标记之后,您可以添加此函数调用:
this.caret.set(node1, 0, node2, 0);
Here's 应该为 concrete5 修复 Redactor 的解决方案(但它也应该适用于其他项目)。
原代码在10.2.2和10.2.5都是这样
getNodes: function()
{
this.selection.get();
var startNode = this.selection.getNodesMarker(1);
var endNode = this.selection.getNodesMarker(2);
if (this.range.collapsed === false)
{
if (window.getSelection) {
var sel = window.getSelection();
if (sel.rangeCount > 0) {
var range = sel.getRangeAt(0);
var startPointNode = range.startContainer, startOffset = range.startOffset;
var boundaryRange = range.cloneRange();
boundaryRange.collapse(false);
boundaryRange.insertNode(endNode);
boundaryRange.setStart(startPointNode, startOffset);
boundaryRange.collapse(true);
boundaryRange.insertNode(startNode);
// Reselect the original text
range.setStartAfter(startNode);
range.setEndBefore(endNode);
sel.removeAllRanges();
sel.addRange(range);
}
}
}
else
{
this.selection.setNodesMarker(this.range, startNode, true);
endNode = startNode;
}
how to change it?
而不是 10.2.5 版本中的这个
总的来说你可以这样做:
重写 setMarker 函数:
setMarker: function (range, node, type) {
var nclone = window.getSelection().getRangeAt(0).cloneRange();
range = range.cloneRange();
try {
var selection = window.getSelection();
range.collapse(type);
range.insertNode(node);
selection.removeAllRanges();
selection.addRange(nclone);
}
catch (e)
{
this.focus.setStart();
}
},
或在 createMarkers 函数中添加修复:
// 提供的解决方案针对 Redactor 版本 10.1.1
进行了测试
createMarkers: function()
{
this.selection.get();
var node1 = this.selection.getMarker(1);
this.selection.setMarker(this.range, node1, true);
if (this.range.collapsed === false)
{
var node2 = this.selection.getMarker(2);
this.selection.setMarker(this.range, node2, false);
// Fix for Chrome58 Issues
if (this.utils.browser('chrome')) {
this.caret.set(node1, 0, node2, 0);
}
// End Chrome58 Issues
}
this.savedSel = this.$editor.html();
},
这是在 chrome 60 上运行和测试的。
我们使用的是 Redactor(https://imperavi.com/redactor/) 版本 10.1.1,由于对项目有很多依赖性,所以没有迁移到 Redactor II。
最近我们在 Chrome 58 版中遇到了一个非常奇怪的问题。问题是:
-- 无法为所选文本设置粗体、斜体、下划线、sup、sub 等格式
请告知我们是否有解决此问题的方法。任何形式的帮助将不胜感激。
根据已接受的解决方案更新:
// Provided solution is tested for Redactor version 10.1.1
createMarkers: function()
{
this.selection.get();
var node1 = this.selection.getMarker(1);
this.selection.setMarker(this.range, node1, true);
if (this.range.collapsed === false) {
var node2 = this.selection.getMarker(2);
this.selection.setMarker(this.range, node2, false);
// Fix for Chrome58 Issues
if (this.utils.browser('chrome')) {
this.caret.set(node1, 0, node2, 0);
}
// End Chrome58 Issues
}
this.savedSel = this.$editor.html();
},
我想我可能已经找到了解决方案:似乎 Chrome 58(有时)在我们调用 Range.insertNode
时重置了选择。
我建议的解决方案是在 Redactor 添加选择标记时恢复选择:在 createMarkers
函数中,在设置 node2
标记之后,您可以添加此函数调用:
this.caret.set(node1, 0, node2, 0);
Here's 应该为 concrete5 修复 Redactor 的解决方案(但它也应该适用于其他项目)。
原代码在10.2.2和10.2.5都是这样
getNodes: function()
{
this.selection.get();
var startNode = this.selection.getNodesMarker(1);
var endNode = this.selection.getNodesMarker(2);
if (this.range.collapsed === false)
{
if (window.getSelection) {
var sel = window.getSelection();
if (sel.rangeCount > 0) {
var range = sel.getRangeAt(0);
var startPointNode = range.startContainer, startOffset = range.startOffset;
var boundaryRange = range.cloneRange();
boundaryRange.collapse(false);
boundaryRange.insertNode(endNode);
boundaryRange.setStart(startPointNode, startOffset);
boundaryRange.collapse(true);
boundaryRange.insertNode(startNode);
// Reselect the original text
range.setStartAfter(startNode);
range.setEndBefore(endNode);
sel.removeAllRanges();
sel.addRange(range);
}
}
}
else
{
this.selection.setNodesMarker(this.range, startNode, true);
endNode = startNode;
}
how to change it?
而不是 10.2.5 版本中的这个
总的来说你可以这样做: 重写 setMarker 函数:
setMarker: function (range, node, type) {
var nclone = window.getSelection().getRangeAt(0).cloneRange();
range = range.cloneRange();
try {
var selection = window.getSelection();
range.collapse(type);
range.insertNode(node);
selection.removeAllRanges();
selection.addRange(nclone);
}
catch (e)
{
this.focus.setStart();
}
},
或在 createMarkers 函数中添加修复: // 提供的解决方案针对 Redactor 版本 10.1.1
进行了测试createMarkers: function()
{
this.selection.get();
var node1 = this.selection.getMarker(1);
this.selection.setMarker(this.range, node1, true);
if (this.range.collapsed === false)
{
var node2 = this.selection.getMarker(2);
this.selection.setMarker(this.range, node2, false);
// Fix for Chrome58 Issues
if (this.utils.browser('chrome')) {
this.caret.set(node1, 0, node2, 0);
}
// End Chrome58 Issues
}
this.savedSel = this.$editor.html();
},
这是在 chrome 60 上运行和测试的。