2012-08-17 50 views
1

我有以下代碼獲取用戶當前的郵編,並顯示他們在一個div:附加jQuery代碼運行onLoad並點擊按鈕?

(function ($, geolocation) { 
    if (geolocation) { 
     geolocation.getCurrentPosition(function (position) { 
      $.getJSON(
       "http://ws.geonames.org/findNearestAddressJSON?callback=?", 
       { 
        lat : position.coords.latitude, 
        lng : position.coords.longitude 
       }, 
       function (data) { 
        $(function() { 
         $('#zip').text(data.address.postalcode); 
        }); 
       } 
      ); 
     }); 
    } 
}(jQuery, navigator.geolocation)); 

代碼運行on document ready,我相信。這是否與運行onLoad的代碼相同?總之,單擊按鈕時是否可以運行此代碼?我想這樣的事情會的工作,但使用這種不產生郵政編碼on document ready,或點擊該按鈕時:

function update() { 
    ...code from above 
} 
$('#button').click(function(){update();}); 

回答

3

這不會對document.ready除了代碼(一個function (data) { }調用內部的一部分運行。

沒有,document.readyonLoad不同。document.ready是當DOM是通過JavaScript訪問(但不一定是渲染/提取); onLoad是當所有東西都被加載(並且大概呈現---思考圖像等)

要在按鈕單擊時運行相同的函數,沒有正確的軌道,你想有一個參考功能:

var update = function ($, geolocation) { 
    // blah 
}; 
// this will call the same function like you're doing above 
update(jQuery, navigator.geolocation); 

然後必須通過一個點擊處理程序運行:

// don't forget that this has to be in a document.ready handler 
jQuery(function ($) { 
    $('#button').click(function() { update($, navigator.geolocation); }); 
}); 
+0

是否有任何方法來測試該按鈕是否再次調用原始腳本?我猜我可以將結果記錄到控制檯? – Charlie 2012-08-17 15:52:20

+1

除非你以某種方式削弱了'update'函數的引用(或者它不能從你設置''click''的地方看到),否則你應該調用原始函數。如果有疑問,你總是可以嘗試使用'console.log()'調用或其他東西。 – 2012-08-17 16:01:00

1

代碼在文檔準備好運行,我相信。這與運行onLoad的代碼相同嗎?

onload event是當整個頁面從服務器獲取,所有圖像標記或其他元素loaded.That肯定是要花費很長的時間發射,jQuery使用名爲document.ready它自己定義的事件,即得到的發射當頁面準備處理您的腳本(這將發生之前您的文檔加載)

這是從JQuery的啓蒙書改編:

本地JavaScript事件可用於 在window.onload編程方式處理當一個網頁已經compl在 瀏覽器中載入。但是,因爲事件指示加載的所有資源( )在所有資產(圖片,Flash等)加載之前都不會觸發,所以等待此事件可能會相當耗時。更好的解決方案 可能會在DOM可用時立即開始腳本編寫,即 。 jQuery提供了一個自定義事件,在 DOM準備好腳本化之前但在window.onload事件觸發之前執行。 這是一個名爲ready()的自定義jQuery事件。有一個參數 傳遞給這個函數,它是對jQuery函數的引用。

而對於點擊功能,您的更新功能在哪裏?嘗試在document.ready之外定義它。

2

代碼放在自己的功能,並呼籲載荷功能。然後有你的按鈕onclick(getZipCode()),這也將調用相同的功能。如果你不想要它,請將其從$(function() {}); jQuery中刪除。

$(function() { 
    //On Document Ready, call getZipCode 
    getZipCode(navigator.geolocation); 
}); 

function getZipCode(geolocation) { 
    if (geolocation) { 
     geolocation.getCurrentPosition(function (position) { 
      $.getJSON(
       "http://ws.geonames.org/findNearestAddressJSON?callback=?", 
       { 
        lat : position.coords.latitude, 
        lng : position.coords.longitude 
       }, 
       function (data) { 
        $(function() { 
         $('#zip').text(data.address.postalcode); 
        }); 
       } 
      ); 
     }); 
    } 
}