Helper functions
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greatest.deepsurf.us/scripts/477604/1266047/kiv-lib.js
const waitFor = async (target, selector) => {
return new Promise(resolve => {
if (target.querySelector(selector)) {
return resolve(target.querySelector(selector));
}
const observer = new MutationObserver(mutations => {
if (target.querySelector(selector)) {
resolve(target.querySelector(selector));
observer.disconnect();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
});
};
const gmGet = (url, cache_key) => {
if (cache_key) {
const cachedData = localStorage.getItem(cache_key);
const cachedTimestamp = parseInt(localStorage.getItem(cache_key + "_timestamp"));
if (cachedData && cachedTimestamp && (Date.now() - cachedTimestamp) < 60 * 60 * 1000) {
return JSON.parse(cachedData);
}
}
return new Promise((resolve, reject) => {
GM.xmlHttpRequest({
url,
method: "GET",
onload: (response) => {
resolve(new Response(response.response, { statusText: response.statusText, status: response.status }));
},
onerror: (error) => {
reject(error);
}
});
})
.catch((error) => {
throw { message: "critical error", code: error.status };
})
.then((response) => {
const result = response.json();
return result.then((body) => {
if (typeof body.error == 'undefined') {
if (cache_key) {
localStorage.setItem(cache_key, JSON.stringify(body));
localStorage.setItem(cache_key + "_timestamp", Date.now());
}
return body;
} else {
throw { message: body.error.error, code: body.error.code };
}
});
});
};