Javascript 单击仍在div下触发的事件
这是我正在构建的PhoneGap应用程序,我正在笔记本电脑上测试,然后在iphone上使用PhoneGap cli进行测试。我有一个openlayers 3地图,记录点击事件。我还有一个div,当菜单显示时,它会屏蔽整个地图。其思想是,当单击/点击此掩蔽div时,它会隐藏自己,但下面的映射不会注册单击事件。发生的情况是,映射正在注册click事件,因此掩蔽div被隐藏,但映射随后会执行其他操作,因为它已被单击,但它不应该这样做 我已经把代码简化到了细节。下面是两张屏幕截图,分别显示了Wide和with菜单以及masking div。右下角的按钮是打开菜单的按钮(Javascript 单击仍在div下触发的事件,javascript,jquery,cordova,openlayers-3,Javascript,Jquery,Cordova,Openlayers 3,这是我正在构建的PhoneGap应用程序,我正在笔记本电脑上测试,然后在iphone上使用PhoneGap cli进行测试。我有一个openlayers 3地图,记录点击事件。我还有一个div,当菜单显示时,它会屏蔽整个地图。其思想是,当单击/点击此掩蔽div时,它会隐藏自己,但下面的映射不会注册单击事件。发生的情况是,映射正在注册click事件,因此掩蔽div被隐藏,但映射随后会执行其他操作,因为它已被单击,但它不应该这样做 我已经把代码简化到了细节。下面是两张屏幕截图,分别显示了Wide和w
.layers\u menu\u button
)
这会侦听屏蔽div(#net_curtain2
)上的单击/点击,然后将其隐藏(注意,注释掉的传播内容是我试图在此处停止单击/点击事件,但没有任何区别)<代码>交互类型定义为单击
或触摸端
,具体取决于我测试的内容
$(window).on("load", function() {
$(document).on(interaction_type, "#net_curtain2", function(event) {
// event.stopImmediatePropagation();
hide_layers_menu();
});
setup_map();
});
...
function hide_layers_menu() {
$('.layers_menu_button').fadeIn("fast", function() {
// Animation complete
});
// remove hide class, add show class
$('.layers_menu_button').removeClass('hide_layers_menu');
$('.layers_menu_button').addClass('show_layers_menu');
$('.layers_menu_content').hide();
$("#net_curtain2").fadeOut("fast", function() {
// Animation complete
});
var layers_menu_width = parseInt($(window).width()-60);
$("#layers_menu").animate({
bottom: "30px",
right:"30px",
width: "20px",
height: "20px"
}, 'fast', function() {
// Animation complete
});
}
function setup_map() {
// create view
view = new ol.View({
center: ol.proj.transform([0.153733491897583, 52.655333117999774], 'EPSG:4326', 'EPSG:3857'),
zoom: 17
});
// create layers of map types
road = new ol.layer.Tile({
source: new ol.source.BingMaps({
imagerySet: 'Road',
key: 'my_key_here',
disableZooming: true,
maxZoom: 19
})
});
map = new ol.Map({
target: $('#map')[0],
layers: [
road
],
view: view,
controls : ol.control.defaults({
attribution:false,
zoom:false,
rotate: false
})
});
// check if net_curtain is visible and only act if NOT
map.on('click', function(evt) {
if($('#net_curtain2').is(':hidden'))
{
console.log("net curtain hidden");
}
else
{
console.log("net curtain showing");
}
});
var interactions = map.getInteractions().getArray();
var pinchRotateInteraction = interactions.filter(function(interaction) {
return interaction instanceof ol.interaction.PinchRotate;
})[0];
pinchRotateInteraction.setActive(false);
}
因此,如果在菜单未显示时单击地图,控制台将注销“net窗帘隐藏”,这是正确的。但是,如果打开菜单,然后单击蒙版div(网帘),它会关闭菜单并隐藏网帘,这是正确的,但随后它会触发“网帘隐藏”,这是错误的!我需要它只是在隐藏网帘时停止
最令人沮丧的是,它可以在我的笔记本电脑上工作,但不能在手机上工作。将
map.on('click'…
更改为map.on(交互类型…
意味着它不会触发地图上的任何单击/点击事件。我感到困惑。您的移动浏览器正试图模拟我相信的单击事件
调用event.preventDefault();
应该可以解决您的问题
请尝试以下代码:
$(document).on(interaction_type, "#net_curtain2", function(event) {
event.preventDefault();
hide_layers_menu();
});
说明:
我相信你的问题在于移动浏览器模拟点击事件的方式。在为移动浏览器开发时,有一件事要永远记住,如果没有任何东西明确阻止默认操作,它们会尝试模拟点击事件。事件顺序如下:
touch
事件中,通过不调用event.preventDefault()
,您的移动浏览器假定您希望它继续通过该事件链,直到它触发单击事件(正是这个单击事件给您带来问题)
这可能会令人困惑,因为调用event.stopPropagation()
会阻止事件从事件链中冒泡出来,这是人们自然会认为正在发生的事情。但您应该始终记住在触摸事件处理程序中使用preventDefault(),这样就不会出现默认的鼠标模拟处理
要获得更深入的解释
可能相关:未读取,似乎事件气泡错误可能是event.stopPropogation();
我已尝试event.stopPropogation和event.stoppimediatepropagation(见代码中的注释),但都未停止。您是否尝试过event.preventDefault()
?否则您会遇到CSS问题,一个div位于另一个div之上(z-index
)@Cᴀʟʟᴏᴅᴀᴄɪᴛ谢谢!这很有效,在hide_layers_menu();
(我的代码片段的第4行)之前添加它。你能将此作为答案发布,我会接受它吗?尽管请详细说明为什么这应该有效,因为我不确定它为什么有效!如果这是一个冒泡问题,那么stopPropagation肯定更有意义?谢谢!太棒了!谢谢!