fengmingmin 发表于 2022-11-10 15:46:25

GM_addValueChangeListener和GM_getValue在iframe下异常?

今天开发学习通的脚本,在课程页面遇到了一个意想不到的问题,在iframe下注入的脚本,无法实现GM_addValueChangeListener监听,GM_getValue放在定时器里,修改存储参数,前端console.log也无法正常打印。具体如下:
1.脚本注入位置: http://i.chaoxing.com/base 下id为 #frame_content的框架,主框架因为没有什么需要操作的,就没有注入。
2.unsafewindow,storageName都已经设置
3.GM_addValueChangeListener监听storage变化,在其它页面修改这个参数,无法触发响应(可能是在添加完监听器才修改的监听对象),但是把GM_addValueChangeListener放在主页面却可以触发。
4.所有我又在#frame_content下写了如下代码:
window.setInterval(function () {
                console.log();
                const test =GM_getValue("test", []);
                console.log(test);
            }, 2000);

修改存储参数test的值,2秒后也是同样无法触发更新。

这个问题已经困扰我两天了,在线求教育。

fengmingmin 发表于 2022-11-10 16:08:53

另外有没有开发者交流群?

王一之 发表于 2022-11-10 16:17:40

fengmingmin 发表于 2022-11-10 16:08
另外有没有开发者交流群?

有的,但是有门槛

https://bbs.tampermonkey.net.cn/thread-1234-1-1.html

王一之 发表于 2022-11-10 16:24:43

使用的脚本猫吗?也许是bug。。。。贴一下你的代码和管理器、浏览器版本

我使用最新版本的脚本猫(0.10.0),使用如下代码测试正常

```js
// ==UserScript==
// @name         页面脚本
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry to take over the world!
// @author       You
// @match      https://bbs.tampermonkey.net.cn/
// @storageName test
// @grant GM_setValue
// @grant GM_addValueChangeListener
// ==/UserScript==

GM_addValueChangeListener("test-iframe", (a,b,c,d,e) => {
    console.log(a,b,c,d,e);
})

setInterval(() => {
    GM_setValue("test-page", Date.now());
}, 1000);
```

```js
// ==UserScript==
// @name         iframe脚本
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry to take over the world!
// @author       You
// @match      https://googleads.g.doubleclick.net/pagead/*
// @storageName test
// @grant GM_setValue
// @grant GM_addValueChangeListener
// ==/UserScript==

GM_addValueChangeListener("test-page", (a,b,c,d,e) => {
    console.log(a,b,c,d,e);
})

setInterval(() => {
    GM_setValue('test-iframe', Date.now());
}, 1000);
```

fengmingmin 发表于 2022-11-10 17:03:09

本帖最后由 fengmingmin 于 2022-11-10 20:36 编辑

// ==UserScript==

// @name         测试脚本

// @namespace   https://bbs.tampermonkey.net.cn/

// @description 测试

// @version   1.0.0

// @author      脚本作者

// @storageName test

// @grant       unsafeWindow

// @grant       GM_setValue

// @grant       GM_getValue

// @grant       GM_deleteValue

// @grant       GM_addValueChangeListener

// @grant       GM_removeValueChangeListener

// @match       ://mooc2-ans.chaoxing.com/visit/interaction

// ==/UserScript==

/*这个地方不匹配主页面,只匹配下面的名为 “frame_content” 的iframe框架 // @match       ://.chaoxing.com* */

(function () {

'use strict';

const test = GM_setValue("test", 1234);

//运行后控制台2秒显示一次1234,之后在存储内修改test,发现没变化

window.setInterval(function () {

console.log();

const test = GM_getValue("test", []);

console.log(test);

}, 2000);

// Your code here...

})();

fengmingmin 发表于 2022-11-10 17:04:37

fengmingmin 发表于 2022-11-10 17:03


大佬,代码如上

fengmingmin 发表于 2022-11-10 17:07:07

王一之 发表于 2022-11-10 16:24
使用的脚本猫吗?也许是bug。。。。贴一下你的代码和管理器、浏览器版本

我使用最新版本的脚本猫(0.10 ...

浏览器版本
Microsoft Edge
版本 107.0.1418.35 (正式版本) (64 位)

脚本猫使用当前稳定版

王一之 发表于 2022-11-10 17:36:12

fengmingmin 发表于 2022-11-10 17:07
浏览器版本
Microsoft Edge
版本 107.0.1418.35 (正式版本) (64 位)

哥哥试试最新的?另外最好贴一下脚本吧,简化的也行,要能复现你说的问题,我在我这试试

[预发布]脚本猫v0.10.0-beta.1
https://bbs.tampermonkey.net.cn/thread-3540-1-1.html
(出处: 油猴中文网)


能安装这个版本的话最好(得有GitHub账号)
🐛 修复在sandbox页执行BroadcastChannel某些浏览器会报错 #107 · scriptscat/scriptcat@c4d4de4 (github.com)

fengmingmin 发表于 2022-11-10 20:21:06

王一之 发表于 2022-11-10 17:36
哥哥试试最新的?另外最好贴一下脚本吧,简化的也行,要能复现你说的问题,我在我这试试

[预发布]脚本猫v ...

脚本我在上面已经贴了一个简化的,就在5楼

王一之 发表于 2022-11-10 21:10:32

貌似是`@match`的问题,脚本都没有执行,哥哥试试下面这个代码

```js
// ==UserScript==
// @name         测试脚本
// @namespace   https://bbs.tampermonkey.net.cn/
// @description 测试
// @version   1.0.0
// @author      脚本作者
// @storageName test
// @grant       unsafeWindow
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_deleteValue
// @grant       GM_addValueChangeListener
// @grant       GM_removeValueChangeListener
// @match       *://*/visit/interaction*
// ==/UserScript==

/*这个地方不匹配主页面,只匹配下面的名为 “frame_content” 的iframe框架 // @match       ://.chaoxing.com* */
(function () {
    'use strict';
    const test = GM_setValue("test", 1234);
    //运行后控制台2秒显示一次1234,之后在存储内修改test,发现没变化
    window.setInterval(function () {
      console.log();
      const test = GM_getValue("test", []);
      console.log(test);
    }, 2000);
    // Your code here...
})();
```


页: [1] 2
查看完整版本: GM_addValueChangeListener和GM_getValue在iframe下异常?