Javascript 函数在调用之前放置警报时执行
首先,我为这个非常模糊的标题感到抱歉,但我不知道如何命名这个标题。所以,如果有人有更好的名字,请让我知道,我会编辑它 我做了一个计算器,用来计算拥有成本。值的输入来自用户或来自数据库的预设。预设值可以通过选择来选择,我使用Javascript 函数在调用之前放置警报时执行,javascript,json,Javascript,Json,首先,我为这个非常模糊的标题感到抱歉,但我不知道如何命名这个标题。所以,如果有人有更好的名字,请让我知道,我会编辑它 我做了一个计算器,用来计算拥有成本。值的输入来自用户或来自数据库的预设。预设值可以通过选择来选择,我使用onchange事件来更改输入数据 <select id="myID" onchange="getPreset(this.value)"> <option>Some options...</option> </select>
onchange事件
来更改输入数据
<select id="myID" onchange="getPreset(this.value)">
<option>Some options...</option>
</select>
这就是我的代码现在的样子,它可以正常工作。但是在我放置calculate()之前
afterxmlhttp.send()代码>,它没有按应有的方式工作。数据是在我选择了另一个选项后才计算出来的。例如:我第一次选择选项1-什么都没有发生。第二次选择选项2时,数据会像选择选项1一样进行计算
我知道它只是放置函数的错误位置,但我发现奇怪的是:如果我在调用函数之前放置警报,数据确实会被计算出来。因此,我的代码如下(因此您可以直观地看到):
因为我不知道这是为什么,我很想知道,我在这里问。我希望有人能帮我解释一下。这是因为一切都是异步的。当警报弹出时,你(最终)会得到数据并正确计算。这就是它起作用的原因。如果连接速度非常慢,或者您在警报按钮上极快地单击“确定”,则可能会失败。这就是为什么你应该把它放在正确的位置:)首先,如果选择了相同的选项(即重新选择第一个选项),你就不能执行onchange
事件。我也尝试了onblur
,得到了相同的结果。这一切都是关于calculate
函数的放置。我发现奇怪的是,在调用错误位置的函数之前放置警报确实可以使其工作。在第二个示例中,调用的calculate()
函数紧跟在AJAX调用之后,这是不同步的,因此它没有任何数据可供计算。因为calculate()
是在AJAX调用完成之前执行的。也许第二次,它能够使用从第一次AJAX调用中收集的变量,从而计算它们;为返回的值提供更多时间。因为警报毕竟是一个控制流语句&停止执行流。我明白了。编辑:问题已回答。谢谢(:我完全忘记了AJAX是异步的,因为我对它缺乏经验。今天又学到了另一个教训!@RobbeVanWinckel有点好笑,你忘记了“异步JavaScript和XML
”是异步的;)@Teemu Haha,我知道:当我看到AJAX代表什么时,我真的很惊讶。但是,嘿,愚蠢的错误是最常见的事情;)
function getInfo(name){
var xmlhttp;
if(window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
xmlhttp.onreadystatechange = function()
{
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var info = JSON.parse(xmlhttp.responseText);
//process data
calculate();
}
}
xmlhttp.open("GET", "myphppage.php?name="+name, true);
xmlhttp.send();
}
xmlhttp.onreadystatechange = function()
{
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var info = JSON.parse(xmlhttp.responseText);
//process data
}
}
xmlhttp.open("GET", "myphppage.php?name="+name, true);
xmlhttp.send();
alert("make it work.");
calculate();
}