廖若飛,廖海
(1.四川信息職業技術學院軟件學院,廣元628040;2.四川信息職業技術學院信息中心,廣元628040)
Chrome Brower在目前瀏覽器市場占有很高的份額,已經成為用戶的主力瀏覽器,成為業界事實上的標準。在學習、生活、工作中,大家經常遇到這樣的場景:網頁上有很多表格,表格中有很多數據,如何快速且方便地保存下來?一般做法是先在網頁上選中相應的內容,然后再復制,接著打開Excel軟件,新建文件,然后粘貼保存。這種做法比較步驟比較多,操作麻煩,有沒有一種簡單的辦法實現一鍵下載?答案是肯定的,通過Chrome Extension程序可以實現。
選擇Chrome Extension程序來實現,基于以下四點:①開發難度小,Chrome Extension程序本身就是基于Chrome瀏覽器,不需要模擬瀏覽器、解析網頁[1];②開發流程簡單;③可擴展性強,在WebKit內核的瀏覽器中均可以使用;④用戶使用方便;⑤跨平臺,Win?dows、MacOS、Linux桌面環境都可以使用。
程序的觸發可以這樣實現:將表格的第一行最后一列單元格字體變紅,用以標識該表格可以下載;給該單元格增加雙擊事件,雙擊觸發數據下載。通過以上分析可以看出,程序開發中的步驟和難點,下文逐一展開討論。
為方便開發,程序中可引入jQuery類庫。頁面上可能會有多個table元素,可以遍歷所有table元素,然后找第一列的最后一個單元格,注意該單元格可能是th元素也可能是td元素。關聯事件的代碼需要在頁面加載完成之后才能執行,所以要將它放在$(function(){})中。選擇器:“tr:first th:last,tr:first td:last”是一個難點,表示選擇當前table元素中的第一個tr元素中最后一個th或者第一個tr元素中最后一個td。downTable是一個自定義方法,該方法的功能就是實現數據的提取和格式化數據轉Excel文件及下載,在后面的章節中實現它。

如果明確知道某個table的ID,可以使用jQuery的ID選擇器選擇該table,然后通過循環來遍歷表格中的tr元素和th/td元素,從而實現table數據的提取。代碼如下:

代碼中定義了提取的數據集合變量aoa,它的數據類型是數組的數組。二維數組的行與列與頁面表格中行與列一一對應。注意數據集合變量aoa在后面的代碼中要用到。
上面的代碼使用了ID選擇器,有明顯的缺陷。程序要應用到任意的網頁上,顯然不應該使用ID選擇器、類選擇等進行選擇。如果使用元素選擇器$("table")進行選擇,會將頁面上多個的表格的內容全部提取出來。有沒有準確選擇的辦法?解決的辦法是通過事件的target屬性來定位td或者th,然后向上查找父節點定位到table。核心代碼如下:


根據HTML/HTML5的規范,td/th標簽一般嵌套在tr中,tr標簽可以直接放在table中,也可以放在thead中,也就是說從td/th標簽向上查找父節點找到table標簽需要2次或者3次,這也是上面的代碼需要循環2-3次的原因。
定位到觸發雙擊事件的table元素,將它保存在ta?ble變量中,使用$(table)進行選擇,這樣可以修復上面的缺陷。
由于條件的限制,本次研究分3個部分2個板塊來實施。3個部分是指分別針對視覺障礙、聽覺障礙和老年人設計的課程,2個板塊是指在同樣的條件下實驗組運用設計好的無障礙模式進行學習,對照組則是用普通模式進行學習。
近幾年前端技術飛速發展,涌現出很多優秀的前端類庫。格式化數據轉Excel文件可以使用第三類庫Js-xlsx來實現。Js-xlsx是一款由SheetJS公司開發的開源產品,它可以實現各種電子表格格式的解析和編寫,兼容IE6以及ES3/ES5標準。使用方法也非常簡單,先將數據轉換為sheet對象。核心代碼如下:


有了文件的Blob對象,可以通過URL.createObjec?tURL()方法獲取Blob對象的URL,將URL設置到鏈接元素的href屬性上,點擊之后就可以下載文件了。如果要實現自動化操作,鏈接元素甚至不用放到頁面上,可以是動態創建出來的,創建點擊事件的event對象,由代碼觸發該事件,核心代碼如下。

