Knight000's Blog

随缘写写,不定时更新

0%

油猴脚本对Onclick事件的处理

总结

在脚本中定义函数function abc(){ alert("helloWorld"); },注入onclick事件<a id="a" onclick="abc();">HelloWorld</a>。 爆出函数未定义的错误Function is not defined。 在mozillazine了解到Tampermonkey的js脚本是在sandbox中的,在html中访问不到。 使用下面的例子可以完成这个功能

1
2
3
4
unsafeWindow.abc = function(msg) {
alert(msg);
};
document.getElementById("a").onclick = "window.abc('helloWorld')";

转自Github

总之就是如果要在页面插入一个按钮,要用到onclick事件触发的话,需要用windows来把函数注入进去,windows.后面跟的是你需要调用的函数名称,然后onclick再通过这个名称来调用它。

以下是碎碎念,记录自己折腾的时间

steam夏促了,于是我就找到了论坛上的脚本,自动过Steam探索队列,但作者所提供的版本是没有开关的,每次进去steam就会弹出已完成探索队列的提示,于是乎自己就打算修改下这个脚本,把他在steam上弄个按钮,点击就会执行。然后就开始操作了,当我写完后,测试,点击按钮,好,没反应。控制台报错。然后经过查找资料后,发现了上面的东西,因为油猴脚本是在沙箱里运行的,所以在html里无法访问。修改后就可以正常使用了。按钮位置在安装Steam按钮旁边,直接用了他的样式。

20/8/21更新:发现[安装Steam]按钮会因为已登录steam客户端隐藏,所以改在了信息的旁边,其实还是原来差不多的位置。

原版在帖子里,需要自取。

修改的不多就不把自己加到作者名里了。

成品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// ==UserScript==
// @name Steam自动探索队列
// @namespace https://keylol.com/t157861-1-1
// @version 0.1.1
// @description Steam节庆活动用脚本,自动探索3次队列。
// @author baodongsun
// @match https://store.steampowered.com/
// @grant SteamCN
// ==/UserScript==

(function () {
'use strict';
var butt = $J('<a/>', {
'class': 'header_installsteam_btn_content ',
'id': 'auto_exploration',
'href': 'javascript:void(0);',
'onclick': 'auto_exploration()'
}).text('自动探索');
$J('div[id="header_notification_area"]').prepend(butt);
// 主体内容
unsafeWindow.auto_exploration = function auto_exploration() {
var appids,
running = true,
queueNumber,
progressDialog = ShowAlertDialog('探索中', $J('<div/>').append($J('<div/>', {
'class': 'waiting_dialog_throbber'
})).append($J('<div/>', {
'id': 'progressContainer'
}).text('获取进度...')), '停止').done(abort);

function abort() {
running = false;
progressDialog.Dismiss();
}

function retry() {
abort();
ShowConfirmDialog('错误', '是否重试?', '重试', '放弃').done(auto_exploration)
}

function clearApp() {
if (!running)
return;
showProgress();
var appid = appids.shift();
!appid ? generateQueue() : $J.post(appids.length ? '/app/' + appid : '/explore/next/', {
sessionid: g_sessionID,
appid_to_clear_from_queue: appid
}).done(clearApp).fail(retry);
}

function generateQueue() {
running && $J.post('/explore/generatenewdiscoveryqueue', {
sessionid: g_sessionID,
queuetype: 0
}).done(beginQueue).fail(retry);
}

function beginQueue() {
if (!running)
return;
$J.get('/explore/').done(function (htmlText) {
var cardInfo = htmlText.match(/<div class="subtext">\D+(\d)\D+<\/div>/);
if (!cardInfo) {
abort();
ShowAlertDialog('完成', '已完成全部探索队列');
return;
}
var matchedAppids = htmlText.match(/0,\s+(\[.*\])/);
if (!matchedAppids) {
retry();
return;
}
appids = JSON.parse(matchedAppids[1]);
queueNumber = cardInfo[1];
appids.length == 0 ? generateQueue() : clearApp();
showProgress();
})
}

function showProgress() {
$J('#progressContainer').html('<br>剩余' + queueNumber + '个待探索队列, 当前队列剩余' + appids.length + '个待探索游戏');
}
beginQueue();
}
})();