Google maps api 3 谷歌将自动完成,在点击按钮时模拟第一个结果选择

Google maps api 3 谷歌将自动完成,在点击按钮时模拟第一个结果选择,google-maps-api-3,autocomplete,Google Maps Api 3,Autocomplete,我使用的是Google Places Autocomplete和Google Maps api。 在我的js中,我包装了自动完成的侦听器,以便在没有选择自动完成结果的情况下模拟“向下箭头”和“回车”事件的组合 请参见以下代码段: var pac_input = document.getElementById('locatorPlaceSearch'); var orig_listener; (function pacSelectFirst(input) {

我使用的是Google Places Autocomplete和Google Maps api。 在我的js中,我包装了自动完成的侦听器,以便在没有选择自动完成结果的情况下模拟“向下箭头”和“回车”事件的组合

请参见以下代码段:

var pac_input = document.getElementById('locatorPlaceSearch');
        var orig_listener;

        (function pacSelectFirst(input) {
            // store the original event binding function
            var _addEventListener = (input.addEventListener) ? input.addEventListener : input.attachEvent;

            function addEventListenerWrapper(type, listener) {
                // Simulate a 'down arrow' keypress on hitting 'return' when no pac suggestion is selected,
                // and then trigger the original listener.
                if (type == "keydown") {
                    orig_listener = listener;
                    listener = function (event) {
                        var suggestion_selected = $(".pac-item-selected").length > 0;
                        if (event.which == 13 && !suggestion_selected) {
                            var simulated_downarrow = $.Event("keydown", {
                                keyCode: 40,
                                which: 40
                            });
                            orig_listener.apply(input, [simulated_downarrow]);
                        }

                        orig_listener.apply(input, [event]);
                    };
                }

                _addEventListener.apply(input, [type, listener]);
                mapsListener = listener;
            }

            input.addEventListener = addEventListenerWrapper;
            input.attachEvent = addEventListenerWrapper;



        })(pac_input);

        autocomplete = new google.maps.places.Autocomplete(pac_input,
        {
            componentRestrictions: { country: $('#hdnLocatorPlace').val() },
            types: ['geocode']
        });
现在我有一个“搜索”按钮,我想触发一个“向下箭头”和“回车”。我尝试了这段代码,但它没有在侦听器上触发keydown事件:

$('#searchAP').off('click').on('click', function (e) {
            e.preventDefault();
            e.stopPropagation();

            setTimeout(function() {
                $('#locatorPlaceSearch').focus();
                $('#locatorPlaceSearch').click();
                setTimeout(function() {
                    var sev = $.Event("keydown", {
                        keyCode: 13,
                        which: 13
                    });
                    //mapsListener.apply($('#locatorPlaceSearch'), [sev]);
                    $('#locatorPlaceSearch').trigger(sev);
                },1000);

            }, 1000);




            //$('#locatorPlaceSearch').trigger(sev);
        });

这段代码有什么问题?

我无法确切地告诉您那里发生了什么,因为似乎根本不会触发事件(至少不会调用您的侦听器)

您可以使用本机DOM方法(
dispatchEvent
)触发事件:

google.maps.event.addDomListener(窗口'load',函数(){
var pac_input=document.getElementById('locatorPlaceSearch');
var orig_监听器;
(功能pacSelectFirst(输入){
//存储原始事件绑定函数
var _addEventListener=(input.addEventListener)?input.addEventListener:input.attachEvent;
函数addEventListenerWrapper(类型,侦听器){
//当未选择pac建议时,在点击“返回”时模拟按下“向下箭头”键,
//然后触发原始侦听器。
如果(类型==“键控键控”){
原始侦听器=侦听器;
侦听器=函数(事件){
所选var suggestion_=$(“.pac项已选定”)。长度>0;
如果(选择event.which==13&&!建议){
var模拟_向下箭头=$.Event(“向下键”{
密码:40,
哪个:40
});
orig_listener.apply(输入,[simulated_downarrow]);
}
orig_listener.apply(输入,[event]);
};
}
_apply(输入,[type,listener]);
mapsListener=监听器;
}
input.addEventListener=addEventListenerWrapper;
input.attachEvent=addEventListenerWrapper;
})(pac_输入);
autocomplete=new google.maps.places.autocomplete(pac_输入{
组件限制:{
国家:$('hdnLocatorPlace').val()
},
类型:['geocode']
});
$('searchAP')。关闭('click')。打开('click',函数(e){
var keydown=document.createEvent('HTMLEvents');
initEvent(“keydown”,true,false);
Object.defineProperty(keydown,'keyCode'{
get:function(){
返回13;
}
});
Object.defineProperty(向下键“which”{
get:function(){
返回13;
}
});
pac_输入。调度事件(键控);
});
});

我无法确切地告诉您那里发生了什么,因为似乎根本不会触发事件(至少不会调用您的侦听器)

您可以使用本机DOM方法(
dispatchEvent
)触发事件:

google.maps.event.addDomListener(窗口'load',函数(){
var pac_input=document.getElementById('locatorPlaceSearch');
var orig_监听器;
(功能pacSelectFirst(输入){
//存储原始事件绑定函数
var _addEventListener=(input.addEventListener)?input.addEventListener:input.attachEvent;
函数addEventListenerWrapper(类型,侦听器){
//当未选择pac建议时,在点击“返回”时模拟按下“向下箭头”键,
//然后触发原始侦听器。
如果(类型==“键控键控”){
原始侦听器=侦听器;
侦听器=函数(事件){
所选var suggestion_=$(“.pac项已选定”)。长度>0;
如果(选择event.which==13&&!建议){
var模拟_向下箭头=$.Event(“向下键”{
密码:40,
哪个:40
});
orig_listener.apply(输入,[simulated_downarrow]);
}
orig_listener.apply(输入,[event]);
};
}
_apply(输入,[type,listener]);
mapsListener=监听器;
}
input.addEventListener=addEventListenerWrapper;
input.attachEvent=addEventListenerWrapper;
})(pac_输入);
autocomplete=new google.maps.places.autocomplete(pac_输入{
组件限制:{
国家:$('hdnLocatorPlace').val()
},
类型:['geocode']
});
$('searchAP')。关闭('click')。打开('click',函数(e){
var keydown=document.createEvent('HTMLEvents');
initEvent(“keydown”,true,false);
Object.defineProperty(keydown,'keyCode'{
get:function(){
返回13;
}
});
Object.defineProperty(向下键“which”{
get:function(){
返回13;
}
});
pac_输入。调度事件(键控);
});
});


第二种解决方案无法正常工作:如果我使用向下箭头,它将跳转到下面的1个选项。可能您需要添加相同的$(“.pac item selected”)选中此处。第二个解决方案无法正常工作:如果我使用向下箭头,它将跳转到下面的1个选项。您可能需要在此处添加相同的$(“.pac项已选定”)复选框。