將上面的代碼放到方法openDownloadDialog里面,可以方便調用。
可以將上面1.1到1.4小節的所有代碼存放到一個js文件exportExcel/main.js中,然后創建含多個表格的靜態網頁文件,引入JQuery和Js-xlsx的類庫文件,進行調試和測試。正常情況下table的第一行最后一個的單元格會變成紅色,雙擊該單元格可以下載導出的Excel文件。以上所有代碼只需要用到前端開發技術,與Chrome Extension開發技術并無關聯。
完成上面1.1到1.4小節代碼的編寫和調試后,可以進行Chrome Extension程序的開發。Chrome Exten?sion程序的結構、開發方法等本文不做介紹。Chrome Extension提供了豐富的API,可以將自定義腳本,樣式表注入到頁面中。前面的腳本已經實現了表格數據的提取、格式化數據轉Excel文件和文件下載的功能,接下來可以將上述功能整合到擴展程序中。
Chrome Extension程序的運行實質是將自定義的腳本注入到特定的網頁中,以實現特定的功能。谷歌采用最小特權、特權分離、強制隔離的擴展安全架構保障用戶安全[2]。腳本注入的方式受擴展程序申請的權限不同,又有所差異。至少有兩種方法實現:一是申請匹配所有地址的權限實現。二是利用activeTab權限實現。下文詳細介紹兩種不同方法的實現原理及步驟。
方法一:申請匹配所有地址的權限實現
manifest.json文件是Chrome Extension程序的核心,用于設置擴展程序的資源、申請權限等。其中content_scripts屬性用于設置需要直接注入頁面的Java Script和CSS文件。Matches屬性指定擴展程序可以匹配到的地址,申請匹配所有地址的權限,因此值為:“
本項目依賴jQuery和Js-xlsx兩個第三方類庫,可以先將它們下載到本地,直接引用本地資源。如果引用外部資源,會有兩方面的負面影響。一是外部資源加載受網絡環境的限制,影響頁面加載速度。二是如果要將軟件發布到Google Web Store,Google會嚴格審核引入的外部資源,增加審核的時間。三是引入外部資源使擴展程序本身容易受到攻擊。
為保持擴展程序目錄的整潔,可以在擴展程序根目錄下創建jsLib目錄,然后在其中創建各第三方類庫的子目錄如:jquery,xlsx,以及自定義的exportExcel類庫。main.js中包含了1.1到1.4小節的所有代碼。
屬性"run_at"的值設置為"document_start",表示代碼注入的時間為頁面加載的時候。核心代碼如下:


在該方法中,用戶頁面加載的同時,會自動加載content_scripts屬性中配置的三個腳本文件:jquery-3.4.1.min.js、xlsx.full.min.js、main.js。其中main.js依賴前兩個文件,因此main.js放在最后。main.js中實現所有功能,因此擴展程序能正常工作。在這種方式下,用戶頁面的表格在頁面加載完成之后,所有表格的第一行最后一個單元格字體變紅,無須額外操作,雙擊就可以下載。
方法二:利用activeTab權限實現
匹配所有地址的權限非常高,擴展程序提交到Google Web Store不一定能通過審核。放棄匹配所有地址的權限后,content_scripts中配置的腳本文件不會加載。Google推薦的方式是使用activeTab權限,申請到activeTab權限后,可以利用chrome.browserAction.on?Clicked事件動態加載腳本。也就是說,頁面打開之后,用戶需要點擊地址欄右側的browser_action,觸發click事件,然后程序動態加載腳本,實現功能。mani?fest.json文件核心內容如下:

對比方法一,background字段增加了腳本back?ground.js;permissions字 段 增 加 了activeTab;con?tent_scripts字段里去掉了JS的配置,增加了CSS的配置,JS與CSS兩者之間必須配一個,這里可配一個空文件custom.css;matches里配制的域名無實際意義,僅為滿足manifest.json文件的語法要求。
新增的background.js文件代碼如下:

采用1.5小節方法二開發的擴展程序運行之后,打開任意普通含表格的頁面,如圖1所示,頁面不會有任何變化。當用戶點擊地址欄右側的按鈕,如圖2所示,頁面上的表格會發生變化,如圖3所示,表格的第一行最后一個單元格字體變紅。雙擊該單元格之后,彈出確認下載的窗口,如圖4所示。確認之后可以正常下載數據。

圖1 普通含表格的頁面

圖2 地址欄右側的按鈕圖

圖3 普通含表格的頁面

圖4 確認下載
本文介紹了開發基于Chrome Extension的表格導出軟件的設計和開發的思路和方法,提出了先在靜態頁面中開發和驗證核心功能,然后再打包到擴展程序中的開發思路,有一定的創新性,可以大幅降低開發難度,提高開發效率。并且該擴展程序有一定的應用價值,也可以作為教學案例應用于軟件技術專業Web前端開發方向的教學中。在擴展程序注入腳本的過程中,提供了兩種完全不同的解決辦法,闡明了兩種不同的設計理念和各自的利弊。在本文發表前,本軟件已發布到Google Web Store中,可以用關鍵字“表格導出助手”搜索到。