为什么这个javascript一直在说undefined?

时间:2012-10-10 06:25:41

标签: javascript html

我正在使用maxmind的geoip脚本,以便在访问者访问我的网站时调出访问者的个人城市和州名称。这就是我所做的。

我的标题中有这个:

<script language="JavaScript" src="http://j.maxmind.com/app/geoip.js"></script>

然后,在我的<body>标记下,我有以下内容:

<script language="JavaScript">
var country=geoip_country();
var region=geoip_region();
var city=geoip_city();
if(country=="")
    country="US";
if(region=="")
    region="New York";
if(city=="")
    city="New York";
</script>

然后,为了显示访客的城市,我把它放在:

<script language="JavaScript">document.write(city);</script>

但是,当我将上面的内容直接放在我的网站上时,它会显示 undefined ,无论城市应该出现在哪里。它与我拥有的其他JavaScript一起做到这一点,我想知道我做错了什么......

感谢您的任何见解。 :)

3 个答案:

答案 0 :(得分:3)

问题在于这一行:

var country=geoip_country();

当第一个脚本块的执行命中该行时,它会崩溃,因为没有geoip_country();这样的函数,这意味着该块中没有后续行被执行,所以调用geoip_city()和{{ 1}}根本不会发生。

(但由于JavaScript的“提升”机制,geoip_region()变量本身仍然存在,因此可以从第二个脚本块访问它,但仍然具有默认值city。)

您需要将该行更改为:

undefined

或者,根据您的需要,:

var country=geoip_country_name();

更正错误后,脚本的其余部分应按预期运行,包括获取城市。

演示:http://jsfiddle.net/2kbeg/

答案 1 :(得分:1)

语句可能在DOM准备好之前执行,document.write(city);你可以把它放在功能中并调用身体负荷。您可以将脚本标记放在Head中,也可以放在关闭body标记之前。

您可以将城市分配给某个span或div或任何html控件,而不是使用document.write()。

<body onload="myFun();" >........
<div id="city" ></div>


<script language="JavaScript">

function myFun()
{
  // document.write(city);
    document.getElementById('city').innertText = city;
}
</script>

答案 2 :(得分:1)

对于链接资源,我认为您需要指定类型,而不是语言:

<script type="text/javascript" src="http://j.maxmind.com/app/geoip.js"></script>

编辑:根据评论,是的,写入指定的输出区域会更好:

<div id="OutputDiv">No output yet.</div>

您也可能希望将默认设置放入window.onload函数,而不是立即运行:

window.onload = function() {
    //Your code here
    var country=geoip_country();
    var region=geoip_region();
    var city=geoip_city();
    if(country=="")
        country="US";
    if(region=="")
        region="New York";
    if(city=="")
        city="New York";

    //document.write(city);
    var outputDiv = document.getElementById('OutputDiv');
    outputDiv.innerHTML = "City is " + city;

};

这也可以让您确定在设置(或应该是)变量后运行输出。