2011-09-22 311 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