完整代碼如下,很簡單的代碼
// ==UserScript==
// @name test
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://live.bilibili.com/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
;(function func() {
const anchor = document.getElementsByClassName('right-action')[0];
console.log(anchor);
if (anchor) {
console.log('find injectAnchor');
return false;
} else {
requestAnimationFrame((function () {
func();
}))
}
})();
})();
如果您有空可以跑一下,腳本匹配任意b站直播間。
腳本干的事兒就是在requestanimationframe里獲取類名包含right-action的元素,沒有就回圈執行,直到找到位置。就這么簡單的事情,就出問題了。腳本在執行程序中會有一個瞬間找到這個元素,進入if,并且列印出"find injectAnchor"這句話,但是腳本并不會停下來,會繼續運行,并且之后再也找不到'right-action'這個元素了,效果如下:

研究一天了也沒試明白,tm里其他腳本我也給刪了,甚至tm和chrome都重裝了一遍,也不行。火狐我試了一下也不行。分號加上或者去掉,requestanimationframe換成settimeout或者setinterval,函式、變數直接綁系結到window上都不管用。去掉閉包直接用函式呼叫,return false加或者不加也試了,也不管用。實在沒轍了...我上谷歌搜甚至都不知道該搜什么,求各位dalao解答。
uj5u.com熱心網友回復:
找到了問題所在了,問題在于tempermonkey用來匹配網址的標簽@match和@include,如果使用的匹配地址形如www.example.com/*就會出現這種問題,如果使用具體地址如www.example.com/123456就不會有這種問題。但是還不知道解決方案是什么...匹配地址總不能一個一個寫吧
uj5u.com熱心網友回復:
找到了問題所在了。問題在于,在tempermonkey用來匹配網址時匹配時輸入了一個live.bilibili.com/*這樣一個地址,而b站直播在頁面中嵌入了一個不可見的iframe,這個iframe的地址是live.bilibili.com/p/,自然也被匹配到了,所以tampermonkey在這個iframe標簽中又開啟了一個執行緒,而這個iframe里都是一些meta標簽,所以也就是控制臺為什么會不停輸出未找到元素。
uj5u.com熱心網友回復:
可以排除某個網址,也可以在腳本里判斷網址是否符合條件,不符合就不執行。還可以判斷頁面特征來決定是否執行轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/72354.html
標籤:JavaScript
