JavaScript代码未运行

JavaScript代码未运行,javascript,Javascript,我有以下代码: ...<some code>... ...<elements load>... <script type="text/javascript"> var selected_city = document.getElementById('jform_city').value; var selected_province=document.getElementById('jform_province').value; &

我有以下代码:

...<some code>...
...<elements load>...

<script type="text/javascript">

    var selected_city = document.getElementById('jform_city').value;
    var selected_province=document.getElementById('jform_province').value;

    <!-- set the onchange property for all options in provice to activate getCities() -->
    document.getElementById('jform_province').onchange = function() {
        getCities();
    }

    if(selected_province != ''){
        getCities();
    }
</script>

...<more elements load>....

<script type="text/javascript">
    alert("TEST");
    document.getElementById(selected_city).selected="1";
    </script>
。。。。。。
......
var selected_city=document.getElementById('jform_city')。值;
var selected_province=document.getElementById('jform_province')。值;
document.getElementById('jform_province')。onchange=function(){
getCities();
}
如果(所选省份!=''){
getCities();
}
.......
警报(“测试”);
document.getElementById(选定城市)。selected=“1”;

它从我的下拉列表中选择一个选项,问题是,如果我删除警报(“”,它会因为某种原因停止工作,有什么想法吗?

在尝试使用
document.getElementById
之前,您需要等待文档加载。警报正在将速度减慢到足以在警报框后面加载元素的程度。如果没有警报,当下面的行运行时,很可能没有“selected_city”的元素

有关等待页面加载的更多信息,请查看

编辑

首先,当web浏览器解析页面时,它会将接收到的HTML元素转换为DOM——文档对象模型,这是页面的内存表示形式。只有在元素进入DOM之后,才有可能对其进行操作,而且元素进入DOM的顺序与在HTML中出现的顺序并不一定相同:现代快速浏览器非常异步地运行,只保证页面最终看起来就像整个内容是同步加载的。这很容易验证:几乎每个浏览器都会加载文本,甚至在去获取图像时显示文本。只有在获取图像后,才会将其插入显示器中,如果必须,则推送/回流文本。最终的结果是相同的,但是页面以这种方式加载速度似乎快得多

不幸的是,这种“等待”保证不适用于Javascript(因为JS本身可以更改页面加载的方式)。因此,简单地将脚本标记移动到文档的末尾与等待DOM包含元素不是一回事

实际上,您必须等待浏览器给您回电话,告诉您DOM已经加载——这是真正知道您可以操作DOM的唯一方法。这就是
窗口的作用。onload
用于此回调。我可以想出几个原因,这对你不起作用:

如果您实际上只是插入了verbatim
window.onload=function(),您没有抓住要点-这不是一个空函数,而是您的函数。我假设您并没有直接输入,但以防万一,您的代码应该是

window.onload = function(){
    document.getElementById(selected_city).selected="1";
};
或者,由于
window.onload=[some function]
将稍后调用的函数分配给一个变量,因此只能有一个变量。如果您正在加载另一个脚本,该脚本也会分配
window.onload
,则您的回调可能会丢失

这就是为什么像jquery这样的框架是前端开发人员的黄金,它有一个可以接受和回调任意数量函数的函数。特别询问使用onload

最后,这一行:

var selected_city = document.getElementById('jform_city').value;
还需要在DOM正常运行之前加载它
selected_city
本身可能为null或未定义,因为在请求其值时未加载#jform_city。这反过来会导致
document.getElementById(selected\u city)
失败,即使在您尝试选择该元素时加载了该元素

异步性在Javascript中是一个真正的难题


根据经验,任何时候需要从页面本身获取信息时,都必须等待DOM加载。实际上,这意味着几乎所有代码(除了不需要加载页面的代码)都应该在加载页面后调用的函数中。

在尝试使用
document.getElementById
之前,需要等待文档加载。警报正在将速度减慢到足以在警报框后面加载元素的程度。如果没有警报,当下面的行运行时,很可能没有“selected_city”的元素

有关等待页面加载的更多信息,请查看

编辑

首先,当web浏览器解析页面时,它会将接收到的HTML元素转换为DOM——文档对象模型,这是页面的内存表示形式。只有在元素进入DOM之后,才有可能对其进行操作,而且元素进入DOM的顺序与在HTML中出现的顺序并不一定相同:现代快速浏览器非常异步地运行,只保证页面最终看起来就像整个内容是同步加载的。这很容易验证:几乎每个浏览器都会加载文本,甚至在去获取图像时显示文本。只有在获取图像后,才会将其插入显示器中,如果必须,则推送/回流文本。最终的结果是相同的,但是页面以这种方式加载速度似乎快得多

不幸的是,这种“等待”保证不适用于Javascript(因为JS本身可以更改页面加载的方式)。因此,简单地将脚本标记移动到文档的末尾与等待DOM包含元素不是一回事

实际上,您必须等待浏览器给您回电话,告诉您DOM已经加载——这是真正知道您可以操作DOM的唯一方法。这就是
窗口的作用。onload
用于此回调。我可以想出几个原因,这对你不起作用:

如果您实际上只是插入了verbatim
window.onload=function(),您没有抓住要点-这不是一个空函数,而是您的函数。我假设您并没有直接输入,但以防万一,您的代码应该是

window.onload = function(){
    document.getElementById(selected_city).selected="1";
};
或者,因为