摘要:我的擴(kuò)展是專門用于知乎網(wǎng)站的,因此選擇了來處理。在文件中進(jìn)行如下設(shè)置知乎屏蔽擴(kuò)展在中指定域可以使擴(kuò)展常駐后臺(tái)。由于注入到了知乎頁面,而存放在擴(kuò)展的域下,要在中獲得關(guān)鍵詞的值,就必須用到頁面中的通信。
本文原發(fā)在我的博客。
前段時(shí)間電影《瘋狂動(dòng)物城》上映了,然后我的知乎首頁就被它刷屏了。雖然我對(duì)這部電影沒有任何意見,但作為一個(gè)還沒去電影院看過的人來說,每看到相關(guān)問題一次都是無情的劇透,于是我毅然屏蔽了“瘋狂動(dòng)物園”這個(gè)話題。本以為問題解決了,但是接下來我又被迫看到這個(gè)問題:
問題上添加的五個(gè)話題無一命中,我又被劇透了一臉。算了,既然知乎的屏蔽規(guī)則靠不住,那就自己動(dòng)手吧。這樣我的Chrome瀏覽器擴(kuò)展——ZhihuFilter就誕生了,點(diǎn)擊這里查看Github上的項(xiàng)目。
擴(kuò)展功能其實(shí)擴(kuò)展的功能很簡單,當(dāng)打開知乎首頁后,擴(kuò)展會(huì)依次檢查你的屏蔽關(guān)鍵詞列表是否出現(xiàn)在了某一個(gè)答案中,如果出現(xiàn)了,就會(huì)把這個(gè)答案隱藏,取而代之的是提示信息和一個(gè)展開答案的按鈕。效果如下圖所示:
你可以點(diǎn)擊圖中的按鈕來查看答案,之后可以選擇再次隱藏或展開。
當(dāng)你安裝了擴(kuò)展后,會(huì)在地址欄的右側(cè)顯示出圖標(biāo)
點(diǎn)擊圖標(biāo)后,將會(huì)出現(xiàn)設(shè)置屏蔽詞的界面
你可以在這個(gè)頁面中設(shè)置你想屏蔽的詞語。
關(guān)于Chrome擴(kuò)展的開發(fā)關(guān)于Chrome擴(kuò)展開發(fā)的內(nèi)容,可以查看Google的官方文檔或者是這個(gè)教程。
一個(gè)應(yīng)用(擴(kuò)展)其實(shí)是壓縮在一起的一組文件,包括HTML,CSS,Javascript腳本,圖片文件,還有其它任何需要的文件。
開發(fā)擴(kuò)展的時(shí)候,必不可少的是一個(gè)manifest.json文件,這是一個(gè)配置文件,會(huì)告訴Chrome你的擴(kuò)展中包含了哪些內(nèi)容。manifest.json中包含擴(kuò)展的名字、版本及各種資源文件(如圖標(biāo)、顯示頁面等)的鏈接。
我的擴(kuò)展的manifest.json文件
Browser_action 和 page_actionBrowser_action和page_action是擴(kuò)展的兩種類型,它們很相似,主要的區(qū)別在于browser_action可以應(yīng)用于所有的頁面,而page_action只能在你設(shè)定的幾個(gè)特定網(wǎng)站內(nèi)使用。我的擴(kuò)展是專門用于知乎網(wǎng)站的,因此選擇了page_action來處理。
按照Google的文檔描述,兩者還有一個(gè)區(qū)別:browser_action的圖標(biāo)顯示在地址欄的外部,page_action的圖標(biāo)顯示在地址欄內(nèi)部。但是,在這里的討論中,似乎新版本的Chrome瀏覽器中已經(jīng)將兩者都顯示在了地址欄的外側(cè),不過page_action的圖標(biāo)只有在打開特定的網(wǎng)站時(shí)才不會(huì)顯示為灰色。
在manifest.json文件中進(jìn)行如下設(shè)置:
"page_action": { "default_icon": "images/icon.png", "default_title": "知乎屏蔽擴(kuò)展" },background.js
在Manifest中指定background域可以使擴(kuò)展常駐后臺(tái)。background可以包含三種屬性,分別是scripts、page和persistent。
我在擴(kuò)展中只用到了scripts:
"background": { "scripts": ["js/jquery-2.2.1.js","js/background.js"] },
這樣就會(huì)自動(dòng)生成一個(gè)包含了列出的腳本文件的后臺(tái)頁面。
在我的background.js文件中有如下內(nèi)容:
// 當(dāng)網(wǎng)址改變的時(shí)候,判斷當(dāng)前的頁面是否是知乎 // 如果是的話,就顯示出圖標(biāo),并設(shè)置它的彈出頁面 chrome.tabs.onUpdated.addListener(function(id, info, tab){ if (tab.url.toLowerCase().indexOf("zhihu.com") > -1){ chrome.pageAction.show(id); chrome.pageAction.setPopup({ tabId: id, popup: "popup.html" }); } });
background.js文件中還有一個(gè)用于和content_script進(jìn)行通信的監(jiān)聽器。
Content Scripts參考資料:
Google的Backgorund Pages文檔
另一個(gè)教程
Content scripts是在Web頁面內(nèi)運(yùn)行的javascript腳本。通過使用標(biāo)準(zhǔn)的DOM,它們可以獲取瀏覽器所訪問頁面的詳細(xì)信息,并可以修改這些信息。
在manifest.json文件中進(jìn)行設(shè)置:
"content_scripts": [ { "matches": ["*://*.zhihu.com/*"], "js": ["js/jquery-2.2.1.js", "js/content_script.js"] }
在打開匹配的網(wǎng)站時(shí),列出的js文件會(huì)被注入頁面,這樣就可以獲得瀏覽器所訪問的web頁面的詳細(xì)信息,并可以對(duì)頁面做出修改。雖然content script和頁面共享了DOM結(jié)構(gòu),但不能訪問該頁面或其它c(diǎn)ontent script中定義的函數(shù)和變量,這樣就避免了相同的函數(shù)或變量名稱的干擾。
我的擴(kuò)展的主要功能就是在content_script.js中完成的,在該腳本中通過對(duì)頁面的DOM進(jìn)行操作來實(shí)現(xiàn)功能。
擴(kuò)展功能的實(shí)現(xiàn) 對(duì)知乎首頁進(jìn)行分析查看一下知乎首頁的源代碼,所有的答案內(nèi)容是放在一個(gè)id=js-home-feed-list的div中的,結(jié)構(gòu)大致如下:
而在答案部分中,又分為摘要和完整的答案。
…
我們可以獲取上面的節(jié)點(diǎn)內(nèi)容,來確定是否需要屏蔽這個(gè)答案。最簡單的實(shí)現(xiàn)方法就是查找關(guān)鍵詞是否在節(jié)點(diǎn)的outerHTML中出現(xiàn),如果出現(xiàn)了就給.feed-main加上一個(gè)名為hidden的class。
用于替換的內(nèi)容原來的答案被隱藏了之后,需要在這個(gè)地方換上點(diǎn)新的內(nèi)容,我在這里創(chuàng)建了一個(gè)div,內(nèi)部有一個(gè)p元素用于顯示信息,及一個(gè)button用于切換答案的狀態(tài)。
// 創(chuàng)建用于替換的div var $div = $(""); $div.append($("這里有一個(gè)被屏蔽的答案
")); $div.append($(""));
還需要在按鈕上綁定點(diǎn)擊事件,p元素內(nèi)顯示的信息也會(huì)根據(jù)實(shí)際進(jìn)行修改。
關(guān)鍵詞的存儲(chǔ)在我的擴(kuò)展中,我是將需要屏蔽的關(guān)鍵詞存放在了localStorage中。關(guān)鍵詞保存在localStorage中的keywords鍵下,是一個(gè)簡單的由逗號(hào)分隔開的字符串。
要訪問同一個(gè)localStorage對(duì)象,頁面必須來自同一個(gè)域名(子域名無效),使用同一種協(xié)議,在同一個(gè)端口上。
由于content script注入到了知乎頁面,而localStorage存放在擴(kuò)展的域下,要在content script中獲得關(guān)鍵詞的值,就必須用到頁面中的通信。
Chrome提供了4個(gè)有關(guān)擴(kuò)展頁面間相互通信的接口,分別是runtime.sendMessage、runtime.onMessage、runtime.connect和runtime.onConnect,
這里用到了前兩個(gè)。
content_script.js
// 從擴(kuò)展的localStorage中獲得存儲(chǔ)的關(guān)鍵詞 chrome.runtime.sendMessage({method: "getKeywords"}, function (response) { str = response.keywords; keywords = str !== "" ? str.split(",") : []; });
對(duì)應(yīng)的background.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { if (request.method == "getKeywords") sendResponse({keywords: localStorage["keywords"]}); else sendResponse({}); });
這樣就可以在content script中使用localStorage的值了。
檢測頁面加載了更多內(nèi)容參考資料:擴(kuò)展頁面中的通信
每當(dāng)當(dāng)知乎頁面加載了更多的答案時(shí),我們需要再進(jìn)行處理。那么如何檢測頁面中加載了更多內(nèi)容,這里需要用到MutationObserver對(duì)象。MutationObserver提供了檢測頁面中的DOM變化的方法。
MutationObserver的使用方法:
首先,創(chuàng)建一個(gè)mutationObserver的實(shí)例
var observer = new MutationObserver(callback)
這里需要一個(gè)回調(diào)函數(shù)作為構(gòu)造器的參數(shù)。
callback函數(shù)接受一個(gè)參數(shù),所有被記錄到的DOM變化將會(huì)組合成一個(gè)數(shù)組,作為參數(shù)傳給回調(diào)函數(shù)進(jìn)行處理。
mutationObserver對(duì)象有幾個(gè)方法,這里只用到observe方法。
observe方法接收兩個(gè)參數(shù):
void observe( Node target, MutationObserverInit options );
第一個(gè)參數(shù)指的是你要觀察哪一個(gè)節(jié)點(diǎn)的DOM變化。第二個(gè)參數(shù)是一個(gè)選項(xiàng)參數(shù),
var option = { "childList": true, // 觀察子元素 "subtree": true, // 觀察目標(biāo)節(jié)點(diǎn)的后代元素 "attributes": false // 不觀察目標(biāo)節(jié)點(diǎn)屬性的變化 };
這里只設(shè)置了三個(gè)選項(xiàng),其余屬性可以看MDN文檔。
觀察到的每一個(gè)變化都是一個(gè)MutationRecord對(duì)象,它有許多屬性,比如:
type,記錄變化的類型
addedNodes,由增加的節(jié)點(diǎn)組成的NodeList
removeNodes,由刪除的節(jié)點(diǎn)組成的NodeList
因?yàn)閍ddedNodes是一個(gè)NodeList,所以可以在它上面應(yīng)用jQuery的$(), $(mutation.addedNodes)。
其它的屬性可以見MDN文檔。
所有的MutationRecord會(huì)被放進(jìn)一個(gè)list中,作為參數(shù)傳給上面的callback函數(shù)。通過對(duì)MutationRecord對(duì)象的屬性進(jìn)行檢測,如果新增的節(jié)點(diǎn)里出現(xiàn)了class=feed-main的元素,則代表加載了新的答案,需要再一次運(yùn)行程序。
擴(kuò)展的使用參考資料:
Getting to Know Mutation Observers
Mutation Observer
在我的設(shè)想中,擴(kuò)展可以提供一些選項(xiàng),比如正則表達(dá)式的支持,再比如除了首頁外,在答案頁面是否也需要提供屏蔽功能。這些選項(xiàng)會(huì)在之后逐步加入。
由于Chrome的設(shè)置,不能夠安裝Web Store中沒有的程序。而發(fā)布擴(kuò)展需要先付$5,我沒有信用卡,也就暫時(shí)沒有發(fā)布擴(kuò)展。如果想嘗試一下擴(kuò)展的話,可以直接下載Github中的代碼到本地。在Chrome瀏覽器的菜單中選擇 More tools -> Extensions,進(jìn)入擴(kuò)展頁面后,勾選右上角的Developer mode,選擇Load unpacked extension,選擇擴(kuò)展文件夾即可。
歡迎使用后提出建議。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87732.html
【百度云搜索,搜各種資料:http://www.bdyss.cn】 【搜網(wǎng)盤,搜各種資料:http://www.swpan.cn】 第一步。首先下載,大神者也的倒立文字驗(yàn)證碼識(shí)別程序 下載地址:https://github.com/muchrooms/... 注意:此程序依賴以下模塊包 Keras==2.0.1 Pillow==3.4.2 jupyter==1.0.0 matplotli...
摘要:新站極簡插件打磨已久,終于上線訪問地址借此機(jī)會(huì),推薦個(gè)最強(qiáng)插件,瞬間開發(fā)效率加倍用于調(diào)試應(yīng)用程序的和擴(kuò)展??梢越鉀Q擴(kuò)展無法自動(dòng)更新的問題,同時(shí)可以訪問谷歌搜索,郵箱,等谷歌服務(wù)。 showImg(http://upload-images.jianshu.io/upload_images/15934130-50747924438e3c47.jpg?imageMogr2/auto-orie...
摘要:新站極簡插件打磨已久,終于上線訪問地址借此機(jī)會(huì),推薦個(gè)最強(qiáng)插件,瞬間開發(fā)效率加倍用于調(diào)試應(yīng)用程序的和擴(kuò)展??梢越鉀Q擴(kuò)展無法自動(dòng)更新的問題,同時(shí)可以訪問谷歌搜索,郵箱,等谷歌服務(wù)。 showImg(http://upload-images.jianshu.io/upload_images/15934130-50747924438e3c47.jpg?imageMogr2/auto-orie...
摘要:作為一名資深碼農(nóng),結(jié)合身邊一群民工的真實(shí)體驗(yàn),小編有那么一點(diǎn)權(quán)威給各位推薦幾款程序員必備常用的擴(kuò)展插件。插件是一款為谷歌瀏覽器定制的非常強(qiáng)大的一款管理插件。 作為一名資深碼農(nóng),結(jié)合身邊一群IT民工的真實(shí)體驗(yàn),小編有那么一點(diǎn)權(quán)威給各位推薦幾款程序員必備、常用的chrome擴(kuò)展插件。1.Click&Clean下載地址:http://www.cnplugins.com/offi...Clic...
閱讀 2702·2023-04-26 00:07
閱讀 2458·2021-11-15 11:37
閱讀 678·2021-10-19 11:44
閱讀 2203·2021-09-22 15:56
閱讀 1766·2021-09-10 10:50
閱讀 1530·2021-08-18 10:21
閱讀 2597·2019-08-30 15:53
閱讀 1656·2019-08-30 11:11