0

我正在使用 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>

但是,当我将上面的内容直接放在我的网站上时,它会在城市应该出现的任何地方显示未定义。它与我拥有的其他 javascript 一起执行此操作,我想知道我做错了什么......

感谢您的任何见解。:)

4

3 回答 3

3

问题是这一行:

var country=geoip_country();

当您的第一个脚本块执行到该行时,它会崩溃,因为没有这样的函数geoip_country();,这意味着该块中没有后续行被执行,因此调用geoip_city()并且geoip_region()根本不会发生。

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

您需要将该行更改为:

var country=geoip_country_name();

或者,根据您的需要,执行以下操作:

var country=geoip_country_code();

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

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

于 2012-10-10T06:55:08.080 回答
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>
于 2012-10-10T06:30:39.493 回答
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;

};

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

于 2012-10-10T06:30:53.827 回答