亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網(wǎng)站 > 軟件應(yīng)用 > 正文

javascript開發(fā)隨筆3 開發(fā)iframe富文本編輯器的一點體會

2024-09-06 19:16:51
字體:
供稿:網(wǎng)友
就把遇到的問題記錄一下。寫這篇文章時用的TinyMCE編輯器就很強大,但畢竟是第三方的,項目也考慮了這些,如果做些自定義的東西不太方便。
1. 判斷光標位置的元素(或者選中的部分)的樣式。光標位置改變的時候更新工具欄對應(yīng)按鈕的樣式。什么情況下光標的位置會改變呢?是鍵盤方向鍵和鼠標點擊,于是就判斷鍵盤事件和鼠標事件來執(zhí)行光標移動的處理。
a. 獲得光標位置或選中元素:首先getSelection,創(chuàng)建range。然后獲得元素,獲取到元素之后就可以或得樣式、tagName等等,做更多的操作,運行代碼:
復(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;
}
//當光標位置改變時候執(zhí)行
var onselectionchange = function(event){
var e = event || window.event;
if(!e.keyCode)e.keyCode = e.which;
//方向鍵移動光標,獲取光標位置的dom
if((e.keyCode >= 37 && e.keyCode <= 40 )|| e.type == "click"){

var node = getRange().node;//獲取光標位置元素
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不能保持光標位置,這個是在添加超鏈接時候出現(xiàn)的問題,當不使用瀏覽器內(nèi)置的輸入框,光標移動其他的文本域里,ie會失去所選中的部分,無法對選中的部分加鏈接了,解決辦法就是:利用range的getBookmark和moveToBookmark,然后給iframe的document綁定onbeforedeactivate(getBookmark)、onactivate(moveTo),這2個事件的大致意思就是,當被激活和失去激活狀態(tài)。增加事件之后,就不必保存lastRang或者再其他地方設(shè)置bookmark了,可以讓ie像其他瀏覽器一樣自動保持光標位置了
復(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中的撤銷與重做 。 當iframe外部有彈出窗口、或者修改html撤銷、重做功能將失效。只能歸為ie的bug了。。。。也許ie沒分清iframe和頁面的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="點擊下,ie將無法撤銷、重做" />
<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將無法撤銷、重做';
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;
}
//當光標位置改變時候執(zhí)行
var onselectionchange = function(event){
var e = event || window.event;
if(!e.keyCode)e.keyCode = e.which;
//方向鍵移動光標,獲取光標位置的dom
if((e.keyCode >= 37 && e.keyCode <= 40 )|| e.type == "click"){
var node = getRange().node;//獲取光標位置元素
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ò)這方面的資源還是不少的,就不在此詳細說明了
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产欧美va欧美va香蕉在线| 天堂中文在线播放| 日本黄色的视频| 含羞草www国产在线视频| 久久99久久人婷婷精品综合| gogogo影视剧免费观看在线观看| 欧美一级片免费在线观看| 7m第一福利500精品视频| 国产又大又黄又粗的视频| 欧美成人性网| 国产精品999999| 午夜av在线播放| 成人中文视频| 亚洲欧美日韩国产综合精品二区| 久久三级视频| 无遮挡在线观看| 欧美亚洲国产一区二区三区va| 亚洲精品影院在线| 亚洲一级特黄| 美女网站在线看| 在线观看亚洲a| 日产乱码一卡二卡三免费| 国产精品电影观看| 一区二区三区在线观看www| 最近久乱中文字幕| 91av在线影院| 日本精品久久电影| 无码人妻精品一区二区中文| 久草在线免费资源站| av播放在线| 日本韩国精品一区二区在线观看| 无码免费一区二区三区| 神马一区二区三区| 69看片网站| 日韩你懂的电影在线观看| 男人的天堂视频在线| 久久99国产精品尤物| 久久免费99精品久久久久久| 欧美日韩在线直播| 台湾佬中文在线| 久久大逼视频| 成人丝袜18视频在线观看| 欧美性感一类影片在线播放| 致1999电视剧免费观看策驰影院| 精品毛片一区二区三区| 91亚洲va在线va天堂va国| 欧美综合在线观看视频| av男人天堂av| 公侵犯人妻一区二区三区| 男人添女人下面免费视频| 69xx绿帽三人行| 牛夜精品久久久久久久99黑人| 亚洲91精品在线观看| 久久久国产精华液999999| 成人观看免费视频| 先锋影音中文字幕| 人人精品人人爱| 中国国产一级毛片| 欧美96在线| 日韩av官网| 制服丝袜第二页| 精品一区二区三区四区五区六区| 亚洲一区二区激情| 久草亚洲一区| 国产激情一区二区三区在线观看| 最新成人av在线| 羞羞答答成人影院www| 国产精品成人免费观看| 日韩欧美精品三级| 成人国产一区| 久久久成人的性感天堂| 欧美日韩国产精品一区二区三区四区| 日韩欧美手机在线| 九九热精品视频在线| 中文字幕av一区中文字幕天堂| 91精品国产综合久久香蕉的特点| 久久天堂成人| 色欲av无码一区二区人妻| 精品成人免费视频| 亚洲国产高清一区二区三区| 婷婷免费在线观看| 久久婷婷国产综合精品青草| 日本a在线免费观看| 亚洲精品**中文毛片| 欧美亚洲三级| 成人3d动漫一区二区三区91| 91视频免费观看| 亚洲永久精品大片| 高清日韩电视剧大全免费| 精品亚洲va在线va天堂资源站| 国产精品免费精品一区| 午夜精品一区二区三区视频| 欧美成人免费高清视频| 日韩成人精品一区二区三区| 亚洲精品国产品国语在线app| 国产成人三级视频| 国产人伦精品一区二区| 青春草视频在线| 精品一区二区三孕妇视频| 亚洲开心激情| 黄色网页在线免费观看| 国产精品视频一区二区久久| 日本免费新一区视频| 亚洲国产激情一区二区三区| 国产一区二区在线视频观看| 奇米一区二区三区av| 国产男女猛烈无遮挡免费视频| 久久午夜电影| 欧美精品久久99久久在免费线| 老司机精品视频一区二区三区| 色综合天天视频在线观看| 在线观看av网站永久| 亚洲人a成www在线影院| 在线影音av| 六月婷婷激情综合| 337p亚洲精品色噜噜狠狠p| 性欧美freesex顶级少妇| 国产精品v亚洲精品v日韩精品| 久久久噜噜噜久噜久久| 日本三级很黄试看120秒| 亚洲国产欧美一区二区丝袜黑人| 国产精品亚洲视频| 国产日韩亚洲欧美综合| 欧美另类videos粗暴黑人| 亚洲成年人专区| 亚洲人成在线观看一区二区| 国产精品免费在线免费| 成人深夜福利app| 99精品国产一区二区三区2021| 91精品免费在线观看| 九九热播视频在线精品6| 91在线网址| 色av男人的天堂免费在线| 俺去俺来也在线www色官网| 黄色一级片视频| 欧美日韩一区二区三区免费看| 黑人巨大国产9丨视频| 欧美日韩在线高清| ...av二区三区久久精品| 天天干在线播放| 不卡视频一二三四| yiren22亚洲综合伊人22| 四虎4545www精品视频| 色婷婷国产精品综合在线观看| 亚洲国产中文字幕在线观看| 99精品国产高清在线观看| 天干天干啦夜天干天2019| jizzjizz亚洲| av免费在线一区| 国产a久久麻豆| 国产在线精品播放| 人妻中文字幕一区| h网站免费观看| 日韩激情视频在线观看| 久久综合成人精品亚洲另类欧美| 久草在线免费福利| 国产精品久久久久久久av| 91成人网在线观看| 日本道精品一区二区三区| 国产精品资源网站| h小视频在线观看网| 日韩电影中文字幕在线| 亚洲精品国产一区二区在线| 337p粉嫩大胆噜噜噜噜噜91av| 国产午夜精品在线观看| 亚洲人成网站在线播放2019| caoporen国产精品视频| 亚洲欧美一二三区| 精品少妇爆乳无码av无码专区| 日韩一级片免费看| 黑人精品一区二区三区| 高清1区2区| 超碰成人免费在线| jazzjazz国产精品麻豆| 亚洲成av人影院在线观看网| 国产伦精品一区二区三区视频青涩| 成人亚洲在线观看| 97视频资源在线观看| 国产精品偷伦免费视频观看的| 私人高清影院 强乱中文字| 97超碰国产精品| 精品无人区乱码1区2区3区在线| 无码国产精品一区二区色情男同| 一级日韩一级欧美| 亚洲自拍欧美精品| 亚洲欧美久久234| 国产国产一区| 在线看黄色网| 免费成人av在线播放| 亚洲另类av| 国产精品96久久久久久又黄又硬| 亚洲欧洲精品在线| 国产精品美女在线观看直播| 久久久久久久久久久久久av| 国严精品久久久久久亚洲影视| 日韩影院二区| 成人h动漫精品一区二区| 一级特黄特色的免费大片视频| 色呦呦在线看| 色偷偷久久人人79超碰人人澡| 亚洲做受高潮无遮挡| 日本少妇精品亚洲第一区| 亚洲天堂av一区| 黄色亚洲在线| 国产福利小视频| 亚洲欧美精品中文第三| 亚洲欧美视频二区| 黄色一级大片在线免费看国产一| 五十路在线视频| 婷婷亚洲天堂| 久久一区二区三区视频| 在线观看视频网站你懂得| 热99精品只有里视频精品| 麻豆传传媒久久久爱| 亚洲精品日韩一| 美女被黑人40厘米进入| 午夜精品久久久久久久男人的天堂| 蜜臀国产一区二区三区在线播放| 国产精品国产高清国产| 国产成人va亚洲电影| 麻豆一区在线观看| 日韩一区二区在线播放| 久草网在线视频| 欧美在线免费观看亚洲| 国产农村妇女aaaaa视频| 羞羞的视频网站| 你懂的国产在线| 凹凸日日摸日日碰夜夜爽1| 99精品小视频| 久久久久亚洲av片无码下载蜜桃| 午夜婷婷国产麻豆精品| 欧美日韩精品一区二区三区在线观看| 99综合在线| 欧美日韩中文在线观看| 国产精品美女一区二区三区| 精品成人在线视频| 国产99久久久| 日韩久久免费电影| 亚洲精品一二三| 欧美成人艳星乳罩| 中文字幕人成不卡一区| 国产专区精品视频| 可以免费观看的黄色网址| 亚洲福利视频免费观看| 欧美在线视频a| 亚洲成人一区二区在线观看| xfplay先锋影音夜色资源站| 午夜av免费观看| 日本久久91av| 日韩欧美一区二区三区| 91国在线精品国内播放| 黄色网战在线观看| 国产精品对白| 欧美日韩免费观看中文| 久久色视频免费观看| 美女激情福利视频在线观看| 久久一区二区中文字幕| 欧美中文字幕第一页| 久久精品国产一区二区电影| 国产精品欧美亚洲| 欧美一区二区精品久久911| 日韩电影免费在线看| 在线观看免费视频污| 亚洲图片在线观看| 国产一区精品在线| 最新国产乱人伦偷精品免费网站| 一区二区乱子伦在线播放| 亚洲成人福利视频| av女人的天堂| 亚洲精品网站在线播放gif| 国产乱对白刺激视频不卡| 在线观看成人av| 91国内精品白嫩初高生| 日本在线三级| 手机看片福利盒子久久| 高清美女视频一区| 日本福利一区二区| 久久久久亚洲综合| 性猛交ⅹ×××乱大交| 精品自拍一区| 欧美在线999| 亚洲一区二区三区午夜| 717成人午夜免费福利电影| 老司机精品久久| 午夜av入18在线| 免费毛片在线| 青青草97国产精品免费观看| 国产九色porn网址| 国产精品一区二区精品| www.久久热.com| 成人拍拍拍免费视频网站| 国产精品日韩一区二区| 午夜精品免费在线| 国产日韩精品一区二区三区在线| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美色涩在线第一页| 亚洲成av人片在线观看香蕉| 久久精视频免费在线久久完整在线看| 美女一区二区视频| 日本欧美视频在线观看| 成人精品福利视频| 99精品热视频只有精品10| 亚洲人免费视频| 国产婷婷色一区二区三区在线| 91成人噜噜噜在线播放| 欧美高清视频一区二区三区| 亚洲国产精品成人综合| 神马久久久久久久久| 国产网站一区二区三区| 一区二区三区在线观看免费| 粉嫩av一区二区| 亚洲人成电影网站色mp4| 色呦呦视频在线观看| 800av在线播放| 久久亚洲精品中文字幕蜜潮电影| 久久精品国产亚洲AV无码麻豆| 久久久久女人精品毛片九一| 狠狠操夜夜操| 五月天电影免费在线观看一区| 中文在线观看视频| 一区二区三区 日韩| 中文综合在线观看| 日韩av一卡二卡三卡| 日韩欧美在线观看一区二区| 黄网站在线观看永久免费| 亚洲乱码国产乱码精品天美传媒| 亚洲大胆视频| 中文字幕xxxx|