2012-10-10 43 views
0

我使用maxmind的geoip腳本來訪問個人城市和州名,當他們到達我的網站時。這就是我所做的。這個javascript爲什麼說undefined?

我有這個在我的頭:

<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我也有這個,我想知道我在做什麼錯......

謝謝你的任何見解。 :)

+0

也許JS吊射大,文件撰寫被調用加載的lib之前,請嘗試使用它時,文件被加載 – haynar

+0

它不會幫助你的問題,但*請*除去語言屬性([在HTML 4中棄用](http://www.w3.org/TR/REC-html40/interact/scripts.html#adef-language),[從HTML5中刪除](http:/ /www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#the-script-element)),它是* soooo * 1995 !. :-) – RobG

+0

geoip.js對你來說是什麼樣子? – RobG

回答

3

問題是這樣的線:

var country=geoip_country(); 

當第一個腳本塊的執行擊中該線崩潰,因爲沒有這樣的功能如geoip_country();,這意味着在該塊中不晚線被如此的執行撥打geoip_city()geoip_region()的呼叫根本不會發生。

(但由於JavaScript的「提升」機制,city變量本身仍然存在,所以它可以從第二個腳本塊訪問,但仍具有默認值undefined。)

你需要該行更改爲:

var country=geoip_country_name(); 

,或者根據您的需要,來:

var country=geoip_country_code(); 

與該錯誤糾正腳本的其餘部分,你期望應該運行包括獲得這座城市。

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

+1

良好的通話。我並不認爲要查看geoip來確認函數名稱。我也剛剛瞭解到,我不能投我自己的答案。 –

+0

謝謝你的男人!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!! – king

1

該語句可能在DOM準備好之前執行,document.write(city);你可以把它放在功能和呼籲身體負荷。您可以將腳本標籤放在Head中或剛好在關閉的body標籤之前。

而不是使用document.write(),您可以將城市分配給一些span或div或任何html控件。

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


<script language="JavaScript"> 

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

你是不是真的編了myFun或什麼是myFun? – king

+0

我只是給你一個名字,它可以用你喜歡的任何名字作爲你的函數。 – Adil

+0

所以我會將此添加到頁面的頭部? – king

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; 

}; 

這也可以讓你確定在變量被設置(或應該是)後你正在運行輸出。

+0

我改變它的類型,但它沒有改變任何東西。是「window.onload」函數,你的意思是創建一個新的js文件並將它放在那裏,然後加載它類似於geoip腳本?爲了順序,我在body標籤下添加了該腳本,所以shouldn'這意味着它是在其他數據之前加載的嗎?(將信息放在那裏的城市標籤下面是你在上面的窗口中加載的東西) – king

+0

但是你不想開始做文檔。寫()'調用_after_文檔被加載... – nnnnnn

+0

nnnnnn,同意。更改答案包括一個輸出div在城市可以寫入。 –