Javascript 如何重新启动代码?(在动态更新的页面上)

Javascript 如何重新启动代码?(在动态更新的页面上),javascript,jquery,greasemonkey,tampermonkey,Javascript,Jquery,Greasemonkey,Tampermonkey,此代码在数据ID之间选择最高数值,并向其添加石灰背景。 代码仅在第一次加载页面时有效,但在加载页面时,数据id发生了变化,因此无法搜索新的数据id。我添加了一个函数,用于再次启动代码,但它不起作用 如何找到正在更改的数据id并添加背景? 我用它来对付猴子和油腻鬼 var i=0,howManyTimes=20; 函数f(){ maxData=$(“.answers li[data id]”)。get().reduce((maxObj,crrntNode)=>{ 变量节点=$(crrntNode

此代码在数据ID之间选择最高数值,并向其添加石灰背景。
代码仅在第一次加载页面时有效,但在加载页面时,数据id发生了变化,因此无法搜索新的数据id。我添加了一个函数,用于再次启动代码,但它不起作用

如何找到正在更改的数据id并添加背景?

我用它来对付猴子和油腻鬼

var i=0,howManyTimes=20;
函数f(){
maxData=$(“.answers li[data id]”)。get().reduce((maxObj,crrntNode)=>{
变量节点=$(crrntNode).data(“id”);
var idVal=parseInt(node.substr(node.length-4),16);
if(idVal>maxObj.value){
maxObj.value=idVal;
maxObj.node=crrntNode;
}
返回maxObj;
},
{值:0,节点:null}
);
//$(“body”).append(`最高的数据id值是${maxData.value}。

`) $(maxData.node).css(“背景”、“石灰”).attr(“id”、“findvalue”); $(document).ready(函数(){//当文档已加载时) setTimeout(函数(){ //document.getElementById(“findvalue”).setAttribute(“id”、“oldvalue”); $('li').css(“背景”,“背景”); },100);//两秒钟后代码将执行。 }); var x=数学地板((数学随机()*500)+1); i++; 如果(i<多少次){ 设置超时(f,x); } } f()

你最喜欢什么颜色?
    紫色 蓝色 黄色 红色
首先,您需要一些东西来再次调用函数,无论您希望这种行为发生多少次

然后,确保在代码中的某个地方将计数器重置回零

i++;
if (i < howManyTimes) {
    setTimeout(f, x);
}
i++;
如果(i<多少次){
设置超时(f,x);
}

只有当计数器小于限制变量时,才会调用setTimeout。重置计数器,调用f()时可以再次调用setTimeout。

您试图破解的页面/站点显然是通过AJAX更新的,这是最适合
waitforkyelments()
MutationObserver
的作业 对于
setTimeout()
,这不是一个很好的用法<不管怎样,code>setInterval()
会更合适

此外,您不需要
$(document).ready
,除非您的脚本设置为
@在文档开始时运行

无论如何,下面是如何使用MutationObserver检测新的/更改的答案:

函数highliteMaxAnswer(){
var maxData=$(“.answers li[data id]”)。get().reduce((maxObj,crrntNode)=>{
//--不信任页面更新数据。但我们知道属性正在更改。
var nodeId=$(crrntNode).attr(“数据id”);
var idVal=parseInt(nodeId.slice(-4),16);
if(idVal>maxObj.value){
maxObj.value=idVal;
maxObj.node=crrntNode;
}
返回maxObj;
},
{值:0,节点:null}
);
$(“.answers li[data id]”)css(“background”,”);
$(maxData.node).css(“背景”、“石灰”);
}
highliteMaxAnswer();
var answerObsrvr=新的变异观察者(answerChangeHandler);
变量obsConfig={
childList:true,attributes:true,子树:true,attributeFilter:['data-id']
};
answerObsrvr.observe(document.body,obsConfig);//如果可能的话,使用容器和身体。
函数answerChangeHandler(mutationRecords){
var answersChanged=假;
mutationRecords.forEach(mutn=>{
if(mutn.type==“属性”)
answersChanged=正确;
else if(mutn.type==“childList”&&mutn.addedNodes&&mutn.addedNodes.length){
for(让多个附加节点的nwNode){
if(nwNode.attributes&&nwNode.attributes[“数据id”]){
answersChanged=正确;
打破
}
}
}
} );
if(answersChanged)highliteMaxAnswer();
}
/*---------------------------------------------------------------------
下面的所有代码都只是为了模拟不断变化的页面。
不要将其包含在脚本中。
*/
$(“按钮”)。单击(函数(){
this.qCnt=this.qCnt | | 1;
这个.qCnt++;
$(“#问题文本”).text(`您最喜欢的颜色是什么${this.qCnt}?`);
$(“.answer”)。每个(函数(){
var newDataId=“58b989006227928090d”+getRandomHexWord();
//--使用attr()和data()来模拟网站的功能。
$(this.attr(“数据id”,newDataId);
} );
} );
函数getRandomHexWord(){
return('0000'+parseInt(65536*Math.random()).toString(16)).slice(-4);
}

你最喜欢什么颜色?
    紫色 蓝色 黄色 红色

模拟新问题
几乎与Q的问题重复:,和。非常感谢你救了我@Brock Adams