用 js 的 selection range 操作選擇區域內容和圖片

来源:http://www.cnblogs.com/muge10/archive/2017/04/17/6723894.html
-Advertisement-
Play Games

用 js 的 selection range 方法操作選擇區域內容和圖片,實現選擇、刪除等操作。 ...


原創文章,轉載請註明出處並保留地址。原文地址:http://www.cnblogs.com/muge10/p/6723894.html

先放上最後的效果,這是點擊圖片以前:

這是點擊圖片以後:

非常清晰,一目瞭然,就算是小白用戶也明白髮生了什麼。挺好的。

 

 

最近在做編輯器相關的東西,遇到一個需求,用戶在編輯器中插入或者粘貼的圖片要支持點擊以後,可以按 Backspace 鍵或者 Delete 鍵刪除掉。

剛開始拿到這個需求的想法是調用編輯器自帶的刪除圖片方法刪掉圖片,但後來查看源碼發現這個方法是編輯器內部方法,並沒有暴露出來,於是第一個思路走不通了。

第二個思路是在編輯器的頂層容器里監聽 keyup 事件,然後判斷是否是兩個刪除鍵,如果是就攔截,然後找到當前點擊的圖片,手動刪掉。

實際上這也是行不通的,原因有二。首先,這個刪除是沒法阻止的,因為事件的監聽是在頂層父元素里,這時候阻止其實是阻止掉事件在頂層容器上的效果,而不是在發生元素上的效果。所有涉及到事件冒泡的地方,在父容器上阻止效果都是不能達到目的的,只能在事件最開始發生的元素上阻止。  

然後,當按下刪除鍵的時候,之前點擊的圖片已經不是點擊狀態了,已經拿不到了。因為取消選擇在前,刪除在後。

 

後來忽然意識到,想要的效果其實就是點擊圖片的時候選中圖片,就像用戶自己選中網頁中一段內容那樣選中那張圖片就好了。頁面上點擊一個圖片預設是沒有效果的,我要做的僅僅是點擊時候選中這個圖片就可以了。這樣做的好處是,當用戶點擊圖片選中以後,如果點刪除鍵,無論是 Backspace 還是 Delete 鍵都可以刪除;而且如果用戶不像刪除,直接點擊別的地方,或者按下上下左右箭頭就可以取消選擇,這和用戶平時的操作體驗是一樣的,根本沒有什麼副作用。

selection 是 HTML5 的新介面,是 window 的一個方法,用法是 window.getSelection().

取得 selection 以後,要把當前圖片加入到選取中,selection 有一個 Selection.selectAllChildren() 方法,但這個方法只能選中元素的全部子元素,而我們要選中的是 img 元素自身,img 元素也沒有子元素。於是繼續在 selection 的方法中看看有沒有別的長的像的方法,果然,找到了 Selection.addRange() 看這長相一看就很像我們要找的人。addRange 方法需要傳入一個 range 對象,range是啥呢?

平時在頁面上選擇東西都是滑鼠咔一下框一大片,但如果在編輯器里,其實是可以選擇好幾個片段的,一般按住 Ctrl / Control 鍵就可以多處選擇。我猜這個 selection 就類似於選中的所有區域,range 就類似於每一個單獨的選中的片段,先這麼理解。

繼續往下看,發現 range 有一個 Range.selectNode() 方法,這不正是我要找的人嗎?先創建一個 range 對象,let range = document.createRange()  createRange 是 document 的方法,然後講當前圖片插入 range,再把 range 插入 selection 中即可。代碼如下:

let checkClickImg = function(e) {
    let target = e.target;
    
    if (target.nodeName.toLowerCase() === 'img') {
        // 刪除之前所有的選區
        window.getSelection().removeAllRanges();

        let selection = window.getSelection();
        let range = document.createRange();
        
        range.selectNode(target);
        selection.addRange(range);
    }
}

這個實現方法的最大優點在於利用瀏覽器原生自帶的功能,這樣就和用戶的操作習慣保持一致,不會有任何的突兀。選中的效果很明顯,而且選中以後無論是刪除,還是取消,都跟之前習慣一致,都很容易,更要的是這些操作不用再寫代碼了啊,因為是瀏覽器原生自帶的功能。

嗯,算是比較完美了。

 

 

水平有限,如果您發現什麼錯誤或者有別的更好的方法,還請指出,謝謝。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SVN
    [1]安裝 [2]配置 [3]基本操作 [4]協作 [5]常見問題 ...
  • 前言:這是筆者學習之後自己的理解與整理。如果有錯誤或者疑問的地方,請大家指正,我會持續更新! 元素節點 元素節點就是HTML標簽元素,元素節點主要提供了對元素標簽名、子節點及屬性的訪問; 元素節點的三個node屬性:nodeType:1、nodeName/TagName:元素的標簽名大寫、nodeV ...
  • (1)window對象 彈塊的方法 提示塊: window.alert("提示信息"); Code: var res = alert("xxx"); alert(res); Code: var res = alert("xxx"); alert(res); 確認塊: window.confirm(" ...
  • $.each()與$(selector).each()不同, 後者專用於jquery對象的遍歷, 前者可用於遍歷任何的集 合(無論是數組或對象),如果是數組,回調函數每次傳入數組的索引和對應的值(值亦可以通過this 關鍵字獲取,但javascript總會包裝this 值作為一個對象—儘管是一個字元 ...
  • 描述 使用ArcGIS Server 幾何服務(geometry service)來對繪製在地圖上的圖形生成緩衝區。幾何服務能夠在基於瀏覽器的應用程式中執行緩衝操作(buffering),投影要素(project feature),計算可測量值。 利用幾何服務創建緩衝區之前,需創建一個 (緩衝參數) ...
  • 這幾天在學jQuery,本身還只是一個新手,寫了一個簡單的動畫——圓形頭像的縮放。本身是用Firefox進行調試的,一切進行的很順利,縮放可以按照預期執行,結果拿到IE上去之後,發現縮放動畫失效了。後來百度了一些東西都沒有找到關鍵所在,最後Google一下,找到了很多實用的解決方法,現在在這裡總結一 ...
  • Bulma 是一個基於 Flexbox 的現代化的 CSS 框架,設計的初衷就是移動優先(Mobile First),模塊化設計,可以輕鬆用來實現各種簡單或者複製的內容佈局,瀏覽器支持:Chrome、Edge、Firefox、Internet Explorer (10+)、Opera 以及 Safa... ...
  • 任務一:零基礎HTML編碼 課程概述 作業提交截止時間:04-24 重要說明 百度前端技術學院的課程任務是由百度前端工程師專為對前端不同掌握程度的同學設計。我們儘力保證課程內容的質量以及學習難度的合理性,但即使如此,真正決定課程效果的,還是你的每一次思考和實踐。 課程多數題目的解決方案都不是唯一的, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...