jQuery Summernote自定义按钮功能
jQuery Summernote custom button function
我这里有一个 jsFiddle -> http://jsfiddle.net/cm910t89/2/
我在 Summernote WYSIWYG Editor 中创建了一个自定义按钮,但我似乎无法让我的功能在插件中正常工作。
我希望用户能够突出显示(或 select 使用他们的光标)编辑器中的任何文本,然后单击我的自定义按钮,该按钮将 selected 文本包装在 span
标签带有 'snote' 的特殊 class。
现在我可以用 class 将 selected 包装在一个 span 标签中,但是编辑器中的所有格式都会被删除。
任何人都可以帮助 selected 文本被包裹在 span 标签中并且格式保持不变吗?
jsFiddle -> http://jsfiddle.net/cm910t89/2/
$(document).ready(function() {
var editor = $('#summernote');
editor.summernote({
height: ($(window).height() - 250),
focus: false,
toolbar: [
['style', ['bold', 'italic', 'underline', 'clear']],
['font', ['strikethrough']],
['fontsize', ['fontsize']],
['para', ['ul', 'ol', 'paragraph']],
['height', ['height']],
['view', ['fullscreen', 'codeview']],
],
oninit: function() {
// Add "open" - "save" buttons
var noteBtn = '<button id="makeSnote" type="button" class="btn btn-default btn-sm btn-small" title="Identify a music note" data-event="something" tabindex="-1"><i class="fa fa-music"></i></button>';
var fileGroup = '<div class="note-file btn-group">' + noteBtn + '</div>';
$(fileGroup).appendTo($('.note-toolbar'));
// Button tooltips
$('#makeSnote').tooltip({container: 'body', placement: 'bottom'});
// Button events
$('#makeSnote').click(function(event) {
var highlight = window.getSelection(),
spn = '<span class="snote" style="color:blue;">' + highlight + '</span>',
text = $('.note-editable').children('p').text(),
range = highlight.getRangeAt(0),
startText = text.substring(0, range.startOffset),
endText = text.substring(range.endOffset, text.length);
$('.note-editable').html(startText + spn + endText);
});
},
});
由于 $('.note-editable')
是一个文本区域,当您调用 .text()
时,它将只获取元素的文本,丢失插件 summernote 添加的所有 html 以很好地显示给你。
您不需要所有代码来替换突出显示的文本。事实上,您所需要的只是您创建的 range
对象!与他一起,您调用 .deleteContents()
清除所选范围,然后调用 .insertNode(node)
插入一个动态创建的范围,文本为:
$('#makeSnote').click(function(event) {
var highlight = window.getSelection(),
spn = document.createElement('span'),
range = highlight.getRangeAt(0)
spn.innerHTML = highlight;
spn.className = 'snote';
spn.style.color = 'blue';
range.deleteContents();
range.insertNode(spn);
});
这是工作 fiddle。
试试这个
$('#makeSnote').click(function(event) {
var highlight = window.getSelection(),
spn = '<span class="snote" style="color:blue;">' + highlight + '</span>',
text = $(highlight.anchorNode).text(),
range = highlight.getRangeAt(0),
startText = text.substring(0, range.startOffset),
endText = text.substring(range.endOffset, text.length);
$(highlight.anchorNode).replaceWith(startText + spn + endText);
});
我改用 anchorNode
,因为您的 TextArea 中还有其他 HTML 节点而不是文本。
我没用过 SummerNote,但看看 fiddles,它是一个将 textarea 转换为 contenteditable div 的包装器。因为它是 div,间距会保留 <p>
和 <br>
标签,所以要保持格式,您只需要获取 innerHTML
而不是 Text
. +Denis Ali 的答案应该有效,因为它将标签准确地留在了它们所在的位置,并且只有 deletes/reinjects 选定的部分。
您可以使用 innerHTML
(JS) 或 $().html()
(Jq) 来获取格式化内容而不是 .text 但如果 +Denis 或这个都不起作用,则必须有其他东西一种影响。 Denis 应该根据您的 fiddle 和图书馆工作。
我这里有一个 jsFiddle -> http://jsfiddle.net/cm910t89/2/
我在 Summernote WYSIWYG Editor 中创建了一个自定义按钮,但我似乎无法让我的功能在插件中正常工作。
我希望用户能够突出显示(或 select 使用他们的光标)编辑器中的任何文本,然后单击我的自定义按钮,该按钮将 selected 文本包装在 span
标签带有 'snote' 的特殊 class。
现在我可以用 class 将 selected 包装在一个 span 标签中,但是编辑器中的所有格式都会被删除。
任何人都可以帮助 selected 文本被包裹在 span 标签中并且格式保持不变吗?
jsFiddle -> http://jsfiddle.net/cm910t89/2/
$(document).ready(function() {
var editor = $('#summernote');
editor.summernote({
height: ($(window).height() - 250),
focus: false,
toolbar: [
['style', ['bold', 'italic', 'underline', 'clear']],
['font', ['strikethrough']],
['fontsize', ['fontsize']],
['para', ['ul', 'ol', 'paragraph']],
['height', ['height']],
['view', ['fullscreen', 'codeview']],
],
oninit: function() {
// Add "open" - "save" buttons
var noteBtn = '<button id="makeSnote" type="button" class="btn btn-default btn-sm btn-small" title="Identify a music note" data-event="something" tabindex="-1"><i class="fa fa-music"></i></button>';
var fileGroup = '<div class="note-file btn-group">' + noteBtn + '</div>';
$(fileGroup).appendTo($('.note-toolbar'));
// Button tooltips
$('#makeSnote').tooltip({container: 'body', placement: 'bottom'});
// Button events
$('#makeSnote').click(function(event) {
var highlight = window.getSelection(),
spn = '<span class="snote" style="color:blue;">' + highlight + '</span>',
text = $('.note-editable').children('p').text(),
range = highlight.getRangeAt(0),
startText = text.substring(0, range.startOffset),
endText = text.substring(range.endOffset, text.length);
$('.note-editable').html(startText + spn + endText);
});
},
});
由于 $('.note-editable')
是一个文本区域,当您调用 .text()
时,它将只获取元素的文本,丢失插件 summernote 添加的所有 html 以很好地显示给你。
您不需要所有代码来替换突出显示的文本。事实上,您所需要的只是您创建的 range
对象!与他一起,您调用 .deleteContents()
清除所选范围,然后调用 .insertNode(node)
插入一个动态创建的范围,文本为:
$('#makeSnote').click(function(event) {
var highlight = window.getSelection(),
spn = document.createElement('span'),
range = highlight.getRangeAt(0)
spn.innerHTML = highlight;
spn.className = 'snote';
spn.style.color = 'blue';
range.deleteContents();
range.insertNode(spn);
});
这是工作 fiddle。
试试这个
$('#makeSnote').click(function(event) {
var highlight = window.getSelection(),
spn = '<span class="snote" style="color:blue;">' + highlight + '</span>',
text = $(highlight.anchorNode).text(),
range = highlight.getRangeAt(0),
startText = text.substring(0, range.startOffset),
endText = text.substring(range.endOffset, text.length);
$(highlight.anchorNode).replaceWith(startText + spn + endText);
});
我改用 anchorNode
,因为您的 TextArea 中还有其他 HTML 节点而不是文本。
我没用过 SummerNote,但看看 fiddles,它是一个将 textarea 转换为 contenteditable div 的包装器。因为它是 div,间距会保留 <p>
和 <br>
标签,所以要保持格式,您只需要获取 innerHTML
而不是 Text
. +Denis Ali 的答案应该有效,因为它将标签准确地留在了它们所在的位置,并且只有 deletes/reinjects 选定的部分。
您可以使用 innerHTML
(JS) 或 $().html()
(Jq) 来获取格式化内容而不是 .text 但如果 +Denis 或这个都不起作用,则必须有其他东西一种影响。 Denis 应该根据您的 fiddle 和图书馆工作。