主頁(yè) > 知識(shí)庫(kù) > javascript開(kāi)發(fā)隨筆3 開(kāi)發(fā)iframe富文本編輯器的一點(diǎn)體會(huì)

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

熱門(mén)標(biāo)簽:長(zhǎng)春銷售外呼系統(tǒng)業(yè)務(wù) 興化400電話辦理多少錢(qián) 株洲外呼營(yíng)銷系統(tǒng)有哪些 靈聲智能電話機(jī)器人招聘 天津電銷卡外呼系統(tǒng)線路 長(zhǎng)春防封卡電銷卡套餐 企業(yè)電話機(jī)器人辦理 智能電銷機(jī)器人真的好嗎 四平電話機(jī)器人哪家好
就把遇到的問(wèn)題記錄一下。寫(xiě)這篇文章時(shí)用的TinyMCE編輯器就很強(qiáng)大,但畢竟是第三方的,項(xiàng)目也考慮了這些,如果做些自定義的東西不太方便。
1. 判斷光標(biāo)位置的元素(或者選中的部分)的樣式。光標(biāo)位置改變的時(shí)候更新工具欄對(duì)應(yīng)按鈕的樣式。什么情況下光標(biāo)的位置會(huì)改變呢?是鍵盤(pán)方向鍵和鼠標(biāo)點(diǎn)擊,于是就判斷鍵盤(pá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ō)明了
您可能感興趣的文章:
  • nodejs后臺(tái)集成ueditor富文本編輯器的實(shí)例
  • Vue.js結(jié)合Ueditor富文本編輯器的實(shí)例代碼
  • Javascript實(shí)現(xiàn)簡(jiǎn)單的富文本編輯器附演示
  • 學(xué)習(xí)js在線html(富文本,所見(jiàn)即所得)編輯器
  • 19款Javascript富文本網(wǎng)頁(yè)編輯器
  • 不到200行 JavaScript 代碼實(shí)現(xiàn)富文本編輯器的方法

標(biāo)簽:石嘴山 運(yùn)城 貴港 青海 黑龍江 漯河 巴彥淖爾 新疆

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《javascript開(kāi)發(fā)隨筆3 開(kāi)發(fā)iframe富文本編輯器的一點(diǎn)體會(huì)》,本文關(guān)鍵詞  javascript,開(kāi)發(fā),隨筆,iframe,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《javascript開(kāi)發(fā)隨筆3 開(kāi)發(fā)iframe富文本編輯器的一點(diǎn)體會(huì)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于javascript開(kāi)發(fā)隨筆3 開(kāi)發(fā)iframe富文本編輯器的一點(diǎn)體會(huì)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章