javascript - 在使用基本的 greasemonkey 脚本时遇到问题 - GM.getValue/GM.setValue(我认为)

标签 javascript greasemonkey

我正在尝试编写一个基本的 Greasemonkey 脚本,但我遇到了一些问题。本质上,该脚本将刷新页面并计算页面上的图像数量。如果图像数量增加,它会提醒我并激活该选项卡。如果图像数量相同或更少,它将以设定的时间间隔继续刷新页面。

根据我的研究,我认为最好的做法是使用 GM.getValue/GM.setValue 来存储图像数量以将其与新图像计数进行比较。虽然我似乎无法让它运行 - 我认为我的逻辑是合理的,但这只是一个语法问题,尽管尝试了不同的变体。我以前从未使用过 Javascript!

// ==UserScript==
// @name        *Page Refresher
// @include     *
// ==/UserScript==
// @grant    GM.getValue
// @grant    GM.setValue

var refreshRate = 10000; //Refreshes every 10s
var newCount =document.images.length; //Counts images on page

if (GM.getValue('oldCount',-1) === -1){
  GM.setValue('oldCount',newCount);
  window.setTimeout(function(){window.location.reload() ;},refreshRate);
} else {
  if (newCount <= GM.getValue('oldCount')){
      GM.setValue('oldCount',newCount);
      window.setTimeout(function(){window.location.reload() ;},refreshRate);
} else {
     if (newCount > GM.getValue('oldCount')){
         GM.setValue('oldCount',newCount);
         alert('More images!');
      }
}

这是我正在使用的粗略代码。我只是不太确定我哪里出错了——我确定这很简单,但我肯定在挣扎。谢谢!

最佳答案

GM4 中的那些函数(如 GM.getValue )是异步的。这意味着它们返回的值不像在同步 API 中那样立即可用。

在异步代码中,需要等待响应。

注意:您应该获取一次 oldCount 的值并将其缓存,而不是从存储的值中获取一遍又一遍。 元数据 block 中也存在错误。

这是一个基于您的代码的示例(代码已简化)

// ==UserScript==
// @name        Page Refresher
// @include     *
// @grant       GM.getValue
// @grant       GM.setValue
// ==/UserScript==

(async () => {

  const refreshRate = 10000;                      // Refreshes every 10s
  const newCount = document.images.length;        // Counts images on page
  const oldCount = await GM.getValue('oldCount', -1);

  await GM.setValue('oldCount', newCount);        // save new value, wait since refreshing before saving can cause issues

  if (newCount > oldCount){ 
    alert('More images!'); 
  } 
  else { 
    setTimeout(() => { location.reload(); }, refreshRate); 
  } 

})();

关于javascript - 在使用基本的 greasemonkey 脚本时遇到问题 - GM.getValue/GM.setValue(我认为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58124757/

相关文章:

javascript - 在 Dojo 中使用 Sizzle

javascript - Telerik RadEditor for MOSS - 如何抑制最小宽度内联 CSS?

php - Greasemonkey 脚本将 JavaScript 变量与另一个页面的内容进行比较?

javascript - 在显示之前替换任何 HTML 页面中的一些文本

javascript - JS 中 document.appendChild() 的问题

javascript - 使用 jQuery 进行内联编辑

javascript - parseInt 返回 NaN

javascript - 从页面的函数中提取一个值......没有 unsafeWindow?

javascript - 停止执行 Javascript 函数(客户端)或对其进行调整

jquery - 关闭 `@grant none` 会破坏我的 Greasemonkey 脚本吗?