You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TamperMonkey脚本跳过YouTube标签异常:页面循环刷新及JSON键判断问题

YouTube自动跳过DJ Khalied标签脚本循环刷新问题修复

问题概述

开发TamperMonkey脚本实现自动跳过YouTube上的DJ Khalied音乐标签,配套API返回true时会获取类似{"1":"10","20":"25"}的时间戳JSON。目前非目标视频正常,但打开已录入API的视频时,页面持续循环刷新,核心问题出在removeIt()函数的逻辑错误,尤其是JSON键存在性判断失效。

核心错误分析

  1. vidTime变量赋值错误:
    原代码中var vidTime = setInterval(vidPlayer.getCurrentTime(), 100);完全错误:

    • setInterval的第一个参数需要是函数引用,而非直接调用函数的结果,这里会立即执行vidPlayer.getCurrentTime()并将返回值传入,导致vidTime实际是定时器ID,而非当前视频时间。
    • 后续removeIt()中用jsonData[vidTime]查找键,本质是用定时器ID当键名,永远匹配不到JSON中的时间键,逻辑完全偏离预期。
  2. JSON键存在性判断逻辑错误:
    原判断if(jsonData[vidTime] !== 'undefined')存在两个问题:

    • 错误地将undefined值与字符串'undefined'比较,正确的做法是直接判断值是否为undefined类型。
    • 基于错误的vidTime变量,判断本身就失去意义。
  3. 无限跳转循环:
    每次跳转后页面刷新,脚本会重新执行并再次触发跳转,没有添加停止条件或跳转前的时间校验,导致无限循环。

修复方案

  1. 实时获取视频当前时间:在removeIt()函数内实时调用vidPlayer.getCurrentTime(),并转为整数(匹配JSON中的字符串数字键)。
  2. 正确检查JSON键存在性:使用hasOwnProperty()或in运算符确保键存在。
  3. 添加跳转校验与停止逻辑:跳转前检查当前时间与目标时间的差值,避免重复跳转;跳转前清除定时器,防止脚本继续执行。

完整修正代码

var queryString = window.location.search;
var urlParams = new URLSearchParams(queryString);
var id = urlParams.get('v')
var vidPlayer = document.getElementById("movie_player");
var scanKhalied; // 提前声明定时器变量

if(httpGet(checkKhalied + '?id=' + id) === 'true'){
    console.log("DJ Khalied Parts In Video! Loading Timestamps...");
    var jsonData = httpGet(checkDisplay + '?id=' + id);
    console.log("Loaded Timestamps, Converting JSON to JS Object...");
    jsonData = JSON.parse(jsonData);
    console.log("Converted JSON to JS Object, Watching to Skip DJ Khalied Tags!");
    console.log(jsonData);
    scanKhalied = setInterval(removeIt, 100);
}else{
    console.log("No DJ Khalied Parts To Skip!");
}

function httpGet(theUrl)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", theUrl, false );
    xmlHttp.send( null );
    return xmlHttp.responseText;
}

function removeIt(){
    // 播放器未加载时直接返回
    if (!vidPlayer) return;
    
    // 取当前时间的整数部分,匹配JSON中的字符串数字键
    var currentTime = Math.floor(vidPlayer.getCurrentTime());
    var timeStr = currentTime.toString();
    
    // 正确检查JSON键是否存在
    if (jsonData.hasOwnProperty(timeStr)) {
        var targetTime = jsonData[timeStr];
        // 避免当前时间已接近目标时重复跳转
        if (Math.abs(vidPlayer.getCurrentTime() - targetTime) > 1) {
            window.location.href = `https://www.youtube.com/watch?v=${id}&t=${targetTime}`;
            clearInterval(scanKhalied); // 跳转前清除定时器,终止扫描
        }
    }
}

JSON键存在性检查的正确方法

针对对象的键存在性检查,常用以下三种可靠方式:

  • hasOwnProperty()方法:仅检查对象自身属性(不遍历原型链),推荐用于你的场景:
    if (jsonData.hasOwnProperty(timeStr)) { /* 键存在 */ }
    
  • in运算符:检查对象及其原型链上的属性:
    if (timeStr in jsonData) { /* 键存在 */ }
    
  • typeof判断:适用于键对应的值不会是undefined的场景:
    if (typeof jsonData[timeStr] !== 'undefined') { /* 键存在且值不为undefined */ }
    

内容的提问来源于stack exchange,提问作者v1vcodesstuff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:50:24