您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
jx filter ad,不保证适用所有的jx页面,自用~
- // ==UserScript==
- // @name jx filter ad
- // @namespace http://tampermonkey.net/
- // @version 3.0.0
- // @description jx filter ad,不保证适用所有的jx页面,自用~
- // @author ltxlong
- // @match *://*/*
- // @grant none
- // @license MIT
- // @run-at document-start
- // ==/UserScript==
- (function() {
- 'use strict';
- let jx_filter_ad_open_flag = false;
- const the_jx_url_trait = [
- 'v.qq.com',
- 'iqiyi.com',
- 'iq.com',
- 'youku.com',
- 'le.com',
- 'tudou.com',
- 'mgtv.com',
- 'sohu.com',
- '1905.com',
- 'bilibili.com',
- 'pptv.com',
- 'baofeng.com',
- 'acfun.cn',
- 'miguvideo.com',
- 'yinyuetai.com',
- 'fun.tv',
- 'wasu.cn'
- ];
- const originUrl = window.location.origin;
- const originSearch = window.location.search;
- const hasMatchInSearch = the_jx_url_trait.some(trait => originSearch.includes(trait));
- if (hasMatchInSearch) {
- jx_filter_ad_open_flag = true;
- }
- if (!jx_filter_ad_open_flag) {
- return;
- }
- // 可以自定义需要去掉的id和class和其他定义的元素
- const adEleId = [];
- const adEleClass = [];
- const adEleOther = ['span[id]'];
- // 固定为PC ua
- Object.defineProperty(navigator, 'userAgent', {
- get: function () {
- return 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36';
- }
- });
- // Hook setInterval
- try {
- const originalSetInterval = window.setInterval;
- window.setInterval = function(callback, delay, ...args) {
- const callbackString = callback.toString();
- const filterPatterns = [
- '.appendChild(',
- '.insertBefore(',
- '.insertAfter(',
- '.append(',
- '.prepend(',
- '.after(',
- '.before(',
- '.appendTo(',
- '.prependTo(',
- '.html(',
- '.replaceWith(',
- '.wrap(',
- '.wrapAll(',
- '.wrapInner(',
- ];
- let isBlockFlag = false;
- if (typeof callbackString === 'string' && callbackString !== '[native code]') {
- for (const pattern of filterPatterns) {
- if (callbackString.includes(pattern)) {
- console.warn(`HOOK: Callback string contains filter pattern: "${pattern}"`);
- isBlockFlag = true;
- break;
- }
- }
- }
- if (isBlockFlag) {
- return 0;
- }
- // --- 如果没有阻止,调用原始的 setInterval ---
- const intervalId = originalSetInterval.call(this, callback, delay, ...args);
- return intervalId;
- }
- } catch (error) {
- console.error('Error getting callback toString() or during string analysis:', error);
- }
- // 确保浏览器支持 Navigation API
- try {
- if ('navigation' in window) {
- window.navigation.addEventListener('navigate', (event) => {
- const destinationUrl = event.destination.url;
- const destinationOrigin = new URL(destinationUrl).origin;
- // Check if the destination origin is different from the current origin
- if (destinationOrigin !== originUrl) {
- console.warn(`阻止了到非同源地址的跳转: ${destinationUrl}`);
- // Prevent the default navigation behavior
- // event.canIntercept must be true for preventDefault to work on this event type
- if (event.canIntercept) {
- event.preventDefault();;
- } else {
- console.log(`Navigation to ${destinationUrl} cannot be intercepted.`);
- // Note: Some navigations like target="_blank" might not be interceptable this way
- }
- } else {
- console.log(`允许同源跳转: ${destinationUrl}`);
- // Let the navigation proceed
- }
- });
- console.log(`当前页面源: ${window.location.origin}`);
- console.log('Navigation API 监听已启动...');
- } else {
- console.warn('当前浏览器不支持 Navigation API,请考虑使用 click/submit 监听作为替代。');
- // Fallback to click/submit method if necessary
- }
- } catch (e) {
- // Handle potential errors if the URL is invalid or cannot be parsed
- console.error('无法解析目标URL或发生错误:', e);
- // Decide whether to prevent or allow on error - usually allowing is safer
- // Let's assume allowing is the default if we can't verify
- }
- function removeTargetBlankDivs() {
- try {
- const blankTargetAnchors = document.querySelectorAll('a[target="_blank"]');
- if (blankTargetAnchors.length === 0) {
- //console.log("----------------No target='_blank' anchors found.");
- return;
- }
- blankTargetAnchors.forEach(anchor => {
- const parentDiv = anchor.closest('div');
- if (parentDiv) {
- if (parentDiv.parentNode) {
- //console.log("----------------Removing div: ", anchor.outerHTML);
- parentDiv.remove();
- }
- }
- });
- } catch (error) {
- console.error("----------------Error accessing or modifying content: ", error);
- }
- }
- function removeAdElement() {
- if (adEleId.length === 0 && adEleClass.length === 0 && adEleOther.length === 0) {
- return;
- }
- const selectors = [];
- if (adEleId.length > 0) {
- selectors.push(...adEleId.map(id => `#${id}`));
- }
- if (adEleClass.length > 0) {
- selectors.push(...adEleClass.map(className => `.${className}`));
- }
- if (adEleOther.length > 0) {
- selectors.push(...adEleOther.map(otherEle => `${otherEle}`));
- }
- if (selectors.length === 0) {
- return;
- }
- const combinedSelector = selectors.join(', ');
- try {
- const elementsToRemove = document.querySelectorAll(combinedSelector);
- elementsToRemove.forEach(element => {
- // 使用 element.remove() 是现代且推荐的删除元素方法
- // 兼容性:IE(Edge 除外)不支持,但现代浏览器都支持
- if (element && typeof element.remove === 'function') {
- element.remove();
- // console.log("已删除元素:", element); // 可选:记录删除的元素
- } else if (element && element.parentNode) {
- // 兼容旧浏览器,通过父节点删除
- element.parentNode.removeChild(element);
- // console.log("已删除元素 (旧方法):", element); // 可选:记录删除的元素
- }
- });
- } catch(error) {
- console.error("删除元素时发生错误:", error);
- }
- }
- removeTargetBlankDivs();
- removeAdElement();
- // 考虑网速慢和卡顿的情况
- setTimeout(() => { removeTargetBlankDivs(); removeAdElement(); }, 1000)
- setTimeout(() => { removeTargetBlankDivs(); removeAdElement(); }, 2000)
- setTimeout(() => { removeTargetBlankDivs(); removeAdElement(); }, 3000)
- setTimeout(() => { removeTargetBlankDivs(); removeAdElement(); }, 5000)
- setTimeout(() => { removeTargetBlankDivs(); removeAdElement(); }, 10000)
- setTimeout(() => { removeTargetBlankDivs(); removeAdElement(); }, 20000)
- setTimeout(() => { removeTargetBlankDivs(); removeAdElement(); }, 30000)
- try {
- window.addEventListener('load', () => {
- removeTargetBlankDivs();
- removeAdElement();
- })
- } catch (error) {
- console.error("监听页面load发生错误:", error);
- }
- })();