2009-03-03 66 views
0

我一直在旅遊和開發過去幾周。 我正在開發的網站運行良好。你將如何調試此javascript問題?

然後,有一天,我連接到一個網絡和頁面看起來很好,但事實證明,JavaScript沒有運行。我檢查了螢火蟲,並沒有錯誤,因爲我懷疑可能沒有加載腳本(我使用的是谷歌api的jQuery和jQuery UI,以及加載谷歌地圖api和fbconnect)。 我會懷疑,如果問題是與這些頁面中的一個不加載我會得到一個錯誤,但沒有什麼。

想到也許我沒有正確連接或什麼東西,我重新連接到網絡,甚至重新啓動我的電腦,以及試圖運行本地版本。我什麼也沒得到。 本地版本沒有運行也暗示我,它是一個外部JavaScript導致問題的加載。

我讓它通過一個奇怪的網絡。不幸的是,現在我距離100英里遠。

今天,我的兄弟給我發了一封電子郵件,說他在機場的網絡不會加載我的網頁。同樣的問題。一切都佈置得恰到好處,部分佈局設置在Javascript中,所以很明顯,JavaScript正在運行。

他也沒有錯誤。當然,他上了飛機,現在他不再在機場了。現在,該網站在他的電腦上工作(我沒有改變任何東西)。

你究竟怎麼去弄清楚在這種情況下發生了什麼?這可能是12個左右的網絡中的兩個。但我不知道我會如何找到一個不起作用的網絡(並且住在一個小鎮上,我可能很難找到一個不起作用的網絡)。

任何想法? 該網站仍然在開發中,所以我寧願不發佈鏈接(但可能在幾天內)。 我可以看到不能正常工作的是在加載時調用的JavaScript函數,並且是點擊。所以我認爲這是一個JavaScript問題,但沒有錯誤。

如果我能找到並坐在其中一個網絡上,這不會是一個巨大的問題,但我不能。那麼你會怎麼做?

編輯--------------------------------------------- ------------- 第一個沒有被調用的函數(s - 它們的鏈接)在下面。 由於沒有進行調用,我已經將.ajax調用的代碼剪掉了。

function getResultsFromForm(){ 

    jQuery('form#filterList input.button').hide(); 
    var searchAddress=jQuery('form#filterList input#searchTxt').val(); 
    if(searchAddress=='' || searchAddress=='<?php echo $searchLocation; ?>'){ 
     mapShow(20, -40, 0, 'areaMap', 2); 
     jQuery('form#filterList input.button').show(); 
     return; 
    } 

    if (GBrowserIsCompatible()) { 
     var geo = new GClientGeocoder(); 
     geo.setBaseCountryCode(cl.address.country); 

     geo.getLocations(searchAddress, function (result) 
       {  

       if(!result.Placemark && searchAddress!='<?php echo $searchLocation; ?>'){ 
       jQuery('span#addressNotFound').text('<?php echo $addressNotFound; ?>').slideDown('slow'); 
       jQuery('form#filterList input.button').show(); 

       } else { 
       jQuery('span#addressNotFound').slideUp('slow').empty(); 
       jQuery('span#headerLocal').text(searchAddress); 
       var date = new Date(); 
       date.setTime(date.getTime() + (8 * 24 * 60 * 60 * 1000)); 
       jQuery.cookie('address', searchAddress, { expires: date}); 
       var accuracy= result.Placemark[0].AddressDetails.Accuracy; 

       var lat = result.Placemark[0].Point.coordinates[1]; 
       var long = result.Placemark[0].Point.coordinates[0]; 
       lat=parseFloat(lat); 
       long=parseFloat(long); 
       var getTab=jQuery('div#tabs div#active').attr('class'); 

       jQuery('div#tabs').show(); 
       loadForecast(lat, long, getTab, 'true', 0); 
       var zoom=zoomLevel(); 
       mapShow(lat, long, accuracy, 'areaMap', zoom); 

       } 
       }); 
    } 


} 


