搭伙

快速點餐

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         搭伙
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  快速點餐
// @author       Yich
// @match        https://imenu.com.tw/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=imenu.com.tw
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// @grant        none
// @license MIT
// @require      https://greasyfork.org/scripts/383527-wait-for-key-elements/code/Wait_for_key_elements.js
// ==/UserScript==

(function() {
    'use strict';

    // 定義要隱藏的文字
    var arr = ["小白兔暖暖包", "海苔堅果棒","🥤","團購","餃子","肉圓","燒臘","烤吐司","小火鍋","炒麵","捲餅","麵線","春和捲食","福星麵館"];
    //將常用的店家排序在前面
    var topStore = ["池上便當","弍食穗","蛋白盒子"];

    // 隱藏 h5 中特定文字的元素
    function hideElements(jNode) {
        arr.forEach(text => {
            jNode.filter(`:contains('${text}')`).each(function() {
                const element = $(this);
                element.hide();
                const par = element.closest('span[class^="menu-tab-"]');
                if(par.length) {
                    par.css('display','none');
                }
            });
        });
    }

    // 隱藏 meal-header 中包含特定文字的 h2 與其上層 category
    function hideHeaders(jNode) {
        jNode.each(function() {
            var h2 = $(this);
            if (arr.some(text => h2.text().includes(text))) {
                h2.closest('.meal-header').css('display','none');
                var categoryDiv = h2.closest('div[class^="category-id-"]');
                if (categoryDiv.length) {
                    categoryDiv.css('display','none');
                }
            }
        });
        moveFrequencyStore();
    }

    // 隱藏公告
    function hidePopup() {

        const buttonElement = document.querySelector('.el-drawer__close-btn');
        if (buttonElement) {
            buttonElement.click(); // 模擬按下按鈕
        }
    }

    //將常用的店家移到前面
    function moveFrequencyStore(){
        // 想要排序在前的店家列表


        // 取得「菜單頁,餐點分類標籤」區塊
        const categoryBar = document.querySelector('section[ui_name="菜單頁,餐點分類標籤"] .category-bar .tag-group');
        // 取得「菜單頁,餐點列表」區塊
        const mealList = document.querySelector('section[ui_name="菜單頁,餐點列表"].meal-list');

        if (!categoryBar || !mealList) {
            console.log("找不到指定的區塊");
            return;
        }

        // 我們將符合 topStore 名稱的 item 推入一個暫存的陣列,稍後統一排序
        const matchedItems = [];

        //找出這家店的id
        topStore.forEach(name => {
            // 從 categoryBar 找到符合 name 的 h5
            const h5Candidates = categoryBar.querySelectorAll('h5');
            const h5 = Array.from(h5Candidates).find(h => h.textContent.trim().includes(name));
            if (h5) {
                const span = h5.closest('span[class^="menu-tab-"]');
                if (span) {
                    // span 的 class 應該像 "menu-tab-112514"
                    const spanClass = Array.from(span.classList).find(c => c.startsWith('menu-tab-'));
                    if (spanClass) {
                        // 從 class 中取得 id
                        const id = spanClass.replace('menu-tab-', '');
                        matchedItems.push({ name, id, span });
                    }
                }
            }
        });
        //console.log(matchedItems);
        // matchedItems 中現在有 {name, id, span} 物件
        // 我們需要根據 matchedItems 的順序將對應的 category-id-xxxx 移動

        matchedItems.forEach(item => {
            const { id, span } = item;

            // 找出對應的 category-id-x
            const categoryDiv = mealList.querySelector(`.category-id-${id}`);
            if (categoryDiv) {
                // 將該 categoryDiv 移到 mealList 最前面
                mealList.insertBefore(categoryDiv, mealList.firstChild);
            }

            // 將 span 移到 categoryBar 最前面
            categoryBar.insertBefore(span, categoryBar.firstChild);
        });
    }

    // 使用 waitForKeyElements 偵測並處理目標元素
    waitForKeyElements("h5", hideElements);
    waitForKeyElements("section.meal-header h2", hideHeaders);
    waitForKeyElements('div[aria-modal="true"][aria-label="店家公告"]', hidePopup);
})();