cxxjackie
发表于 2023-5-20 20:52:28
TheWQ 发表于 2023-5-20 11:31
这样写错了吗
/* global elmGetter */
// ad-floor-cover ad-report
看起来似乎没错,你是运行遇到什么问题了吗?如果运行也报not defined错误,检查下你的引用地址是否正确,2.0版本才取消的实例化,看看是否引用的旧版本。
另外,如果回调函数相同,选择器可以合并处理:
elmGetter.each('.b-img__inner, .ad-floor-cover, .ad-report', document, laji => {
laji.style.display='none'
});
脚本体验师001
发表于 2023-6-4 07:10:11
测试代码
```js
// ==UserScript==
// @name 打开音乐文件夹测试
// @namespace https://bbs.tampermonkey.net.cn/
// @version 0.1.0
// @descriptiontry to take over the world!
// @author You
// @match https://cloud.189.cn/web/main/file/folder/71461113680969543
// @require https://scriptcat.org/lib/513/2.0.0/ElementGetter.js
// @run-at document-start
// @grant unsafeWindow
// ==/UserScript==
(function () {
'use strict';
/*
// 这个成功 {isTrusted: true}
elmGetter.get('div').then(div => {
console.log('节点必须有', div);
loadScript('https://code.jquery.com/jquery-3.6.4.min.js').then(success => {
console.log('success', success);
console.log('jQuery:', unsafeWindow?.jQuery?.fn?.jquery || 'loadScript 失败了');
}, error => {
console.log('error', error);
});
});
*/
// 这个失败 {isTrusted: false},script未写入
elmGetter.get('.p-web-audioplayer').then(div => {
console.log('节点必须有', div);
loadScript('https://code.jquery.com/jquery-3.6.4.min.js').then(success => {
console.log('success', success);
console.log('jQuery:', unsafeWindow?.jQuery?.fn?.jquery || 'loadScript 失败了');
}, error => {
console.log('error', error);
});
});
function loadScript(src) {
if (!window.instances) {
window.instances = {};
}
if (!window.instances) {
window.instances = new Promise((resolve, reject) => {
const script = document.createElement("script")
script.src = src;
script.type = "text/javascript";
script.onload = resolve;
script.onerror = reject;
document.head.appendChild(script);
});
}
return window.instances;
};
// Your code here...
})();
```
感觉上在 new MutationObserver 之前或者使用 MutationObserver 后尽可能快的写入script标签是成功的
反之无法写入(document.head里没有),直观表现就是返回状态仍是success ,但 isTrusted: false
手写 MutationObserver 触发代码似乎表现也一样的
搞不懂喽,请老师看一下属于什么事故这是
猫和猴子表现也不一样,猫直接没找到节点 @王一之
王一之
发表于 2023-6-4 11:15:01
脚本体验师001 发表于 2023-6-4 07:10
测试代码
```js
// ==UserScript==
初步排查出来了,脚本猫在这行返回的null
const node = query(false, selector, el, true, curMode);
具体原因我再看看
王一之
发表于 2023-6-4 12:17:54
脚本体验师001 发表于 2023-6-4 07:10
测试代码
```js
// ==UserScript==
不对,整体的执行逻辑是可以的,问题在于console.log脚本猫没有拿到最原始的console.log,被网页的替换掉了,网页的会屏蔽掉日志内容
这个问题和脚本猫的脚本注入逻辑有关系,后续会进行处理,不过改动可能会稍大
脚本体验师001
发表于 2023-6-4 13:35:15
王一之 发表于 2023-6-4 12:17
不对,整体的执行逻辑是可以的,问题在于console.log脚本猫没有拿到最原始的console.log,被网页的替换掉 ...
哥哥确实明智
再测试 GM_log 页面会报错,console.info打印正常
console.log这么香的吗,页面都喜欢把console.log牢牢抓在手里像亲的一样
甚至猜测有些还会上报log信息
在我们的猫儿没整好这个之前,需要注意一下这个点
王一之
发表于 2023-6-4 18:46:10
脚本体验师001 发表于 2023-6-4 13:35
哥哥确实明智
再测试 GM_log 页面会报错,console.info打印正常
console.log这么香的吗,页面都喜欢把con ...
GM_log没问题的哥哥是不是没
// @grant GM_log
脚本体验师001
发表于 2023-6-4 19:39:12
王一之 发表于 2023-6-4 18:46
GM_log没问题的哥哥是不是没
// @grant GM_log
!$R1N.png](data/attachment/forum/202306/04/193747ge5f2dia952dsine.png)!(data/attachment/forum/202306/04/193813u46yex8yq9uazr9a.png)
GM_log没有输出,还引发了错误
脚本体验师001
发表于 2023-6-4 19:44:34
// ==UserScript==
// @name New Userscript
// @namespace https://bbs.tampermonkey.net.cn/
// @version 0.1.0
// @descriptiontry to take over the world!
// @author You
// @match https://cloud.189.cn/web/main/file/folder/71461113680969543
// @require https://scriptcat.org/lib/513/2.0.0/ElementGetter.js
// @grant GM_log
// ==/UserScript==
(function () {
'use strict';
GM_log('GM_log运行');
elmGetter.get('div').then(div => {
GM_log(div);
});
// Your code here...
})();
王一之
发表于 2023-6-4 22:11:06
脚本体验师001 发表于 2023-6-4 19:39
!$R1N.png](data/attachment/forum/202306/04/193747ge5f2dia952dsine.png)!
好像是,不过没有影响,先记录下来了
cxxjackie
发表于 2023-6-4 22:43:12
脚本体验师001 发表于 2023-6-4 07:10
测试代码
```js
// ==UserScript==
我没这个云盘账号来测试,但大致能推测出原因:第一种情况是因为页面中本身就有div,elmGetter.get几乎是同步的,此时页面中的多数js都未执行;第二种应该是页面js在监听到script插入时手动触发了一个load事件,只有这种isTrusted才会是false,可以用以下代码模拟:
elmGetter.each('script', script => {
script.dispatchEvent(new Event('load'));
});
onload实际发生了多次,只是由于Promise的机制,第一次resolve后就忽略了后面的,所以造成回调函数提早触发了,改成这样应该就能解决问题:
script.onload = e => e.isTrusted && resolve(e);
页:
1
2
3
4
5
6
7
8
9
[10]
11
12
13
14
15