0

我在文本字段上使用 Google 自动完成 API 在您键入时建议位置。我遇到的主要问题是谷歌不允许您将结果限制在特定国家/地区,它只是让您将结果偏向于区域范围,这是一种无用的。

"ru"因此,即使您所在的地区设置在欧洲的某个地方,搜索术语也会为您提供俄罗斯方面的建议。

我意识到,如果您输入例如“france ru”,它只会为您提供与 ru 匹配的法国位置,这是完美的。

所以我的问题是自动完成完全由谷歌javascript构建。

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

所以我不能轻易地摆弄搜索字符串来不断添加它"france"

我可以看到绑定到该onkeyup字段上的事件的内容,并且可以自己获取并调用它,但是我无法将其与 keyup 解除绑定。我尝试了几种解决方案,但找不到方法。jQuery unbind 不起作用,因为这显然没有通过它绑定。本机函数希望引用绑定到侦听器的函数,但这是其中的匿名函数。找到了一些使用循环的示例,element.data['events']但我得到了数据未定义的错误。

有没有人解绑 onkeyup 中注册的所有内容?

4

2 回答 2

0

您是否尝试过将自动完成绑定到当前地图边界,如文档中所示autocomplete.bindTo('bounds', map)

于 2011-09-23T10:27:16.173 回答
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 数组中删除原始事件处理程序,并绑定将执行您想要的新事件处理程序。


更新:您可以劫持 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);
};

现在,每次通过 jQuery 或其他方式调用 addEventListener 时,元素的events属性都应该使用当前事件进行更新。您可能还想在被调用时劫持以从对象removeEventListener中删除相应的事件:eventsremoveEventListener

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];
        }
    }

};

现在您应该能够检查在任何元素上注册的所有事件。您可以'keyup'通过迭代input.events.keyup对象并使用input.removeEventListener.

attachEventanddetachEvent被 IE<9 使用。我没有IE,所以没有在那里测试过。它在 Safari 5 中运行良好。如果您在其他浏览器中遇到问题,请告诉我。

注意:这些模块需要在页面上执行任何其他代码之前就位。


更新:显然,这在 FF 或 Opera 中不起作用。在代码中更改ElementHTMLInputElement将解决问题。

于 2011-09-22T14:03:02.720 回答