所以,我有这个用户脚本会在页面内查找字符串。如果它找不到它,它会在4秒后刷新页面:
var item = 'apple';
if(document.body.innerHTML.toString().indexOf(item) > -1){
setTimeout(function() {
alert(item + " was found");
}, 150);
}else{
setTimeout(function()
{
location.reload(true);
}, 4000);
}
此代码运行正常。但后来,我想用一个数组搜索多个项目:
var item = [
'apple',
'peach'
];
for (var i = 0; i < item.length; i++){
if(document.body.innerHTML.toString().indexOf(item[i]) > -1){
player.play();
setTimeout(function() {
var curitem = item[i];
alert(item[i] + " was found");
}, 200);
}
}
//else{
// setTimeout(function()
// {
// location.reload(true);
// }, 4000);
//}
但是我被困住了,我不知道:
答案 0 :(得分:2)
有几种方法可以做到这一点。我更喜欢正则表达式,因为它提供更大的功率,并且通常比循环更快,对于大量的术语。
代码如:
var items = [
'apple',
'peach'
];
var itmRegEx = new RegExp (`(${ items.join("|") })`);
var itmMtch = document.body.innerHTML.match (itmRegEx);
if (itmMtch && itmMtch.length) {
//player.play();
//setTimeout (alert, 200, itmMtch[1] + " was found");
setTimeout (console.log, 200, itmMtch[1] + " was found");
}
else {
console.log ("Reloading...");
//setTimeout ( () => {location.reload (true);}, 4000);
}
&#13;
注意:
toString()
是不必要的。'apple\\b'
这样的表达式 - 匹配&#34; apple&#34;但不是&#34; apple&#34;。innerHTML
。这将匹配像
<a href="virusserver.net/badapple">free!</a>
。textContent
。setTimeout()
。document.body
施放宽阔,缓慢的网。如果可以,请按类或ID定位您感兴趣的节点。location.reload
是一种特殊情况,setTimeout()
的参数化版本不起作用。 (它给出&#34;非法调用&#34;错误。)答案 1 :(得分:1)
这将在数组中找到第一个匹配项。此处使用Div id content
,因为脚本是示例代码段中正文的一部分。
var item = [
'apple',
'peach'
];
//make sure that items dont contain special regex chars
var itemRe = new RegExp(item.join("|"));
var result = document.getElementById("content").innerHTML.toString().match(itemRe);
if (result) {
//player.play();
setTimeout(function() {
alert(result.toString() + " was found");
}, 200);
} else {
setTimeout(function() {
location.reload(true);
}, 4000);
}
&#13;
<div id="content">gfg</div>
&#13;