2017-12-02 275 views
0

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

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

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

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

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

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

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

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

setTimeout(function() { 
    $('select[id="dropdown1"]').val("GBR").trigger('change'); 
}, 3000); 

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

+0

如何加载其他下拉列表的选项? – dferenc

+0

你不应该把这段代码放在'setTimeout'回调中,而是另一个二级代码,它与其他列表一起工作。 – trincot

+0

你在Firefox上使用Greasemonkey 4吗? –

回答

0

它可以与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回调中。

+0

谢谢你的代码。我将首先尝试上面提出的WFKE解决方案,如果这不起作用,我会尝试您的解决方案,并让您知道它的工作原理。 –