寫扣職人
    首頁課程商品文章影片登入 / 註冊
    返回系列
    【前端動手玩創意】不無聊的HTML與CSS指南
    免費

    不無聊的前端切版課:第6章── 寫一個JS腳本實戰

    如果你想學網頁,那歡迎你來對地方了。 這個指南手冊除了非常適合新手以外,還超級有趣,絕對靠北又能學到東西。

    切板職人
    2 分鐘
    2025年12月12日

    前情提要

    逛論壇或網站常常有惱人的蓋板廣告,要馬就是要你登入、註冊,
    要馬就是搞一堆課程的販售廣告,
    對重視使用者體驗的人來說,真的是一場噩夢!
    為了解決這個問題,我模擬了AdBlock的其中一個功能,刪除頁面上的元素!

    乾乾淨淨才是王道阿。

    效果

    按下ctrl+Q啟動刪除元素模式:

    點擊放大

    被選取的會加上邊框色彩,讓人確認是否要刪除:

    點擊放大

    點選確認後:

    點擊放大

    煩人的元素就此消失在這個永恆的宇宙裡。

    觀念筆記

    套件一:toastr

        //toast.js cdn匯入
    
        const toastJS = ` <link href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.css" rel="stylesheet"  />
        <script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.js"></script>`
        $('body').append(toastJS);
    

    點擊放大

    測試效果反應網站

    點擊放大

    [十分鐘學習] toastr - 簡易提示訊息

    套件二:SweetAlert2

        //設定cdn使用Sweetalert套件
        let Sweetalert2=`<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>`
        $('html').append(Sweetalert2)
        
    

    點擊放大

    點擊放大

    有提供很多API範例,還可以自己定義可愛的小動物XD

    官方網站

    監聽鍵盤組合鍵

     document.addEventListener('keydown', function(e){
            if(e.which==81 && e.ctrlKey==true){
            //.....
            }
    

    Object.assign 動態修改樣式

    點擊放大

    用JS動態修改CSS的三種寫法,花式JS玩弄樣式,嚇死你的同事!

    油猴程式碼

    // ==UserScript==
    // @name         刪除廣告元素
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  try to take over the world!
    // @author       You
    // @match         *://*/*
    // @require      https://code.jquery.com/jquery-3.6.3.min.js
    // @icon         https://www.hexschool.com/
    // @grant        none
    // ==/UserScript==
    
    (function() {
        //---------------------------------------
    
        // 宣告變數
        let set
        let Check = true;
        let List=[]
    
        //設定選取的border色彩效果
        let styleNeon = `@keyframes neon-color {
            from {
            filter: hue-rotate(0deg);
            }
    
            to {
            filter: hue-rotate(360deg);
            }
        }`
    
    
        $('style:last').append(styleNeon)
    
        //設定cdn使用Sweetalert套件
        let Sweetalert2=`<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>`
        $('html').append(Sweetalert2)
    
    
        //使用者點選某個元素 執行刪除元素function
        function SetDeleteEl(e){
            e.preventDefault();
            set=e.target.class
            console.log(set)
            const border={
            border:"4px dotted red"
            }
    
            const Neon={
            animation: "neon-color 2.5s linear infinite"
            }
    
            const NoBorder={
                border:"none"
                }
    
    
            const StopNeon={
                animation: ""
                }
    
            Object.assign(e.target.style,border)
            Object.assign(e.target.style,Neon)
            //e.target.remove()
    
            if (Check==true){
            Swal.fire({
              title: '確定要刪除這個元素?',
              showDenyButton: true,
              showCancelButton: false,
              confirmButtonText: '確認',
              denyButtonText: `取消`,
            }).then((result) => {
              /* Read more about isConfirmed, isDenied below */
              if (result.isConfirmed) {
                e.target.remove()
    
                List.push(e.target.className)
                localStorage.setItem('List',List);
    
                Check=false;
                Swal.fire('成功刪除此元素!', '', 'success')
              } else if (result.isDenied) {
                Check=false;
                Swal.fire('動作已取消', '', 'info')
                Object.assign(e.target.style,NoBorder)
                Object.assign(e.target.style,StopNeon)
    
              };
          });
        }
                //選取流程結束後  解開選取流程的事件綁定
                $('body').unbind('click',SetDeleteEl)
        }
    
    
        //toast.js cdn匯入
    
        const toastJS = ` <link href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.css" rel="stylesheet"  />
        <script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.4/toastr.min.js"></script>`
        $('body').append(toastJS);
    
    
    
        // 當使用者按下Ctrl+Q 就執行主程序
        document.addEventListener('keydown', function(e){
            if(e.which==81 && e.ctrlKey==true){
                RemoveListItem();
                toastr.options = {
                    // 參數設定[註1]
                    "closeButton": false, // 顯示關閉按鈕
                    "debug": false, // 除錯
                    "newestOnTop": false,  // 最新一筆顯示在最上面
                    "progressBar": false, // 顯示隱藏時間進度條
                    "positionClass": "toast-bottom-right",
                    "preventDuplicates": false, // 隱藏重覆訊息
                    "onclick": null, // 當點選提示訊息時,則執行此函式
                    "showDuration": "300", // 顯示時間(單位: 毫秒)
                    "hideDuration": "1000", // 隱藏時間(單位: 毫秒)
                    "timeOut": "2000", // 當超過此設定時間時,則隱藏提示訊息(單位: 毫秒)
                    "extendedTimeOut": "1000", // 當使用者觸碰到提示訊息時,離開後超過此設定時間則隱藏提示訊息(單位: 毫秒)
                    "showEasing": "swing", // 顯示動畫時間曲線
                    "hideEasing": "linear", // 隱藏動畫時間曲線
                    "showMethod": "fadeIn", // 顯示動畫效果
                    "hideMethod": "fadeOut" // 隱藏動畫效果
                }
                toastr.success( "已開啟刪除元素模式!" );
                $('body').on('click',SetDeleteEl)
                Check=true
            }})
    
    
        function RemoveListItem(){
            if (localStorage.getItem('List')!=null){
    
                item=localStorage.getItem('List').split(',')
                for (i=0;i<item.length;i++){
                    item[i]='.'+item[i]
                    item[i]=item[i].replaceAll(' ','.')
                    try{
                    document.querySelector(item[i]).remove()}
                    catch{}
                }
    
                // item='.'+item
                // item=item.replaceAll(' ','.')
                // document.querySelector(item).remove()
            }
        }
    //--------------------------------------------------------
    
    })();
    

    心得

    短短150行左右的程式碼,就寫得好辛苦!(汗
    過去寫過很多次類似的東西,所以基本上沒有卡關的地方,
    只是設計邏輯、嘗試的過程還是比想像的還要耗精神( ´•̥̥̥ω•̥̥̥ )

    但寫出來比過去快很多,也比過去好看超級多的。
    給自己一個讚讚!

    重新把localstorge複習一遍,Object.assign、套件使用等。
    算是一個確確實實的實力鞏固過程。

    延伸

    未來可以新增控制黑名單元素的UI。
    可以新增、刪除,看有哪些元素被列入要刪除的黑名單。

    0 瀏覽

    留言區

    登入後即可留言

    登入 / 註冊
    返回系列文章
    寫扣職人
    隱私權政策使用者條款購買與退款須知

    專業的線上學習平台,提供高品質課程內容

    © 2026 寫扣職人. All rights reserved.

    Powered by Classroo