(function(old) { $.fn.attr = function() { if(arguments.length === 0) { if(this.length === 0) { return null; } var obj = {}; $.each(this[0].attributes, function() { if(this.specified) { obj[this.name] = this.value; } }); return obj; } return old.apply(this, arguments); }; })($.fn.attr); jQuery.extend({ drWindowLocation:function(href,isShownLoading){ if(isShownLoading){ $('#loadingBar').drloadingbar("startLoad"); } window.location.href=href; }, adjustNode:function(node,isRoot){ var childNodes = node.children(); var tagName = node[0].tagName.toLowerCase(); if(tagName == null){ //普通字符串节点,不转化 return; } if(childNodes.length > 0){ //不是叶子节点,先去调整所有子节点 for(var i = 0; i < childNodes.length; i++){ $.adjustNode($(childNodes[i]),false); } }else{ //叶子节点 var display = $.getElementDefaultDisplay(tagName); if(display == "block" || display=="list-item"){ if(tagName == "p"){ //本身就是段落,不替换 }else if(tagName == "hr"){ //分割线,不替换 }else{ //替换成段落 if(node.hasClass("drimgCaption")){ //不替换 }else{ node.contents().unwrap().wrap("

"); } } }else{ //行内元素,不替换 if(tagName=="img"){ //图片元素,包裹imgcaption if(!node.parent().hasClass("drimgPackage")){ node.wrap('
'); node.parent().append($('
 
')); } } } return; } //非叶子节点调整完所有底部节点后 //处理换行问题 var hasBr = false;; for(var i = 0; i < node.children().length; i++){ if(node.children()[i].tagName.toLowerCase() == "br"){ if(node.closest(".drimgPackage").length > 0){ }else{ hasBr = true; } break; } } if(hasBr){ var brNodePosition = []; var contentsChild = node.contents(); for(var i = 0; i < contentsChild.length; i++){ var content = contentsChild[i]; if(content.nodeType == 1){ var contentTagName = content.tagName.toLowerCase(); if(contentTagName == "br"){ brNodePosition.push(i); } } } var shouldWrapNodePosition = []; var wrapGroup = []; for(var i = 0; i < brNodePosition.length;i++){ var j = i + 1; var k = i - 1; var allPrevNode = []; if(i == 0){ for(var index = 0; index < brNodePosition[i]; index++ ){ allPrevNode.push($(node.contents()[index])); } }else{ } var allPostNode = []; if(j < brNodePosition.length){ for(var index = brNodePosition[i] + 1; index < brNodePosition[j]; index++ ){ allPostNode.push($(node.contents()[index])); } }else{ for(var index = brNodePosition[i] + 1; index < node.contents().length; index++ ){ allPostNode.push($(node.contents()[index])); } } wrapGroup.push(allPrevNode); wrapGroup.push(allPostNode); } var originContent = node.contents(); for(var i = 0; i < wrapGroup.length; i++){ var wrapObj = originContent.filter(function(){ for(var j = 0; j < wrapGroup[i].length;j++){ if(wrapGroup[i][j][0] == this){ return true; } } return false; }); wrapObj.wrapAll("

"); } //去掉br node.find("br").remove(); } if(isRoot){ return; } var display = $.getElementDefaultDisplay(tagName); if(display == "block" || display=="list-item"){ if(tagName == "p"){ //本身就是段落,不替换 }else if(tagName=="aside" || tagName=="blockquote" || tagName == "ul" || tagName == "ol" || tagName =="dl" || tagName == "div" || tagName=="section" || tagName=="article" || tagName=="header" || tagName=="footer" || tagName == "div" || tagName =="form" || tagName == "head" || tagName == "nav"){ //容器类 if(tagName == "div" && (node.hasClass("drimgPackage") || node.hasClass("drimgCaption") )){ }else{ var prev = node.prev(); var next = node.next(); var parent = node.parent(); if(prev.length > 0){ node.children().insertAfter(prev); }else if(next.length > 0){ node.children().insertBefore(next); }else{ node.children().prependTo(parent); } node.remove(); } }else{ $newElement = $("

"); var oldAttrs = node.attr(); for(var key in oldAttrs){ $newElement.attr(key,oldAttrs[key]); } $newElement.html(node.html()); $newElement.insertAfter(node); node.remove(); } }else{ //行内元素 } }, getElementDefaultDisplay:function(tag) { var cStyle, t = document.createElement(tag), gcs = "getComputedStyle" in window; document.body.appendChild(t); cStyle = (gcs ? window.getComputedStyle(t, "") : t.currentStyle).display; document.body.removeChild(t); return cStyle; }, clearNode:function(node){ if(node != null){ if(node.hasClass("drimgCaption")){ node.removeAttr("class"); node.addClass("drimgCaption"); }else if(node.hasClass("drimgPackage")){ node.removeAttr("class"); node.addClass("drimgPackage"); }else{ node.removeAttr("class"); } node.removeAttr("style"); if(node[0].tagName == null){ //普通文本,没有tag return false; } //去掉所有内置属性 var tagName = node[0].tagName.toLowerCase(); var attrObj = node.attr(); for(var key in attrObj){ if(tagName == "img" && key == "src"){ continue; }else if(tagName=="a" && key=="href"){ node.attr("target","_blank"); continue; }else if(tagName=="a" && key=="target"){ continue; }else if(key=="class"){ continue; } node.removeAttr(key); } if($.shouldbeEmptyNode(node)){ //本节点自身为空,去除 return true; }else{ var children = node.children(); var removeNode = []; for(var i = 0; i < children.length; i++){ if($.clearNode($(children[i]))){ removeNode.push($(children[i])); } } for(var i = 0; i < removeNode.length; i++){ removeNode[i].remove(); } //子节点移除后判断父节点是否为空 if($.shouldbeEmptyNode(node)){ return true; } return false; } } }, shouldbeEmptyNode:function(node){ var tagName = node[0].tagName.toLowerCase(); if(tagName == "img"){ return false; } if(tagName == "hr"){ return false; } if(tagName == "br"){ return false; } if(tagName == "div" && (node.hasClass("drimgCaption") || node.hasClass("drimgPackage"))){ return false; } var ret = ($.trim(node.text()) === '' && node.children().length == 0); return ret; }, removeEmptyNode:function(node){ node.filter(function() { var returnValue = ($.trim($(this).text()) === '' && $(this).children().length == 0); return returnValue; }).remove(); }, getGuid:function(){ function S4() { return (((1+Math.random())*0x10000)|0).toString(16).substring(1); } return (S4()+S4()+""+S4()+""+S4()+""+S4()+""+S4()+S4()+S4()); }, // processContentEditableStr:function(blockElement){ // var content = ""; // var inputChildren = blockElement.children(); // for(var i = 0; i < inputChildren.length; i++){ // if($(inputChildren[i])[0].tagName.toLowerCase() == "br"){ // content = content + "\n"; // continue; // } // var tagName = inputChildren[i].tagName.toLowerCase(); // // if($.getElementDefaultDisplay(tagName)=="block" || $.getElementDefaultDisplay(tagName)=="list-item"){ // if($(inputChildren[i]).text() != ""){ // content = content + "\n" + $.processContentEditableStr($(inputChildren[i])); // }else{ // content = content + $.processContentEditableStr($(inputChildren[i])); // } // // }else{ // content = content + $(inputChildren[i]).text(); // } // // } // var parentContent = blockElement.contents().filter(function() { // return this.nodeType === 3; // }).text(); // content = parentContent + content; // return content; // }, processContentEditableStr:function(blockElement,isRoot){ var content = ""; var inputChildren = blockElement.contents(); for(var i = 0; i < inputChildren.length; i++){ if(inputChildren[i].nodeType === 3){ content = content + $(inputChildren[i]).text(); continue; } if(inputChildren[i].tagName.toLowerCase() == "br"){ content = content + "\n"; continue; } var tagName = inputChildren[i].tagName.toLowerCase(); if($.getElementDefaultDisplay(tagName)=="block" || $.getElementDefaultDisplay(tagName)=="list-item"){ var textNode= $(inputChildren[i]).contents().filter(function() { return this.nodeType === 3; }); if(textNode.length > 0){ content = content + "\n" + $.processContentEditableStr($(inputChildren[i]),false); }else{ content = content + $.processContentEditableStr($(inputChildren[i]),false); } }else{ content = content + $.processContentEditableStr($(inputChildren[i]),false); } } // var parentContent = blockElement.contents().filter(function() { // return this.nodeType === 3; // }).text(); // content = parentContent + content; if(isRoot){ //去掉第一个回车 if(content != "" && content[0] == "\n"){ content = content.substring(1,content.length); } } return content; }, nl2br:function(str, is_xhtml) { var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '
' : '
'; //return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2'); str=str.replace(/\r\n/g,breakTag); str=str.replace(/\n/g,breakTag); return str; }, setSelectionRange:function(input, selectionStart, selectionEnd) { if (input.setSelectionRange) { input.focus(); input.setSelectionRange(selectionStart, selectionEnd); } else if (input.createTextRange) { var range = input.createTextRange(); range.collapse(true); range.moveEnd('character', selectionEnd); range.moveStart('character', selectionStart); range.select(); } }, focuscurorInContentEditable:function(selector,position){ selector.each(function(){ var el = this; var range = document.createRange(); var sel = window.getSelection(); range.setStart(el.childNodes[0], position); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); }); }, getDeviceWidthType: function(){ var clientWidth = document.documentElement.clientWidth; if(clientWidth <= 800){ return 1; }else{ return 4; //>800统一按照pc处理暂时 } }, getDeviceWidth:function(){ var clientWidth = document.documentElement.clientWidth; return clientWidth; }, getDeviceHeight:function(){ var clientHeight = document.documentElement.clientHeight; return clientHeight; }, htmlspecialchars:function(str){ str = str.replace(/&/g, '&'); str = str.replace(//g, '>'); str = str.replace(/"/g, '"'); str = str.replace(/'/g, '''); return str; }, getDateFormat:function(time){ time = new Date(time*1000); var year=time.getYear() + 1900; var month=time.getMonth()+1; var date=time.getDate(); var hour=time.getHours(); var minute=time.getMinutes(); var second=time.getSeconds(); return year+"."+month+"."+date; }, getMeaningfulTimeStr:function(time){ var nowTime = (Date.parse(new Date()))/1000; var time = time; var delta = nowTime-time; if(delta < 60){ return "1 分钟前"; }else if(delta < 3600){ delta = Math.floor(delta/60); return delta+" 分钟前"; }else if(delta < 86400){ delta = Math.floor(delta/3600); return delta+" 小时前"; }else { //判断是否是昨天 var today = new Date(); today.setHours(0); today.setMinutes(0); today.setSeconds(0); today.setMilliseconds(0); var oneday = 1000* 60 * 60 * 24; var yesterday = new Date(today - oneday); var yesterdayTime = (Date.parse(yesterday))/1000; timeDate = new Date(time*1000); var year=timeDate.getYear() + 1900; var month=timeDate.getMonth()+1; var date=timeDate.getDate(); var hour=timeDate.getHours(); var minute=timeDate.getMinutes(); var second=timeDate.getSeconds(); if (month.toString().length == 1) { month = "0" + month; } if (date.toString().length == 1) { date = "0" + date; } if (minute.toString().length == 1) { minute = "0" + minute; } if (hour.toString().length == 1) { hour = "0" + hour; } if (second.toString().length == 1) { second = "0" + second; } if(yesterdayTime <= time){ //是昨天 return "昨天 " + hour +":"+minute; }else{ return year+"-"+month+"-"+date + " " + hour +":"+minute; } } }, getTransitionEnd:function() { var el = document.createElement('dragon') var transEndEventNames = { WebkitTransition : 'webkitTransitionEnd', MozTransition : 'transitionend', OTransition : 'oTransitionEnd otransitionend', transition : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } return false // explicit for ie8 ( ._.) } }); //补充jquery被废弃的broswer变量判断浏览器类型 var matched, browser; jQuery.uaMatch = function( ua ) { ua = ua.toLowerCase(); var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || /(webkit)[ \/]([\w.]+)/.exec( ua ) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || /(msie)[\s?]([\w.]+)/.exec( ua ) || /(trident)(?:.*? rv:([\w.]+)|)/.exec( ua ) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || []; return { browser: match[ 1 ] || "", version: match[ 2 ] || "0" }; }; matched = jQuery.uaMatch( navigator.userAgent ); //IE 11+ fix (Trident) matched.browser = matched.browser == 'trident' ? 'msie' : matched.browser; browser = {}; if ( matched.browser ) { browser[ matched.browser ] = true; browser.version = matched.version; } // Chrome is Webkit, but Webkit is also Safari. if ( browser.chrome ) { browser.webkit = true; } else if ( browser.webkit ) { browser.safari = true; } jQuery.browser = browser; (function( $ ){ var methods = { init : function( options ){ var $this = this; options = $.extend( $.fn.drcontenteditable.options, options ); return this.each(function(){ $this.on("paste",function(e){ var pasteText = e.originalEvent.clipboardData.getData("text/plain"); //替换/r/n为br pasteText = pasteText.replace(/\r\n/g,"
"); pasteText = pasteText.replace(/\r/g,"
"); pasteText = pasteText.replace(/\n/g,"
"); document.execCommand("insertHTML", false, pasteText); e.preventDefault(); }); }); }, getContent:function(){ function extractTextWithWhitespaceWorker(elems, lineBreakNodeName) { var ret = ""; var elem; for (var i = 0; elems[i]; i++) { elem = elems[i]; if (elem.nodeType === 3 // text node || elem.nodeType === 4) // CDATA node { ret += elem.nodeValue; } if (elem.nodeName === lineBreakNodeName ) { if(elem.nodeType == 1 && $(elem).text() != ""){ ret += "\n"; } } if(elem.nodeName === "BR"){ ret += "\n"; } if (elem.nodeType !== 8) // comment node { ret += extractTextWithWhitespace(elem.childNodes, lineBreakNodeName); } } return ret; } function extractTextWithWhitespace(elems) { var lineBreakNodeName = "BR"; // Use
as a default if ($.browser.webkit) { lineBreakNodeName = "DIV"; } else if ($.browser.msie) { lineBreakNodeName = "P"; } else if ($.browser.mozilla) { lineBreakNodeName = "BR"; } else if ($.browser.opera) { lineBreakNodeName = "P"; } var extractedText = extractTextWithWhitespaceWorker(elems, lineBreakNodeName); return extractedText; } return extractTextWithWhitespace(this.contents()); } }; $.fn.drcontenteditable = function( method ) { // Method calling logic if ( methods[method] ) { return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return methods.init.apply( this, arguments ); } else { $.error( 'Method ' + method + ' does not exist on jQuery.drcontenteditable' ); } }; $.fn.drcontenteditable.options = {}; })( jQuery );