Javascript - 让其他脚本执行,然后继续脚本

我有一个带有几个下拉列表的网站。当在一个下拉列表中选择一个值时,该网站将运行一个JavaScript代码,用于更改其他下拉列表中的选项。Javascript - 让其他脚本执行,然后继续脚本

(例如:我在第一个列表中选择一个国家,并在其下方的下拉列表中填入该国家的城市列表)。

这不是我的网站。我正在尝试创建一个Greasemonkey脚本来填充这些下拉列表的值。我能够使用此jQuery命令模拟选项的选择。

$('select[id="dropdown1"]').val("GBR").trigger('change'); 

这工作正常。它选择顶部下拉菜单中的值。但是,其他人不会,因为他们还没有包含我在那里发送的价值观。

我希望其他下拉列表根据我的选择填充,但直到我的脚本结束才会发生。换句话说,在网站上运行并填充下拉列表的脚本将等待我的脚本结束。

我想实现的是暂停我的脚本,允许网站脚本运行,然后继续我的脚本。换句话说,给网站脚本优先执行。

我试过使用setTimeout,但没有奏效。它甚至会停止更改顶部下拉列表值。

setTimeout(function() { 

$('select[id="dropdown1"]').val("GBR").trigger('change');

}, 3000);

任何想法如何暂停我的脚本,让别人执行,然后继续运行我的脚本?

回答:

它可以与setTimeout一起使用,但不应该在回调中放置“GBR”选项 - 您想要立即执行该部分。而是将其他代码放在那里,它将检查第二个列表是否已填充,如果是,则执行您打算执行的任何操作。

下面是一些一些代码,其中“现有页面”模拟一些虚拟的Ajax服务器提供了一些拉丁词语,比如响应并用于填充第二个列表框:

// Script already on the page -- you can ignore this bit  

$("#dropdown1").change(function() {

$.get("https://jsonplaceholder.typicode.com/posts/" + (this.selectedIndex+1)).then(function (response) {

$("#dropdown2").empty().append(

$.map(response.body.split(" "), function (txt) {

return $("<option>").text(txt)

})

);

});

});

// Your GreaseMonkey script:

$("#dropdown2").empty(); // really empty this, so you can detect when it is populated

$('#dropdown1').val("GBR").trigger('change');

setTimeout(function loop() {

if ($("#dropdown2>option").length) {

console.log('change detected');

return;

}

// Keep trying

setTimeout(loop, 50);

}, 50);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>  

<select id="dropdown1">

<option>Norway</option>

<option>Jemen</option>

<option>Kenya</option>

<option>GBR</option>

</select>

<select id="dropdown2">

</select>

请注意页面加载时如何选择GBR值,并且控制台输出检测到第二个框中的更改。第二位发生在setTimeout回调中。

以上是 Javascript - 让其他脚本执行,然后继续脚本 的全部内容, 来源链接: utcz.com/qa/258457.html

回到顶部