jQuery 将富文本粘贴到内容可编辑的 div 中,并仅保留粗体和斜体格式
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21257688/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Paste rich text into content-editable div and only keep bold and italics formatting
提问by Cristi Pufu
I want to paste some rich text which has different fonts, font sizes, font weights, etc. into a content-editable div
and ONLY keep boldness and italics. Any idea how to go about this?
我想将一些具有不同字体、字体大小、字体粗细等的富文本粘贴到内容可编辑中,div
并且仅保留粗体和斜体。知道如何解决这个问题吗?
The following code turns rich text into plain text when pasted into content-editable div.
当粘贴到内容可编辑的 div 中时,以下代码将富文本转换为纯文本。
$('[contenteditable]').on('paste',function(e) {
e.preventDefault();
var text = (e.originalEvent || e).clipboardData.getData('text/plain') || prompt('Paste something..');
document.execCommand('insertText', false, text);
});
I've tried looking at the text
variable in the above code, but it doesn't seem to be formatted.
我试过查看text
上面代码中的变量,但它似乎没有被格式化。
回答by Cristi Pufu
Here's a working demo: http://jsfiddle.net/SJR3H/7/
这是一个工作演示:http: //jsfiddle.net/SJR3H/7/
$(document).ready(function(){
$('[contenteditable]').on('paste',function(e) {
e.preventDefault();
var text = (e.originalEvent || e).clipboardData.getData('text/html') || prompt('Paste something..');
var $result = $('<div></div>').append($(text));
$(this).html($result.html());
// replace all styles except bold and italic
$.each($(this).find("*"), function(idx, val) {
var $item = $(val);
if ($item.length > 0){
var saveStyle = {
'font-weight': $item.css('font-weight'),
'font-style': $item.css('font-style')
};
$item.removeAttr('style')
.removeClass()
.css(saveStyle);
}
});
// remove unnecesary tags (if paste from word)
$(this).children('style').remove();
$(this).children('meta').remove()
$(this).children('link').remove();
});
});
Later edit:http://jsfiddle.net/SJR3H/8/
后来编辑:http : //jsfiddle.net/SJR3H/8/
i added the following lines:
我添加了以下几行:
$item.replaceWith(function(){
return $("<span />", {html: $(this).html()});
});
It actually replaces all html
tags with span
s. There you can optionally choose to let some tags as they were in the original text (h1
, p
, etc), styling them as you desire.
它实际上html
用span
s替换了所有标签。在那里,您可以选择让某些标签保持原始文本(、 等)中的原样h1
,根据需要对它们进行p
样式设置。
回答by sudhan kantharuban
Let begin with your code :
让我们从你的代码开始:
//on paste
var text = (e.originalEvent || e).clipboardData.getData('text/plain')
//html in clipboard are saved as Plain Unicode string ,
getData('text/plain') //return data as string,
//if MIME TYPE 'text/html' is used you will get data as html with style attributes
// insert text
document.execCommand('insertText', false, text);
//this will simply insert the text to contenteditable div.
//so there is no chance of knowing recieved text is bold / italics.
(1) we must get data as html,to get style properties: fontWeight, fontStyle.
(1) 我们必须以html形式获取数据,才能获取样式属性:fontWeight、fontStyle。
(2) reduce html for needed style format,
(2) 减少 html 所需的样式格式,
(3) append to contenteditable div.
(3) 附加到 contenteditable div。
!important ::
!重要的 ::
we depend on Clipboard API, to get data.
我们依赖剪贴板 API 来获取数据。
it is not fully supported by newer browsers, please check links below:
较新的浏览器不完全支持它,请检查以下链接:
https://developer.mozilla.org/en-US/docs/Web/Reference/Events/paste
https://developer.mozilla.org/en-US/docs/Web/Reference/Events/paste
so in IE Browser it wont work as expected.
所以在 IE 浏览器中它不会按预期工作。
the data format argument we pass in getData() is different in IE Browser:
我们在 getData() 中传递的数据格式参数在 IE 浏览器中是不同的:
http://msdn.microsoft.com/en-us/library/ie/ms536436(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ie/ms536436(v=vs.85).aspx
so we get only plain string from getData() method, i checked in IE 9.0.8112.16421 ( not updated ) ,
所以我们只从 getData() 方法获得纯字符串,我在 IE 9.0.8112.16421(未更新)中检查,
i am not aware of version IE 10, 11.
我不知道版本 IE 10、11。
I coded in a way, if getData("Html") supported in ie 10,11 code, requirements will get done.
我以某种方式编码,如果 ie 10,11 代码支持 getData("Html"),则要求将完成。
Code works : Like @Cristi did, get all html elements.
代码有效:像@Cristi 一样,获取所有 html 元素。
iterate through them, instead of changing style attributes we use tags.
遍历它们,而不是更改样式属性,我们使用标签。
tags for bold & tag for italics.
粗体标记和斜体标记。
Iterations are done asynchronously, because pasting large text content may hang browser.
迭代是异步完成的,因为粘贴大文本内容可能会挂掉浏览器。
I had Tested in Chrome, Firefox.
我曾在 Chrome、Firefox 中进行过测试。
pasteArea.addEventListener('paste', function(e) {
// prevent pasting text by default after event
e.preventDefault();
var clipboardData = {},
rDataText,
rDataHTML;
clipboardData = e.clipboardData;
rDataHTML = clipboardData.getData('text/html');
rDataPText = clipboardData.getData('text/plain');
if (rDataHTML && rDataHTML.trim().length != 0) {
//Function Call to Handle HTML
return false; // prevent returning text in clipboard
}
if (rDataPText && rDataPText.trim().length != 0) {
//Function Call to Handle Plain String
return false; // prevent returning text in clipboard
}
}, false);
// Handle Plain Text
function PlainTextHandler(pText) {
// Remove Line breaks
// append to contenteditable div - using range.insertNode()
// document.execCommand(); had issue in ie9 so i didn't used it
}
// Handle HTML
function formatHtml(elem, complete) {
var flag_italic = false;
var flag_weight = false;
var fontStyle;
var fontWeight;
if (elem.nodeType == 1) { // only pass html elements
// get style in css
var CSSStyle = window.getComputedStyle(elem);
fontStyle = CSSStyle.fontStyle;
fontWeight = CSSStyle.fontWeight;
// get style defined by inline
var InlineStyle = elem.style;
inlineFontStyle = InlineStyle['font-style'];
inlineFontWeight = InlineStyle['font-weight'];
if (inlineFontStyle && inlineFontStyle.trim() != '') fontStyle = inlineFontStyle;
if (inlineFontWeight && inlineFontWeight.trim() != '') fontWeight = inlineFontWeight;
// get style defined in MSword
var msStyle = elem.getAttribute('style');
if (/mso-bidi/.test(msStyle)) {
var MSStyleObj = {};
var styleStrArr = msStyle.split(";");
for (i = 0; i < styleStrArr.length; i++) {
var temp = styleStrArr[i].split(":");
MSStyleObj[temp[0]] = temp[1];
}
fontStyle = MSStyleObj['mso-bidi-font-style'];
fontWeight = MSStyleObj['mso-bidi-font-weight'];
}
if (fontStyle && fontStyle == 'italic') flag_italic = true; // flag true if italic
if (fontWeight && (fontWeight == 'bold' || 600 <= (+fontWeight))) flag_weight = true; // flag true if bold - 600 is semi bold
// bold & italic are not applied via style
// these styles are applied by appending contents in new tags string & bold
if (flag_italic && flag_weight) {
var strong = document.createElement('strong');
var italic = document.createElement('i');
strong.appendChild(italic);
newtag = strong;
} else {
if (flag_italic) {
newtag = document.createElement('i');
} else if (flag_weight) {
newtag = document.createElement('strong');
} else {
// remove un wanted attributes & element
var tagName = elem.tagName;
// strong are not skipped because, by creating new unwanted attributes will be removed
if (tagName == 'STRONG' || tagName == 'B') {
newtag = document.createElement('strong');
} else if (tagName == 'I') {
newtag = document.createElement('i');
} else {
newtag = document.createElement('span');
}
}
}
// content appended
var elemHTML = elem.innerHTML;
if (flag_italic && flag_weight) {
newtag.childNodes[0].innerHTML = elemHTML;
} else {
newtag.innerHTML = elemHTML;
}
// curr element is replaced by new
elem.parentNode.insertBefore(newtag, elem);
elem.parentNode.removeChild(elem);
}
complete() // completed one iteration
}
回答by user956584
I used this on my website for long time
我在我的网站上使用了很长时间
$(document).on('paste','#tesc', function() {
setTimeout(function() {
asd = strip_tags( $('#tesc').html(), '<b><b/><i></i>');
$('#tesc').html( asd );
},100);
});
function strip_tags (input, allowed) {
/* http://kevin.vanzonneveld.net*/
if ( input == undefined ) { return ''; }
allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>)
var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
return input.replace(commentsAndPhpTags, '').replace(tags, function (##代码##, ) {
return allowed.indexOf('<' + .toLowerCase() + '>') > -1 ? ##代码## : '';
});
}