2011-09-22 320 views
0

我在文本字段上使用Google自動填充api來在您鍵入時提示位置。 我遇到的主要問題是,Google不會讓您將結果限制在特定的國家/地區,它只會讓您將結果偏向區域邊界,這種做法是無用的。如何通過javascript刪除keyup事件監聽器

因此,尋找術語"ru"將會給你俄羅斯的建議,即使你的地區設置在歐洲的某個地方。

我意識到,如果你把例如「法國汝」它給你法國的位置只匹配RU是完美的。

所以我的問題是,autocomple完全由谷歌JavaScript構建。

autocomplete = new google.maps.places.Autocomplete(input, options); 

所以我不能很容易地搜索字符串搗鼓在不斷地增加它"france"

我可以看到什麼是綁定到onkeyup事件在該領域,並可以把它並把它自己,但是我不能從keyup中解除它。我嘗試了幾個解決方案,但是找不到方法。 jQuery解綁定將不起作用,因爲這顯然不是通過它綁定的。本地函數需要引用綁定到監聽器的函數,但這是其中的匿名函數。用element.data['events']找到了一些使用循環的例子,但是我得到了數據未定義的錯誤。

有沒有人解決所有在onkeyup中註冊的東西?

回答

0

你提到的jQuery,所以我會使用:

$(input).data('events').keyup是將包含所有keyup處理器陣列。如果只有一個由自動完成功能使用keyup事件,你可以劫持的處理程序第一次運行什麼功能,你需要的,然後運行原:

var originalKeyup = $(input).data('events').keyup[0].handler; 
$(input).data('events').keyup[0].handler = function(){ 
    // your code here, where you can add 'france' to input.value 

    // fire the old function 
    originalKeyup.apply(this,arguments); 
}; 

你也只是從KEYUP數組中刪除原來的事件處理程序,並綁定新的會做你想做的事情。


UPDATE: 您可以劫持Element.prototype.addEventListener(前將所有代碼)的events屬性添加到元素將包含任何代碼添加任何處理程序:

var oldAddEventListener = Element.prototype.addEventListener || Element.prototype.attachEvent; 
Element.prototype.addEventListener = Element.prototype.attachEvent = function(type, handler){ 
    this.events = this.events || {}; 
    this.events[type] = this.events[type] || []; 
    this.events[type].push({handler: handler}) 
    oldAddEventListener.apply(this,arguments); 
}; 

現在,每次調用addEventListener時,都會通過jQuery或其他方式調用元素的events屬性,並使用當前事件進行更新。您可能還需要劫持removeEventListener刪除從events對象相應的事件時removeEventListener叫做:

var oldREL = Element.prototype.removeEventListener || Element.prototype.detachEvent; 
Element.prototype.removeEventListener = Element.prototype.detachEvent = function(type, handler){ 
    this.oldREL.apply(this,arguments); 
    if(this.events && this.events[type]){ 
     for(var i=this.events[type].length-1; i>=0; i--){ 
      if(this.events[type][i].handler == handler){ 
       this.events[type].splice(i,1); 
       break; // remove only the first occurrence from the end 
      } 
     } 
     if(this.events[type].length==0){ 
      delete this.events[type]; 
     } 
    } 

};

現在你應該能夠檢查任何元素上註冊的所有事件。您可以遍歷input.events.keyup對象並使用input.removeEventListener刪除所有'keyup'事件。

attachEventdetachEvent用於IE < 9.我沒有IE,所以它沒有在那裏測試過。它在Safari 5中運行良好。如果您在其他瀏覽器中遇到問題,請告知我。

注意:這些MODS需要在任何其他代碼的頁面上執行到位。


更新: 顯然,這不適用於FF或Opera。在代碼中更改ElementHTMLInputElement將解決問題。

+0

thnaks的答案。但我的輸入元素有數據('事件')未定義。 使用選擇器來構造元素,並試圖將jQuery的objet包裝到javascript dom元素中。兩者都構建良好,但數據('事件')只是沒有定義。試過鍍鉻和ff。 – Stan

+0

我用一個可能的解決方案更新了我的答案。看看它是否適合你。 – ampersand

+0

都能跟得上; O(我使用鉻添加的代碼覆蓋在script標籤中添加和刪除監聽器來加載磁頭任何其他JS之前,我沒有錯誤,但事件仍是不確定的 – Stan

0

您是否嘗試過的自動完成綁定到當前地圖範圍,as shown in the documentationautocomplete.bindTo('bounds', map)

+0

是的,我起初是這麼做的,但它沒用,因爲建議是按重量排序的,它是位置和層次結構的組合。例如,汝來到俄羅斯,因爲它是國家一級。那麼當你鍵入它與附近的大城市,但來自歐洲各地,只是因爲大城市的層次高於街道比賽是接近的。不要承認谷歌這是如何意味着,但結果的地理層次相對於我的口味的邊界位置具有太高的權重。試試看... – Stan