国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁(yè) > 開(kāi)發(fā) > Java > 正文

javascript開(kāi)發(fā)隨筆3 開(kāi)發(fā)iframe富文本編輯器的一點(diǎn)體會(huì)

2024-07-21 02:53:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
前段時(shí)間有個(gè)需求是開(kāi)發(fā)富文本編輯器,這個(gè)之前隨做過(guò),但看了需求,發(fā)現(xiàn)有些地方還需google
 
就把遇到的問(wèn)題記錄一下。寫這篇文章時(shí)用的TinyMCE編輯器就很強(qiáng)大,但畢竟是第三方的,項(xiàng)目也考慮了這些,如果做些自定義的東西不太方便。 
1. 判斷光標(biāo)位置的元素(或者選中的部分)的樣式。光標(biāo)位置改變的時(shí)候更新工具欄對(duì)應(yīng)按鈕的樣式。什么情況下光標(biāo)的位置會(huì)改變呢?是鍵盤方向鍵和鼠標(biāo)點(diǎn)擊,于是就判斷鍵盤事件和鼠標(biāo)事件來(lái)執(zhí)行光標(biāo)移動(dòng)的處理。 
a. 獲得光標(biāo)位置或選中元素:首先getSelection,創(chuàng)建range。然后獲得元素,獲取到元素之后就可以或得樣式、tagName等等,做更多的操作,運(yùn)行代碼: 
復(fù)制代碼代碼如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<title></title> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<style type="text/css"> 
p{width:600px;text-align: left;text-indent:2em;line-height:20px;font-size:12px} 
textarea{width:600px;height:100px;font-size:12px;overflow:auto} 
</style> 
</head> 
<body> 
<span style="display:block;height:150px; font-size:12px;line-height:150%">信息</span> 
<script type="text/javascript"> 
function createEditor(){ 
var iframe = document.createElement('iframe'); 
iframe.id = 'iframe'; 
iframe.frameBorder = 1; 
iframe.width = 400; 
iframe.height = 200; 
document.body.appendChild(iframe); 
return iframe; 

var bind = function(element,eventType,fn,useCapture){ 
useCapture = useCapture || false; 
if(arguments.length < 3){ 
return true 
}; 
if(window.addEventListener){ 
element.addEventListener(eventType, fn, useCapture); 
}else{ 
element.attachEvent('on'+eventType,fn, useCapture); 


//from 司徒正美 
var css = document.defaultView ? function(el,style){ 
return document.defaultView.getComputedStyle(el, null).getPropertyValue(style) 
} : function(el,style){ 
style = style.replace(//-(/w)/g, function($, $1){ 
return $1.toUpperCase(); 
}); 
return el.currentStyle[style]; 

function bindEditor(){ 
var iframe = createEditor(); 
var ifr_win = iframe.contentWindow; 
var ifr_doc = ifr_win.document; 

var editorContent = '<span style="font-family: 黑體; font-weight: bold;">阿四大四大四</span>大<span style="font-style: italic; text-decoration: underline;">四大四大打算</span>打打<span style="font-style: italic; color: #ff0000;">雙打薩斯</span>大師'; 
ifr_doc.designMode='On';//可編輯 
ifr_doc.contentEditable = true; 
ifr_doc.open(); 
ifr_doc.writeln('<html><head><style type="text/css">body{padding:10px;margin:0;font-size:13px;font-family:宋體;text-align:left;overflow:auto;word-wrap: break-word;cursor:text;background-color: transparent; }body,p,font,div,ul,li {line-height: 1.5;}p,font,div,ul,li {line-height: 1.5;margin:0;padding:0}a{color:#548DD4}</style></head><body>'+ editorContent +'</body></html>'); 
ifr_doc.close(); 

var getRange = function(){ 
var range = window.getSelection ? ifr_win.getSelection() : ifr_win.document.selection; 
if (!range) { 
return { 
node : null, 
range : null, 
text : null 
}; 

range = range.createRange ? range.createRange() : range.getRangeAt(0); 
var text = window.getSelection ? range : range.text; 
var rangeNode = null; 
if (range.commonAncestorContainer) { 
rangeNode = range.commonAncestorContainer; 
} else { 
if (range.parentElement) rangeNode = range.parentElement(); 

return { 
node : rangeNode, 
range : range, 
text : text 


var info = document.getElementsByTagName('span')[0]; 
var getStyle = function(node){ 
//console.log(node) 
var html = ''; 
html+= '<span style="font-family:'+ css(node,'font-family') +'">字體:'+ css(node,'font-family') + '</span><br />'; 
html+= '<span style="color:'+ css(node,'color') +'">顏色:'+ css(node,'color') + '</span><br />'; 
html+= '<span style="font-style:'+ css(node,'font-style') +'">斜體:'+ css(node,'font-style') + '</span><br />'; 
html+= '<span style="font-weight:'+ css(node,'font-weight') +'">粗體:'+ css(node,'font-weight') + '</span><br />'; 
html+= '<span style="text-decoration:'+ css(node,'text-decoration') +'">下劃線:'+ css(node,'text-decoration') + '</span><br />'; 
html+= 'tagName:'+ node.tagName + ',style:'+ node.getAttribute('style') +'<br />'; 

info.innerHTML = html; 

//當(dāng)光標(biāo)位置改變時(shí)候執(zhí)行 
var onselectionchange = function(event){ 
var e = event || window.event; 
if(!e.keyCode)e.keyCode = e.which; 
//方向鍵移動(dòng)光標(biāo),獲取光標(biāo)位置的dom 
if((e.keyCode >= 37 && e.keyCode <= 40 )|| e.type == "click"){ 

var node = getRange().node;//獲取光標(biāo)位置元素 
if(node !== null){ 
while(node.nodeType != 1){ 
node = node.parentNode; 

getStyle(node); 




bind(ifr_doc,'click',onselectionchange,false); 
bind(ifr_doc,'keydown',onselectionchange,false); 

window.onload = function(){ 
bindEditor(); 

</script> 
</body> 
</html> 

2. ie不能保持光標(biāo)位置,這個(gè)是在添加超鏈接時(shí)候出現(xiàn)的問(wèn)題,當(dāng)不使用瀏覽器內(nèi)置的輸入框,光標(biāo)移動(dòng)其他的文本域里,ie會(huì)失去所選中的部分,無(wú)法對(duì)選中的部分加鏈接了,解決辦法就是:利用range的getBookmark和moveToBookmark,然后給iframe的document綁定onbeforedeactivate(getBookmark)、onactivate(moveTo),這2個(gè)事件的大致意思就是,當(dāng)被激活和失去激活狀態(tài)。增加事件之后,就不必保存lastRang或者再其他地方設(shè)置bookmark了,可以讓ie像其他瀏覽器一樣自動(dòng)保持光標(biāo)位置了 
復(fù)制代碼代碼如下:

if(Util.browser.msie){ 
Util.bind(this.E.ifr_win.document, "beforedeactivate", function(){ 
var Rng = _self.getRange().range; 
_self.rangeBookMark= Rng.getBookmark(); 
}); 
Util.bind(this.E.ifr_win.document, "activate", function(){ 
var Rng = _self.getRange().range; 
Rng.moveToBookmark(_self.rangeBookMark); 
Rng.select(); 
_self.rangeBookMark = null; 
}); 

3. ie中的撤銷與重做 。 當(dāng)iframe外部有彈出窗口、或者修改html撤銷、重做功能將失效。只能歸為ie的bug了。。。。也許ie沒(méi)分清iframe和頁(yè)面的document,把他們的撤銷、重做混道義了。 
如下: 
復(fù)制代碼代碼如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<title></title> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<style type="text/css"> 
p{width:600px;text-align: left;text-indent:2em;line-height:20px;font-size:12px} 
textarea{width:600px;height:100px;font-size:12px;overflow:auto} 
</style> 
</head> 
<body> 
<span style="display:block;height:150px; font-size:12px;line-height:150%">信息</span> 
<div id="J_tool"> 
<input type="button" command="Undo" value="撤銷" unselectable="on" /> 
<input type="button" command="Redo" value="重做" unselectable="on" /> 
<input type="button" command="Bold" value="粗體" unselectable="on" /> 
<input type="button" command="Italic" value="斜體" unselectable="on" /> 
</div> 
<br /> 
<input type="button" onclick="changeLayout()" value="點(diǎn)擊下,ie將無(wú)法撤銷、重做" /> 
<br /> 
<script type="text/javascript"> 
function changeLayout(){ 
var popwin = document.getElementById('popwin'); 
if(!popwin){ 
popwin = document.createElement('div'); 
popwin.id = 'popwin'; 
popwin.style.cssText = 'display:none;width:300px;height:150px;background-color:#ccc;position:absolute;left:0;top:0px;text-align:center;line-height:150px;'; 
popwin.innerHTML = '改變了layoud渲染,ie將無(wú)法撤銷、重做'; 
document.body.appendChild(popwin); 
popwin.onclick= function(){this.style.display = 'none'}; 

popwin.style.display = popwin.style.display == 'none' ? 'block' : 'none'; 

function createEditor(){ 
var iframe = document.createElement('iframe'); 
iframe.id = 'iframe'; 
iframe.frameBorder = 1; 
iframe.width = 400; 
iframe.height = 200; 
document.body.appendChild(iframe); 
return iframe; 

var bind = function(element,eventType,fn,useCapture){ 
useCapture = useCapture || false; 
if(arguments.length < 3){ 
return true 
}; 
if(window.addEventListener){ 
element.addEventListener(eventType, fn, useCapture); 
}else{ 
element.attachEvent('on'+eventType,fn, useCapture); 


//from 司徒正美 
var css = document.defaultView ? function(el,style){ 
return document.defaultView.getComputedStyle(el, null).getPropertyValue(style) 
} : function(el,style){ 
style = style.replace(//-(/w)/g, function($, $1){ 
return $1.toUpperCase(); 
}); 
return el.currentStyle[style]; 

function bindEditor(){ 
var iframe = createEditor(); 
var ifr_win = iframe.contentWindow; 
var ifr_doc = ifr_win.document; 
var editorContent = '<span style="font-family: 黑體; font-weight: bold;">阿四大四大四</span>大<span style="font-style: italic; text-decoration: underline;">四大四大打算</span>打打<span style="font-style: italic; color: #ff0000;">雙打薩斯</span>大師'; 
ifr_doc.designMode='On';//可編輯 
ifr_doc.contentEditable = true; 
ifr_doc.open(); 
ifr_doc.writeln('<html><head><style type="text/css">body{padding:10px;margin:0;font-size:13px;font-family:宋體;text-align:left;overflow:auto;word-wrap: break-word;cursor:text;background-color: transparent; }body,p,font,div,ul,li {line-height: 1.5;}p,font,div,ul,li {line-height: 1.5;margin:0;padding:0}a{color:#548DD4}</style></head><body>'+ editorContent +'</body></html>'); 
ifr_doc.close(); 
var getRange = function(){ 
var range = window.getSelection ? ifr_win.getSelection() : ifr_win.document.selection; 
if (!range) { 
return { 
node : null, 
range : null, 
text : null 
}; 

range = range.createRange ? range.createRange() : range.getRangeAt(0); 
var text = window.getSelection ? range : range.text; 
var rangeNode = null; 
if (range.commonAncestorContainer) { 
rangeNode = range.commonAncestorContainer; 
} else { 
if (range.parentElement) rangeNode = range.parentElement(); 

return { 
node : rangeNode, 
range : range, 
text : text 


var info = document.getElementsByTagName('span')[0]; 
var getStyle = function(node){ 
//console.log(node) 
var html = ''; 
html+= '<span style="font-family:'+ css(node,'font-family') +'">字體:'+ css(node,'font-family') + '</span><br />'; 
html+= '<span style="color:'+ css(node,'color') +'">顏色:'+ css(node,'color') + '</span><br />'; 
html+= '<span style="font-style:'+ css(node,'font-style') +'">斜體:'+ css(node,'font-style') + '</span><br />'; 
html+= '<span style="font-weight:'+ css(node,'font-weight') +'">粗體:'+ css(node,'font-weight') + '</span><br />'; 
html+= '<span style="text-decoration:'+ css(node,'text-decoration') +'">下劃線:'+ css(node,'text-decoration') + '</span><br />'; 
html+= 'tagName:'+ node.tagName + ',style:'+ node.getAttribute('style') +'<br />'; 
info.innerHTML = html; 

//當(dāng)光標(biāo)位置改變時(shí)候執(zhí)行 
var onselectionchange = function(event){ 
var e = event || window.event; 
if(!e.keyCode)e.keyCode = e.which; 
//方向鍵移動(dòng)光標(biāo),獲取光標(biāo)位置的dom 
if((e.keyCode >= 37 && e.keyCode <= 40 )|| e.type == "click"){ 
var node = getRange().node;//獲取光標(biāo)位置元素 
if(node !== null){ 
while(node.nodeType != 1){ 
node = node.parentNode; 

getStyle(node); 



bind(ifr_doc,'click',onselectionchange,false); 
bind(ifr_doc,'keydown',onselectionchange,false); 
bind(document.getElementById('J_tool'),'click',function(event){ 
event = event || window.event; 
var target = event.srcElement || event.target; 
var command = target.getAttribute('command'); 
var param = target.getAttribute('param') || ''; 
ifr_doc.execCommand(command,false,param); 
return false; 
}) 

window.onload = function(){ 
bindEditor(); 

</script> 
</body> 
</html> 

如何解決呢? 只能依靠javascript模擬撤銷與重做了。網(wǎng)絡(luò)這方面的資源還是不少的,就不在此詳細(xì)說(shuō)明了 


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到編輯器頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
四虎www视频| 一区二区免费播放| 爱福利在线视频| 国产95在线|亚洲| 亚洲图区欧美| 尤物视频在线观看视频| 超碰91在线| 91超碰在线免费| 91caoporn在线| 国产系列电影在线播放网址| 国产激情在线视频| 四虎成人免费| 中文字幕亚洲精品视频| 精品视频一二区| 欧美精品一区二区三区免费| 五月婷婷丁香激情| 亚洲欧美日韩一区成人| 最好看更新中文字幕| 影音先锋在线中文字幕| 99热在线免费播放| 在线观看的网站你懂的| 国产精品一区二区婷婷| 精品美女调教视频| 天天av天天爱| 免费看av大片| 精品视频一二三| 高清色视频在线观看| 91极品在线| 国产色在线 com| 麻豆国产在线视频| 亚洲精品自产拍在线观看| 天堂资源在线中文| 国产又色又爽又黄刺激在线视频| 中文在线观看视频| 国产福利在线播放| 久久久久久久久久久久久91| 国产不卡在线| 国产极品一区二区三区| 国产精品国精产品一二| 国产无遮挡又黄又爽免费软件 | 国产一级黄色片免费| 亚洲一本大道| 精品国产白色丝袜高跟鞋| 2019中文字幕视频| 国产成人精品久久一区二区小说| 国产精选在线视频拍拍拍| 午夜影院免费看| 亚洲国产成人综合| av中文字幕在线看| 人人干人人插| 久久久久久久久亚洲精品| 狠狠操天天操夜夜操| 福利在线视频导航| 国产一起色一起爱| 国产福利一区二区在线精品| 国产高清大尺度一区二区不卡| 国产激情在线视频| 四虎影视成人永久免费观看视频| 在线播放www| 欧美国产中文| 国产午夜精品一区理论片| 在线91av| 精品偷拍激情视频在线观看| 阿v免费在线观看| 资源视频在线播放免费| 国产亚洲精品久久久久久移动网络 | 九色视频网站| 中文字幕免费中文| 91涩漫在线观看c| 麻豆视频在线观看免费网站| 国产小视频在线高清播放| 国产成+人+亚洲+欧美+综合| 91美女主播在线视频| 久久五月精品中文字幕| 91精品专区| 国产另类图片| 尤物在线精品视频| 最近中文字幕mv免费高清视频8| 精品全国在线一区二区| 天天操天天射天天插| av网站大全在线| 中文字幕一区二区三区免费视频| 精品国产免费第一区二区| 狠狠干天天爱| 日本韩国精品一区二区| 在线观看av中文| 国产高清在线观看| 欧美性猛交xxxx免费看蜜桃| 国产aa视频| 国产精品入口麻豆免费看| 欧美日韩在线资源| 中文在线视频| 国产www网站| 国产精品777一区二区| 国产网站免费观看| 国产网站麻豆精品视频| 国产免费av高清在线| 九九热视频免费观看| 欧美性xxxx交| 老司机精品视频一区二区| www.91在线播放| 欧洲亚洲精品视频| 日本一级理论片在线大全| av网站大全在线| 亚洲人在线播放| 亚洲图区综合| av中文网站| 欧美日韩综合高清一区二区| 牛牛热在线视频| 交换国产精品视频一区| 成网站在线观看人免费| 最新亚洲精品国自产在线观看| 中文字幕第一页av| 国产不卡视频| 午夜在线不卡| 激情六月丁香| 国产精品合集一区二区| 国产激情在线| 香蕉视频在线看| 激情小说 在线视频| 国产视频中文字幕在线观看| 在线一区观看| 国产原创在线播放| 69免费视频| 丁香花在线电影| 99在线欧洲视频| 国产美女免费观看| 国产福利在线播放麻豆| 欧美精品另类| 在线天堂中文| 天堂资源在线中文| 亚洲欧美国产另类首页| 国产精品一区二区三区四区色| 国产精品178页| 开心丁香婷婷深爱五月| 91在线最新| 国产香蕉在线| 欧美卡一卡二| 亚洲日本伊人| 99中文字幕一区| 国产视频97| 国产麻豆精品高清在线播放| 国产精品福利视频一区二区三区| 亚洲妇熟xxxx妇色黄| 国产日本视频| 天堂中文资源在线| 国内自拍视频在线看免费观看| 国产精品99999| 国产理论电影在线| 免费a在线观看| av在线免费观看网| 中文产幕区在线观看| 国产黄色网页| 国产黄色大片在线观看| **三级三级97片毛片| 国产美女在线一区二区三区| 免费的黄网站在线观看| 三级小说一区| 日本在线免费中文字幕| av免费在线一区二区三区| 国产经典三级在线| 精品美女在线观看视频在线观看 | 国产美女视频一区二区二三区| a视频在线看| 日本在线天堂| 久久99亚洲网美利坚合众国| 麻豆精品永久免费视频| 超碰在线观看免费| 国产自产视频| 国产三级视频在线| 69久久精品| 热99re久久精品精品免费| 麻豆av在线| 中文字幕毛片| 中文资源在线网| 亚洲电影视频在线| 国产综合视频一区二区三区免费| 成年网站免费入口在线观看| 非洲黑人最猛性xxxx交| 国产三级在线观看| 在线观看wwww| 国产乱妇乱子在线播视频播放网站 | 在线观看中文字幕| sese在线视频| 福利视频在线导航| 91美女主播在线视频| gogogo影视剧免费观看在线观看| 日本成a人片在线观看| 可以免费看污视频的网站| 国产一级黄色片免费| 亚洲欧美日韩一区成人| 国产自产视频| 在线观看电影av| 最近最好的中文字幕2019免费| 国产www在线观看| 国产理论电影在线观看| 亚洲第一成年免费网站| 国产激情视频一区二区三区| 黄色网页网址在线免费| 亚洲日本伊人|