Проблемы текстового формата редактора редактора в Chrome версии 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();
},
3 ответа
Я думаю, что, возможно, нашел решение: кажется, что Chrome 58 (иногда) сбрасывает выбор, когда мы вызываем Range.insertNode
,
Решение, которое я предлагаю, состоит в том, чтобы восстановить выделение, когда Redactor добавляет маркеры выделения: createMarkers
функция, сразу после установки node2
маркер, вы можете добавить эту функцию вызова:this.caret.set(node1, 0, node2, 0);
Вот решение, которое должно исправить Redactor for concrete5 (но оно также должно работать и для других проектов).
Вместо этого в версии 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.
Оригинальный код такой же как в 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?