contenteditable 是html中的一個屬性,在HTML中,某些元素設置 contenteditable='true'  屬性時可以開啟該元素的編輯模式,contenteditable 可以讓div 或整個網頁,或者span等等元素設置為可寫,我們最常用的是 input 、textarea 文本輸入元素來輸入內容,但這些也只能夠輸入純文本,而 contenteditable 開啟後能夠輸入html內容。

如果想在整個網頁可編輯,請在 body 標籤內設置 contenteditable

contenteditable 已在 html5 標準中得到有效的支持

  使用方法:

  <div contenteditable='true'></div>

  HTML5 中的解釋與規定:

contenteditable是一個枚舉類型的屬性,可供選擇的值有空字符串、 true、 false 或 inherit (默認) 。
當為空字符串時,效果和true一致。
當一個元素的 contenteditable 狀態為 true (contenteditable 屬性為空字符串,或為true,或為inherit且其父元素狀態為true)時,意味著該元素是可編輯的。否則該元素不可編輯。 
注意:HTML5 與 HTML4的不同,對於contenteditable HTML5 是趨於xhtml,使用的是全小寫 contenteditable,而 HTML4使用的是 contentEditable
 
在最近的一次網站開發的過程中,有一個頁面需要給用戶填寫一些要提交的文本信息,剛開始的時候是用 textarea ,功能就需要讓用戶可以插入圖片,若只是填寫純文本。textarea 已經可以做到,但是現在是要用戶能夠上傳圖片並且插入編輯框 ,剛開始的思路是用一個iframe把圖片上傳了,當用戶點擊確定的時候,。獲取裏面已經上傳的圖片地址。然後用文本的格式做個標識添加到 textarea 裏面,像 [iamges:http://....jpg/] ,點擊取消的時候就用 ajax 把圖片地址傳到 php 將這些圖片從服務器端刪除。基本的思路簡單明了,但是我該怎麼去獲取到要插入文本的位置呢,於是我查找相關資料,查到後我把文章轉到了我的博客裏面:http://www.cnblogs.com/helin/p/3401810.html
似乎離我想要的效果越來越近了,不過後來發現如果是這樣的方式去實現的話,有兩個缺點,一是用戶體驗不好,用戶當然想直接就在文本框裏面顯示,這樣好排版還有操作,看起來也好,若就一條標識字符串。很容易就被截開幾段在中間再插入內容。這樣一來,到時候顯示就成問題了。第二個就是 textarea默認不是自適應高度的,。也就是說你如果內容一多了,。文本框不會往下拉,那就會出現滾動條,看起來也不好看,想要自適應,用js去實現也不是不可以,但有沒有更好的辦法呢。既能直接插入html內容,。又可以自適應高度,我不需要像文本編輯器那些一樣,功能那麼的強大。我只要一個最最最簡單的,可以插入圖片,可以自適應高度就可以了,。於是又要一輪的搜索資料了,不料印象中記得html 元素有個屬性是可以讓元素開啟編輯模式的,然後到QQ空間裏面查看了一下人家的是怎麼做到插入圖片的,讓我記起來了,contenteditable 這個屬性,哈哈,這樣太好了,這是一個好的開始,。那現在的問題就是把textarea 用一個元素替換,再設置一下 contenteditable 屬性,我選擇了div,給它設置了一個最小高度。
現在就可 以直接把上傳好返回的圖片地址或者加進來的遠程的圖片地址直接封閉成html的形式插入到編輯框裏面了。但是div在可編輯狀態下面並不能像textarea 那樣子獲取到編輯框的焦點到底在哪個位置上面,此時,我用到了一個 javascript 裏面的 execCommand 方法,這個方法的一些說明在我的博客:http://www.cnblogs.com/helin/p/3433357.html
document.execCommand('InsertImage', false,imgsrc);

  現在開始有點樣子了,但是除了圖片還有一些基本的排版的html標籤之外,我不想用戶過多的插入一些其他的html。例如字體加粗,下劃線等,也就是雖然我沒有給用戶提供更多的操作這些功能的按鈕,但是防止不了用戶去複製別人的html,然後粘貼進來,所以我要想辦法做一些過濾,這時候我應該要監聽粘貼命令:

if(divEdit.addEventListener){
divEdit.addEventListener("paste",pasteFilter,false);
}else{//IE
divEdit.attachEvent("onpaste",pasteFilter);
}

  一但有這個操作,我就要確保在內容粘貼出來前或者後進行一些處理:

function pasteFilter(){
var clipb = event.clipboardData || window.clipboardData;
try{
var cHtml = clipb.getData('text/html');
cHtml = HtmlFilter(cHtml);
document.execCommand('inserthtml', false,cHtml);
event.preventDefault;
event.returnValue = false;
}catch(e){//IE下面的操作
setTimeout(function(){editDiv.innerHTML = HtmlFilter(editDiv.innerHTML);},1);
}
}

  上面這一步我有分了兩部分,在ie外的其他瀏覽器下面,(當然我只測試過firefox,chrome)try裏面適合不是ie瀏覽器下面的,因為在ie下面javascript 的 clipboardData 對象的 getData方法裏面不支持 text/html ,只支持text ,而且在ie下面,也不支持 execCommand 裏面的inserthtml 參數, 所以在我沒有找到其他更好辦法之前,我也只能做這樣的處理,ie下面我用到了setTimeout的方法,原理就是在粘貼數據的那一刻,同時執行HtmlFilter這個方法,對編輯框裏面的html作過濾,這個方法有不好之處就是當粘貼那一刻,用戶是能看到粘貼過來的樣式等等效果的,只不過以最快的速度再一次將編輯框裏面的內容用js去進行一遍的過濾罷了,這方法雖然不好,但基本能達到我現在想要的要求。

function HtmlFilter(html){
html = html.replace(/(style|class|id)[=\s]+?".*?"/ig,'');
html = html.replace(/<\!--(Start|End)Fragment-->/ig,'');
return html;
}

  當然,用js過濾一遍,這只不過適合於大多數的情況下,若用戶提交了沒有經過過濾的html內容,這時候,也只能夠在服務器端進行最終的過濾了。

  

html contenteditable的更多相关文章

  1. IOS中div contenteditable=true无法输入

    在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...

  2. 苹果手机IOS中div contenteditable=true 仿文本域无法输入编辑

    问题: 在苹果手机IOS中 contenteditable="true" 做文本域输入,点击可以弹出键盘但是无法输入,安卓都正常. 经测试后,记得加一个样式 -webkit-use ...

  3. H5之contenteditable

    场景: <div id='content' contenteditable='true' > hello </div> <button id='caret'>设置光 ...

  4. contentEditable属性设置是否可编辑元素的内容

    在HTML5中在标签新添加了一个属性contentEditable可以设置标签内的内容是否可以编辑: 设置contenteditable="true"标签内的元素(内容)可以编辑 ...

  5. contenteditable

    http://www.w3school.com.cn/tags/att_global_contenteditable.asp 做编辑器经常用这个属性 使得整个编辑区域所见所得 http://www.c ...

  6. div contenteditable placeholder

    contenteditable型的编辑框,实现placeholder的方式有两种 第一种,Css的实现方式: <!DOCTYPE html> <html lang="en& ...

  7. div的contenteditable和placeholder蹦出的火花

    今天在做手机端发布描述内容时,需要实现换行,还需要有plachholder. 在文本框中换行自然想到了textarea. 问题似乎已经解决了,但是当内容发布后,在html中显示换行都丢失了. 这个时候 ...

  8. Text selection in div(contenteditable) when double click

    背景: 在最近项目中,碰到一个问题:有一个可编辑的div需要双击时可编辑,blur或者回车时将编辑结果保存.你可能注意到双击时,文字会被选中,可编辑区域不会focus到光标位置.考虑到兼容性问题,写了 ...

  9. contenteditable 属性

    定义和用法 contenteditable 属性规定是否可编辑元素的内容. 语法 <element contenteditable="value"> 属性值 值 描述 ...

随机推荐

  1. JS 打字机效果

    请点我,查看效果 我送过你礼物 试过对你不管不顾 我挂过你电话 也曾为你哭到沙哑 我曾经为你去学做过晚餐 曾觉得你的关心太烦 也曾为你起得很早 试过狠心把你甩掉 试过偷偷拍你的微笑 也曾经把你电话删掉 ...

  2. HTML5有语义的内联元素详解

    HTML5有语义的内联元素详解 time标签 time 元素表示一个时间值,比如 5:35 P.M., EST, April 23, 2007.例如: Example Source Code:< ...

  3. jquery 自定义tab

    <!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11.1.min.js&qu ...

  4. 内存映射+远线程 调用游戏CALL

    源码中 用到的结构和未公开函数 请到 http://www.cnblogs.com/IMyLife/p/4826286.html 获取 HANDLE ProcessHandle=NULL; DWORD ...

  5. Objective-c之NSCopying

    Objective-c之NSCopying     copy的原理: 执行<NSCopying>协议,类中必须实现copyWithZone:方法响应的copy消息. copy消息将发送co ...

  6. 【Linux】基础配置-修改命令提示符的风格

    1,效果图: [groot]$ 2,设置步骤: 编辑~/.bashrc文件,在最后增加设置行: #显示当面目录的最后一层目录#PS1='\[\e[32m\][\u@\h \W]$\[\e[m\]'#只 ...

  7. Google为何这么屌

    概述: 在移动市场上,从来没有一个公司像Google一样的玩法,以后可能也不会有.因为这根本就不是一个商业模式.它可以调动极大的资源而几乎没有盈利压力,它力逾千钧又身段灵活.它从来不尊重这个市场原有的 ...

  8. 【Java】java的内存浅析

    一.闲谈下 201407月记着那时候身体垮了下来,呵呵.想说,对自己的说,也是对大家的负责吧.那时候胸疼胸闷,然后几乎累垮了,我还坚持了一星期,那一星期真的迷迷糊糊.完全不能看代码,看代码就晕.一直想 ...

  9. AltiumDesigner导入AutoCAD文件DXF,DWG格式

    最近有个朋友给了个AutoCAD的文件,需要我画个板子,结构什么的参见AutoCAD的文件,百度了下,得知protel是可以导入AutoCAD的DXF,DWG格式的文件的,那么AltiumDesign ...

  10. bcb 如何在DLL中捕捉系统级异常

    http://topic.csdn.net/t/20031023/09/2385627.html -------------------------------------------------- ...