// ==UserScript== // @name 나무위키 광고 삭제 // @namespace Violentmonkey Scripts // @icon https://t2.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=http://namu.wiki // @match https://namu.wiki/* // @grant none // @version 1.25 // @author Xlbatross // @run-at document-end // @description 일단 모바일에서도 되는 것 같아요; // @downloadURL none // ==/UserScript== // 변경을 감지할 노드 선택 const targetNode = document.body; // 감지 옵션 (감지할 변경) const config = { childList: true, subtree: true }; // 변경 감지 시 실행할 콜백 함수 const callback = (mutationList, observer) => { for (const mutation of mutationList) { if (mutation.type === "childList") { const addedNodes = mutation.addedNodes; if (addedNodes.length > 0) { let parent; const queryId = mutation.target.querySelector('[data-google-query-id]'); parent = queryId; while (parent && parent.parentElement.children.length == 1) { let oldParent = parent; parent = parent.parentElement; if (!parent) { parent = oldParent; break; } } parent?.remove(); // Power Link const powerLinkImg = mutation.target.querySelector('img[src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PC9zdmc+"]'); parent = powerLinkImg; if (parent) { // powerLink table 검색 while (parent && parent.tagName != 'TABLE') { parent = parent.parentElement; } // table 위의 parent와 그 위 parent를 확인. let table = parent; let topParent = table.parentElement.parentElement; parent = table.parentElement; // table 삭제 table?.remove(); // 삭제 후 parent에 a element 확인 let linkElement = parent.querySelector('a[href]'); if (!linkElement) { parent?.remove(); linkElement = topParent.querySelector('a[href]'); if (!linkElement){ topParent?.remove(); } } } } } } }; // 콜백 함수에 연결된 감지기 인스턴스 생성 const observer = new MutationObserver(callback); // 설정한 변경의 감지 시작 observer.observe(targetNode, config);