如何使 highchart圖表標題文字可選擇複製

来源:https://www.cnblogs.com/imwtr/archive/2019/06/21/11066595.html
-Advertisement-
Play Games

highchart圖表的一個常見問題是不能複製文字 比如官網的某個圖表例子,文字不能選擇,也無法複製,有時產品會抓狂... 本文給出一個簡單的方案,包括一些解決的思路,希望能幫助到有需要的人 初期想了蠻久也搜了蠻多,沒搜到,找到的結論是圖表使用的是svg實現,必然無法選擇文字,似乎是個死問題,已經瀕 ...


highchart圖表的一個常見問題是不能複製文字

比如官網的某個圖表例子,文字不能選擇,也無法複製,有時產品會抓狂...

本文給出一個簡單的方案,包括一些解決的思路,希望能幫助到有需要的人

 

 

初期想了蠻久也搜了蠻多,沒搜到,找到的結論是圖表使用的是svg實現,必然無法選擇文字,似乎是個死問題,已經瀕臨放棄

不過後來又看到一篇討論,其實svg裡面的文字是可以選擇複製的

頓時信心又來了,展開了新一輪思考

 

 

思考一:可能是姿勢不對

試試把標題配成 useHTML: true ,使用普通元素渲染,結果還是無法選

 

 

 

看看DOM結構,實際上已經和svg無關了

思考二:會不會是設置了某些樣式呢

跟選擇複製有關的也就這倆了,直接賦上去,還是無效

思考三:會不會是有事件影響,取消了點擊選擇效果呢

為了測試的簡便與純粹性,最好直接使用官方提供的簡單例子

查看元素對應的事件列表,有幾個需要關註

選擇highchart.js ,跳的不准呀,代碼混淆之後貌似chrome的跳轉一致都不太可靠了

思考四:什麼js東西使得點擊選擇無效呢

可能是事件禁止了冒泡 stopPropagation,或者是取消了元素的事件預設處理機制 preventDefault

一搜,發現前者沒找到,而後者有多處

定位到一個 mouseDown事件觸發的位置,柳暗花明的感覺

試了一下可以發現,上下兩處是關鍵點,直接造成文字選擇功能失效了(當然這可能是作者的本意)

接下來就是驗證環節,把這文件下下來本地,改好後(註釋那倆地方)用Fiddler的文件映射功能,替換這個例子中的 highchart.js,妥妥的可以進行選擇複製

 

思考五:如何運用在業務代碼中?

在vue中使用的是npm的包管理,所以肯定不能直接改源代碼,可選的一個方案是覆蓋源代碼,即覆蓋這兩個方法

    import Highcharts from "highcharts";

    // 重寫Highcharts事件處理,使得內容可選擇複製
    Highcharts.Pointer.prototype.onContainerMouseDown = function(a) {
        a = this.normalize(a);
        2 !== a.button && (this.zoomOption(a),
        // a.preventDefault && a.preventDefault(),
        this.dragStart(a))
    };

    Highcharts.Pointer.prototype.onContainerMouseMove = function(b) {
        // 整理變數
        let a = Highcharts;
        let B = Highcharts.charts;
        let q = function(a) {
            return "undefined" !== typeof a && null !== a
        };

        var c = this.chart;
        q(a.hoverChartIndex) && B[a.hoverChartIndex] && B[a.hoverChartIndex].mouseIsDown || (a.hoverChartIndex = c.index);
        b = this.normalize(b);
        // b.preventDefault || (b.returnValue = !1);
        "mousedown" === c.mouseIsDown && this.drag(b);
        !this.inClass(b.target, "highcharts-tracker") && !c.isInsidePlot(b.chartX - c.plotLeft, b.chartY - c.plotTop) || c.openMenu || this.runPointActions(b)
    };

 

找到對象是誰,這一步可以斷點調試看this,或往上翻代碼,其實是個Pointer. 

通過分析可知,這個對象的Highcharts對象的一個子對象,我們也需要通過簡單的判斷來進行確認好

 需要註意的是,代碼中有一段用到了其他變數 q  B  a,所以在業務代碼中覆蓋的時候,我們需要另外提前賦值

q(a.hoverChartIndex) && B[a.hoverChartIndex] && B[a.hoverChartIndex].mouseIsDown || (a.hoverChartIndex = c.index);

通過一系列分析和斷點查詢,以及確認值的一致,就能保證能覆蓋地正確

 

思考六:在vue中為何沒有生效

然鵝並不是順利的,在實際場景vue-highcharts中使用竟然沒啥變化,一輪調試下來也沒有走斷點,

無可奈何只好去看下它的實現,看有沒有什麼突破口

源碼很少,就是一層包裝

但這裡可以發現,如果沒有傳入highcharts,就會另外引入npm包來使用

所以很大可能是沒傳入這個屬性,致使覆蓋的Pointer並不是真正的圖表Pointer

仔細檢查代碼,才發現前人留個個坑,把大寫的屬性改成小寫之後,即可匹配上

 

當然,這個覆蓋的方式是挺暴力的,可以根據需求加些判斷處理,不過在現有業務中,不失為一個好辦法

 


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

-Advertisement-
Play Games
更多相關文章
  • 核心需要高斯模糊的庫 針對於3.7的版本 使用方法為: 針對4.+ ...
  • Fastlane是什麼 "Fastlane" "Fastlane Document" Fastlane是一整套的客戶端CICD工具集合。Fastlane可以非常快速簡單的搭建一個自動化發佈服務,並且支持Android,iOS,MacOS。 Fastlane命令執行的底層並不是自己實現的,而是調用其他 ...
  • Client與Server的網路通信協議傳輸使用google protobuf,伺服器端使用的是Java 一、 Protocol Buffersprotobuf全稱Google Protocol Buffers,是google開發的的一套用於數據存儲,網路通信時用於協議編解碼的工具庫。它和XML或者 ...
  • es6-字元串模板, es6字元串查找, es6字元串複製, es6判斷字元串是否存在包括頭部,尾部 ...
  • es6-變數的解構賦值 ...
  • [2019.06.21 學習筆記3] 1.<p>段落標簽 2.多用於文章、長篇文字,沒有內容字數限制 ...
  • [2019.06.21 學習筆記2] 1.標題標簽 2.<h1>到<h6>的字體是從大到小,都是加粗,沒有<h7> 3.如果要重定義<h>標簽的樣式,修改css樣式中的font-weight(字體粗細)、font-size(字體大小) ...
  • [2019.06.21 學習筆記1] 1.<a>定義超鏈接 2.必須屬性href,鏈接位置,對應一個url地址,href="url地址",顯示藍色並帶有下劃線(可去掉),必須寫(不寫也可以,但是最好寫) 不想指向任何頁面:href="#" <!-- 指向當前頁面最頂部,點擊後不會發生跳轉--> 指向 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...