i developing wysiwyg editor , unable remove html added due previous actions.
to reproduce problem: select text , bold it. try un-bold it. able remove class not wrapping <span>
. [i have logged html in console on every click event.]
here tried:
range = sel.getrangeat(0); range.deletecontents(); range.insertnode(document.createtextnode(selectedtext));
however, doesnt remove wrapping html.
var isopera = !!window.opera || navigator.useragent.indexof(' opr/') >= 0; // opera 8.0+ (ua detection detect blink/v8-powered opera) var isfirefox = typeof installtrigger !== 'undefined'; // firefox 1.0+ var issafari = object.prototype.tostring.call(window.htmlelement).indexof('constructor') > 0; // @ least safari 3+: "[object htmlelementconstructor]" var ischrome = !!window.chrome && !isopera; // chrome 1+ var isie = /*@cc_on!@*/false || !!document.documentmode; // @ least ie6 function replaceselectedtext(classname) { var selectedtext, sel, range; if (window.getselection) { sel = window.getselection(); selectedtext = window.getselection().tostring(); console.log(selectedtext); // check if selection has class if(ischrome){ if(sel.basenode.parentelement.classname && sel.rangecount){ console.log("ischrome classname:" + sel.basenode.parentelement.classname); sel.basenode.parentelement.classname = ""; range = sel.getrangeat(0); range.deletecontents(); // doesnt delete wrapping html range.insertnode(document.createtextnode(selectedtext)); return false; } } if(isfirefox){ if(sel.anchornode.nextelementsibling.classname){ console.log("isfirefox classname:" + sel.anchornode.nextelementsibling.classname); sel.anchornode.nextelementsibling.classname = ""; return false; } } //console.log(selectedtext); if (sel.rangecount) { range = sel.getrangeat(0); range.deletecontents(); var element = document.createelement('span'); element.classname = classname; element.textcontent = selectedtext; range.insertnode(element); } } else if (document.selection && document.selection.createrange) { range = document.selection.createrange(); range.text = replacementtext; } } var toolbarbuttons = document.queryselectorall("#toolbar button"); //console.log(toolbarbuttons); (var = 0; < toolbarbuttons.length; ++i) { toolbarbuttons[i].addeventlistener('click', function(){ replaceselectedtext(this.id); console.log(document.getelementbyid("editable").innerhtml); }); }
#editable{ border: 1px solid #000000; margin-top: 20px; height: 50px; font-family: arial; } .bold{ font-weight: bold; } .italic{ font-style: italic; }
<div id="toolbar"> <button id="bold">bold</button> <button id="italic">italic</button> </div> <div id="editable" contenteditable="true"> <div>lorem ipsum lorem ipsum</div> </div>
how fix this?
i fixed filtering out <span>
no classname
using regex when user submits form.
sourcehtml = sourcehtml.replace(/\<span class=""\>([a-za-z0-9\s]+)\<\/span\>/g, "$1");
Comments
Post a Comment