function zoomLevel(){ 

    var zoomarray= new Array(); 
    zoomarray=jQuery('span.viewDist').attr('id'); 
    zoomarray=zoomarray.split("-"); 
    var zoom=zoomarray[1]; 
    if(zoom==''){ 
     zoom=5; 
    } 
    zoom=parseFloat(zoom); 
    return(zoom); 

} 
function loadForecast(lat, long, type, loadForecast, page){ 

    jQuery('div#holdForecast').empty(); 
    var date = new Date(); 
    var d = date.getDate(); 
    var day = (d < 10) ? '0' + d : d; 
    var m = date.getMonth() + 1; 
    var month = (m < 10) ? '0' + m : m; 
    var year='2009'; 
    toDate=year+'-'+month+'-'+day; 

    var genre=jQuery('span.genreblock span#updateGenre').html(); 


    var numDays=''; 

    var numResults=''; 


    var range=jQuery('span.viewDist').attr('id'); 
    var dateRange = jQuery('.updateDate').attr('id'); 
    jQuery('div#holdShows ul.showList').html('<li class="show"><div class="showData"><center><img src="../hwImages/loading.gif"/></center></div></li>'); 

    jQuery('div#holdShows ul.'+type+'List').livequery(function(){ 
      jQuery.ajax({ 
type: "GET", 
url: "processes/formatShows.php", 
data: "output=&genre="+genre+"&numResults="+numResults+"&date="+toDate+"&dateRange="+dateRange+"&range="+range+"&lat="+lat+"&long="+long+'&page='+page, 
success: function(response){ 

編輯2 ------------------------------------- ----------------------------------------

請注意,問題不在於我無法加載網站,網站在大多數連接上都能正常工作,但有時網站無法正常工作,並且沒有發生錯誤,也沒有任何更改。我的兄弟今天早些時候無法運行它,而我沒有問題,所以這與他的位置/網絡有關。然而,頁面加載,他有一個連接,這是他第一次訪問該網站,所以沒有任何兌現。和幾天前我遇到問題時一樣。我沒有改變任何東西,我到了另一個網絡,一切正常。

+0

讓我看看代碼! – 2009-03-03 01:23:26

+0

啊!問題的一部分。你真的要通過900行代碼,我不知道起點嗎?如果是這樣,我會發布它,但我有點懷疑。 我將編輯以顯示未被調用的第一個函數。 – pedalpete 2009-03-03 01:29:35

回答

1

有兩件事情:第一 - 在開發時獲取JavaScript本地到您的網站。從其他地方加載它來利用緩存是一個優化,我會離開到最後。我也只能從高可用性的遠程站點(如Google)加載它,以最大限度地減少問題。其次,在不啓用JavaScript的情況下,使您的網站至少可以輕鬆使用。例如,使用表單回傳,它可以從加載頁面時運行的JavaScript中的Ajax功能替換。你可能無法得到所有的東西,但我發現我可以讓大多數東西在沒有JavaScript的情況下工作,至少是一種可行的,如果不是優雅的時尚。

我知道這並不能解決您的眼前問題,但我認爲這將有助於您的網站在這樣的情況下,面對仍然可用。

+0

感謝tvanfosson,我很驚訝你會推薦在本地託管JavaScript,如果我以後要從遠程站點加載,就好像這是問題,我不會在測試中發現它。 該網站是高度地圖中心,所以沒有阿賈克斯不是一個真正的選擇。 – pedalpete 2009-03-03 03:17:14

0

如果某些JS由一個不同的服務器託管(例如:如果您從jQuery站點包含類似jQuery的東西而不是自己託管它的副本),那麼這些站點中的一個可能暫時關閉。

您可以嘗試使用「Live HTTP Headers」(可在the Mozilla Addons site)實時觀看HTTP標頭,這在進行Web開發時非常有用。你應該能夠很快地確定你的所有JS實際上是否加載正確。

您也可以使用像抓包或Wireshark的,但是這可能是一個有點笨拙,當你需要的是看到了請求/響應頭。使用插件遠不那麼麻煩。

0

有幾件事情:

1),您包括您的腳本...確保你有一個單獨的結束標記!不要自己關閉它們。

<script src="..."/><!--self-closing will fail, --> 

<script src="..."></script><!--this will work --> 

2.)有沒有原因,你爲什麼使用jQuery()而不是$()?

3.)您的SERVER是否指定了您的本地環境沒有的DOCTYPE?

4.)你在測試什麼瀏覽器?特別是你在IE中測試,如果它在Firefox中工作?

5.)如果無法提供URL,您可以發佈一些生成的代碼嗎?

+0

感謝您的回覆Scunliffe,我認爲您錯過的一件事是該網站95%以上的時間工作,您在這裏指定的大部分內容似乎是導致網站總是失敗的原因。 答案1)是我關閉2)jQuery因爲FB 3)不,4)所有瀏覽器5)貼一些代碼 – pedalpete 2009-03-03 03:16:05

+0

啊哈!好的,如果它影響到所有瀏覽器,並且95%的時間工作,那麼我懷疑這是一個時間問題......腳本在準備好/加載之前嘗試訪問某些內容,或者在加載時導致外部源停滯瀏覽器在加載它們時「放棄」。 – scunliffe 2009-03-03 13:23:11

0

一旦你確信所有的腳本加載按預期在開發環境,你可以嘗試要麼刪除它們一個接一個從頁面,看看哪一個再現您遇到的問題 - 那麼這就是腳本那不是加載。

螢火蟲的淨標籤這確實非常相似,活HTTP標頭呢,甚至跟蹤負載的時序和任何Ajax請求的東西。

0

我幾乎總是推薦Firefox插件「Firebug」。

首先,你可以檢查腳本來檢查,他們已加載,這將排除「它沒有從遠程源加載」的問題。

其次,它會顯示出現在JavaScript控制檯中的錯誤,這可能會指出,其實顯得悄無聲息之前。

最後,在使用來自其他域的JavaScript時,請留意跨站腳本問題。

1

原來這個問題是假設谷歌地圖可以通過IP地址可靠地在北美找到任何緯度/經度。

我添加

if(!google.loader.ClientLocation)
函數的谷歌無法找到通過ip的位置的情況。

最奇怪的是我在帕洛阿爾託市中心的一個辦公室遇到了這個錯誤,我認爲這個錯誤會被Google地理編碼器嚴重映射。