【问题标题】:How to use .removeClass() in a userscript [duplicate]如何在用户脚本中使用 .removeClass() [重复]
【发布时间】:2019-07-14 03:30:16
【问题描述】:

我正在尝试使用 Violentmonkey 和 jQuery 从单个 div 中删除 hide 类。我的用户脚本没有做任何事情,我不知道为什么。

已经试过了:

  • 添加// @grant GM_addStyle
  • 使用以下选择器:$("expand_collapse.hide")$("div.expand_collapse")$(".expand_collapse")
  • 使用 Tampermonkey
  • 使用@require https://code.jquery.com/jquery-3.4.1.min.js 获取jQuery

这是 div:

<div class="expand_collapse hide">
  <a href="javascript:" id="expand_all">
        Expand
  </a>
  <a href="javascript:" id="collapse_all">
        Collapse
  </a>
</div>

这是我的用户脚本:

// ==UserScript==
// @name unhide
// @match https://example/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js
// ==/UserScript==

$("div.expand_collapse.hide").removeClass("hide");

当我使用 Chrome 检查器手动删除 hide 类时,展开和折叠链接会出现并按预期工作。我想用userscript 达到同样的效果,但它不起作用。

【问题讨论】:

  • 确保在DOM已经加载(document.ready)之后脚本正在运行,并且你确定元素不是动态添加或修改的吗?如果是这样,您可以尝试一些 hacky,例如将您的代码放入 setTimeout() 以延迟其执行。
  • 还需要确保在 dom 加载后不会异步添加元素。尝试添加console.log('Length=', $("div.expand_collapse.hide").length)
  • 反之hide类也可以在dom加载后被其他脚本添加
  • 好的,所以我尝试了( document ).ready(function() { $("div.expand_collapse.hide").removeClass("hide"); });,但没有帮助。我不确定如何使用 setTimeout ????。添加console.log('Length=', $("div.expand_collapse.hide").length) 返回Length= 0 所以我猜它确实是在加载dom 之后添加的。正如我所说,我是一个完全的新手,所以我不知道如何继续。

标签: javascript jquery greasemonkey tampermonkey userscripts


【解决方案1】:

感谢 cmets 中的人,我发现我尝试修改的内容是动态添加的,因此当我的用户脚本触发时它还不存在。按照Archer's 的建议,我用setTimeout() 添加了3 秒的延迟,效果很好。这是工作用户脚本:

// ==UserScript==
// @name unhide
// @match https://example.com/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js

// ==/UserScript==

setTimeout( function() {
  $("div.expand_collapse.hide").removeClass("hide");
}, 3000 )

如果有替代/更优雅/更好的解决方案,我会很高兴了解它。谢谢!

编辑:charlietfl 建议在div 出现后使用更短的时间(比我必须使用setTimeout() 的时间)和clearInterval()。这导致链接出现得更快。代码如下:

var i = $("div.expand_collapse.hide").length;

var myInterval = setInterval(unhide, 250);

function unhide () {
  $("div.expand_collapse.hide").removeClass("hide");
}

if (i != 0) {
  clearInterval(myInterval);
};

【讨论】:

  • 您也可以在1/4 秒间隔时间上使用setInterval(),并在length 不为0 时清除间隔计时器
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 2021-04-25
  • 2011-03-13
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多