首頁 web前端 html教學 html規定元素內容是否可編輯的屬性contenteditable

html規定元素內容是否可編輯的屬性contenteditable

Nov 03, 2017 am 10:04 AM
html 內容

實例

一段可編輯的段落:

<p contenteditable="true">这是一个可编辑的段落。</p>
登入後複製

瀏覽器支援


IE

Firefox

Chrome

Safari

Opera


#所有主流瀏覽器都支援contenteditable 屬性#。

定義和用法

contenteditable 屬性規定元素內容是否可編輯。

註解:如果元素未設定 contenteditable 屬性,那麼元素會從其父元素繼承該屬性。

HTML 4.01 與 HTML5 之間的差異

contenteditable 屬性是 HTML5 中的新屬性。

語法

<element contenteditable="true|false">
登入後複製

屬性值

#值描述
true規定元素可編輯。
false規定元素不可編輯。

在HTML裡面,遊標就是一個對象,而遊標對像是只有當你選取某個元素的時候才會出現的。

當我們去點擊一個輸入框的時候,實際上它會產生一個選取物件-selection(就是我們可以看到的文字變成藍色的那個區域),selection在火狐瀏覽器可以直接用window.getSelection()獲取,在HTML裡面,selection只有一個的,並且selection是一個區域,你可以想像成一個長方形,它是有開始和結束的

#當你點擊一個輸入框,或是你切換到別的輸入框,selection是會跟著變化的。遊標就是在selection裡面,遊標叫做range,是一個片段區域,和selection一樣,有開始點,和結束點,當我們對文字按下左鍵向右拉的時候,就看到了文字變成藍色,那就是遊標的開始和結束,當我們直接點一下的時候,遊標在閃,其實只是開始和結束點重疊了。

OK,現在我們來實際操作遊標了。直接看完整的程式碼,然後看效果吧。

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title></title>
    <style>#edit{height:500px;width:500px;border:1px solid red;}</style></head><body>
    <div id="edit" contenteditable></div>
    <input type="text" id="emojiInput">
    <button id="sendEmoji">发送表情</button>

    <script>
        var sendEmoji = document.getElementById(&#39;sendEmoji&#39;)        // 定义最后光标对象
        var lastEditRange;        // 编辑框点击事件
        document.getElementById(&#39;edit&#39;).onclick = function() {            // 获取选定对象
            var selection = getSelection()            // 设置最后光标对象
            lastEditRange = selection.getRangeAt(0)
        }        // 编辑框按键弹起事件
        document.getElementById(&#39;edit&#39;).onkeyup = function() {            // 获取选定对象
            var selection = getSelection()            // 设置最后光标对象
            lastEditRange = selection.getRangeAt(0)
        }        // 表情点击事件
        document.getElementById(&#39;sendEmoji&#39;).onclick = function() {            // 获取编辑框对象
            var edit = document.getElementById(&#39;edit&#39;)            // 获取输入框对象
            var emojiInput = document.getElementById(&#39;emojiInput&#39;)            // 编辑框设置焦点
            edit.focus()            // 获取选定对象
            var selection = getSelection()            // 判断是否有最后光标对象存在
            if (lastEditRange) {                // 存在最后光标对象,选定对象清除所有光标并添加最后光标还原之前的状态
                selection.removeAllRanges()
                selection.addRange(lastEditRange)
            }            // 判断选定对象范围是编辑框还是文本节点
            if (selection.anchorNode.nodeName != &#39;#text&#39;) {                // 如果是编辑框范围。则创建表情文本节点进行插入
                var emojiText = document.createTextNode(emojiInput.value)                
                if (edit.childNodes.length > 0) {                    // 如果文本框的子元素大于0,则表示有其他元素,则按照位置插入表情节点
                    for (var i = 0; i < edit.childNodes.length; i++) {                        if (i == selection.anchorOffset) {
                            edit.insertBefore(emojiText, edit.childNodes[i])
                        }
                    }
                } else {                    // 否则直接插入一个表情元素
                    edit.appendChild(emojiText)
                }                // 创建新的光标对象
                var range = document.createRange()                // 光标对象的范围界定为新建的表情节点
                range.selectNodeContents(emojiText)                // 光标位置定位在表情节点的最大长度
                range.setStart(emojiText, emojiText.length)                // 使光标开始和光标结束重叠
                range.collapse(true)                // 清除选定对象的所有光标对象
                selection.removeAllRanges()                // 插入新的光标对象
                selection.addRange(range)
            } else {                // 如果是文本节点则先获取光标对象
                var range = selection.getRangeAt(0)                // 获取光标对象的范围界定对象,一般就是textNode对象
                var textNode = range.startContainer;                // 获取光标位置
                var rangeStartOffset = range.startOffset;                // 文本节点在光标位置处插入新的表情内容
                textNode.insertData(rangeStartOffset, emojiInput.value)                // 光标移动到到原来的位置加上新内容的长度
                range.setStart(textNode, rangeStartOffset + emojiInput.value.length)                // 光标开始和光标结束重叠
                range.collapse(true)                // 清除选定对象的所有光标对象
                selection.removeAllRanges()                // 插入新的光标对象
                selection.addRange(range)
            }            // 无论如何都要记录最后光标对象
            lastEditRange = selection.getRangeAt(0)
        }    </script></body></html>
登入後複製


#

以上是html規定元素內容是否可編輯的屬性contenteditable的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

See all articles