- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可能是个愚蠢的问题。我知道我有点绿。我的任务是修改这个旧系统的导航。有两个导航栏。第二个只有搜索按钮。我被要求删除第二个导航栏,并将其替换为显示搜索功能的下拉菜单。由于该系统的年龄,我可以更改的内容受到限制。我能写的JS没有任何限制。他们在 Adobe ColdFusion 系统上运行 jQuery 1.11.1(两个月前他们从 1.3.2 升级)
首先:当目标被点击时,mouseenter和click事件都会触发。 mouseenter 首先触发。这会导致敏锐的观众在桌面上看到一个问题,但在移动设备上,这会产生一个可怕的可用性问题。 A:根据我的理解,鼠标事件不会发生在移动设备上,而是为我做的。 B:由于 mouseenter 事件先运行,所以它在处理 click 事件之前激活了 closeDropDown 函数。随着 closeDropDown 的运行,它的 .on('click', f(...eventstuff...))
听到旨在触发 openDropDown 函数的打开点击,因此下拉不会打开。
这里是函数。 console.log
用于检查什么时候运行。
function openDropDown(){
$('div.dropdown').parent().on('click.open mouseenter', function(event){
$subject = $(this).find('.dropdown-menu')
// console.log(event.type, $subject, "first o");
if(!$subject.is(":visible")){
// console.log($subject, 'second o');
$subject.show()
}else {
if(event.type == 'click'){
// console.log('third o');
$subject.toggle()
}
}
closeDropDown($subject)
// console.log('open complete');
})
}
function closeDropDown($x){
// console.log('first c');
$(document).on("click.close",function(e){
// console.log("second c", e.type, "this type");
if(!$(e.target).closest(".dropdown-menu").parent().length){
// console.log("third c");
if($x.is(":visible")){
// console.log('forth c');
$x.hide()
}
}
$(document).off("click.close")
// console.log('complete close');
})
}
openDropDown()
onSearchClick()
我已经阅读了一些希望得到帮助的帖子(例如 this 和 that
总而言之,我知道我需要压缩我的代码。我了解解决此问题的几种方法(添加 if(... are we on a mobile device...)
或一些计数器/检查以防止 closeDropDown 在下拉菜单关闭时运行)
我真的很想了解事件监听器的基础知识以及为什么一个监听器先于其他监听器运行。
虽然关于如何解决这个问题的建议很好,但我希望了解我做错事的基本原理。任何基本指标都非常有帮助。
注意:我刚刚读到这个:.is(':visible') not working .我将在没有 .is('visible') 的情况下重写代码。
其他可能有帮助的事情:当我的所有 console.log(s) 都处于事件状态时,这是 Chrome Dev Tools 控制台。首先,在页面加载后单击.... 下拉菜单打开并快速关闭。
谢谢!感谢您的帮助!
最佳答案
这是一个相当宽泛的问题。我会尽量简洁。我不认为 ColdFusion
应该被标记在这里,因为它似乎只与 HTML/CSS/JS 有关。
配置事件
首先,我想谈谈您配置脚本的方式。您可能会从查看事件处理中受益 examples from jquery .
大多数人都会创建如下事件。它只是说在单击任何具有“alerter”ID 的文档元素时,运行警报功能。
// Method 1
$(document).on(click, "#alerter", function(event){
alert("Hi!");
});
或
// Method 2
$(document).on("click", "#alerter", ClickAlerter);
function ClickAlerter(event) {
alert("Hi!");
}
这两种方法都是完全有效的。但是,我的意见是第二种方法更具可读性和可维护性。它将事件委托(delegate)与逻辑分开。
对于您的代码,我强烈建议删除事件分配和逻辑的混合。 (它至少移除了一层嵌套)。
顺便说一下,您的事件监听器似乎配置不正确。参见 the correct syntax以及这个来自 jQuery 的示例。
$( "#dataTable tbody" ).on( "click", "tr", function() {
console.log( $( this ).text() );
});
关于多个事件
如果您在一个对象上有多个事件监听器,那么它们将按照它们注册的顺序被触发。 This SO question已经涵盖了这一点并提供了一个例子。
但是,这并不意味着在鼠标输入之前会发生点击。因为您的鼠标必须真正进入元素才能单击它,所以 mouseenter 的事件将首先被触发。换句话说,在考虑事件顺序时,您至少有 2 个因素在起作用。
因此,实际上并没有所谓的“同时”事件。当浏览器想要触发事件时,事件就会被触发,它们将遍历事件并按照您指定的顺序触发匹配项。
您始终可以选择 preventDefault和 stopPropagation如果您想更改默认事件行为,请对这些类型的事件进行处理。这将停止浏览器的默认操作,并分别阻止事件冒泡到父元素。
关于移动鼠标事件
鼠标事件绝对会发生在移动设备上,假设它们不会发生是不安全的。 This article深入介绍了触发事件的范围。引用:
"[Y]ou have to be careful when designing more advanced touch interactions: when the user uses a mouse it will respond via a click event, but when the user touches the screen both touch and click events will occur. For a single click the order of events is:
touchstart
touchmove
touchend
mouseover
mousemove
mousedown
mouseup
click
我认为您会从阅读那篇文章中获益。它涵盖了有关移动和非移动环境中事件的常见问题和概念。同样,关于您的情况的相关声明:
Interestingly enough, though, the CSS :hover pseudoclass CAN be triggered by touch interfaces in some cases - tapping an element makes it :active while the finger is down, and it also acquires the :hover state. (With Internet Explorer, the :hover is only in effect while the user’s finger is down - other browsers keep the :hover in effect until the next tap or mouse move.)
一个例子
我接受了所有这些概念和made an example on jsFiddle向您展示其中一些实际情况。基本上,我通过监听 touchstart
事件并在这种情况下以不同方式处理 click
来检测用户是否正在使用触摸屏。因为我没有你的 HTML,所以我不得不制作一个原始界面。这些是指令:
正如您将看到的,我在一个地方创建了所有事件:
$(document).on("mouseover", "#open", $app.mouseOver);
$(document).on("mouseout", "#open", $app.mouseOut);
$(document).on("click", "#open", $app.click);
$(document).on("touchstart", $app.handleTouch);
$(document).on("touchstart", "#open", $app.click);
我还创建了一个对象来包装所有逻辑,$app
,这为我们提供了更大的灵 active 和可读性。这是它的一个片段:
var $app = $app || {};
$app = {
hasTouchScreen: false,
handleTouch:function(e){
// fires on the touchstart event
$app.hasTouchScreen = true;
$("#hasTouchScreen").html("true");
$(document).off("touchstart", $app.handleTouch);
},
click: function(e) {
// fires when a click event occurrs on the button
if ($app.hasTouchScreen) {
e.stopPropagation();
e.preventDefault();
return;
}
// since we don't have a touchscreen, close on click.
$app.toggleMenu(true);
},
touch: function(e) {
// fires when a touchstart event occurs on the button
if ($("#menu").hasClass("showing")) {
$app.toggleMenu(true);
} else {
$app.toggleMenu();
}
}
};
关于javascript - 多个同时发生的事件javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45928973/
下面的代码旨在在首次打开工作簿时运行。 Sub Auto_Open() Dim LastRow As Integer LastRow = Sheet6.UsedRange.Rows.Count Act
当我尝试操作我的代码时,除了弹出调试错误外,它执行得很好。错误信息在这里。 我的完整代码在这里。 #include using namespace std; class String { publi
The invocation of the constructor on type 'WpfApplication1.MainWindow' that matches the specified bi
我正在使用 BaseAdapter: public class MyAdapter extends BaseAdapter{ private final LayoutInflater mInflate
我想做网页抓取。我写了代码 var connection = require('./mysqlConnection'); var c = new Crawler({ maxConnections
我的系统中发生 Java 堆空间错误。我尝试了很多来自 Stack Overflow 的解决方案,但没有任何效果。当我工作时 当按下 OK 然后 (我的项目没有错误) 我的 eclipse.ini 是
环境: i5 750 DDR3 4GWin7 专业版 x64 sp1 DXSDK 9.0c 2010 年 6 月 GeForce GT240(驱动程序 275.33)512MB MSVC 2008 s
这段代码是我写的。 import socket host = 'localhost' port = 3794 s = socket.socket(socket.AF_INET, socket.SOCK
我正在尝试引用 UTC 时间间隔获取本地日期时间,我正在执行下面的代码。 var dtString =DateTime.UtcNow.ToString(@"yyyy-MM-ddTHH\:mm\:ss
我有一个非常简单的 C# 问题,它从库中加载 Windows WPF 窗口。这是代码: public partial class App : Application { public App(
我目前正在使用带有导航组件的底部导航,它工作正常但是当我们点击导航项 fragment 正在加载然后闪烁正在发生,即使当前选择的项目也会发生闪烁。它在加载 fragment 时发生。我的应用程序屏幕背
我是新来的 kotlin , 当我开始 Null Safety 时,我对下面的情况感到困惑. There's some data inconsistency with regard to initia
我有一个框,其中包含同时发生的两个独立的 css 转换。 当转换发生时,图标下方的标题和段落文本移动位置 参见 JS Fiddle:http://jsfiddle.net/Lsnbpt8r/ 这是我的
在为黑莓 10 构建电话间隙应用程序时,我遇到了异常情况。 [BUILD] Populating application source [BUILD] Parsing config.xml [
这个问题在这里已经有了答案: How to properly stop the Thread in Java? (8 个回答) 3年前关闭。 我看过How to properly stop the T
我试图弄清楚发生 fatal error 时如何刷新页面。基本上我正在访问图像 api 并将图像复制到我的服务器。我还每次都创建照片的缩略图版本。我会每隔一段时间收到一条错误消息,指出我的脚本试图分配
我正在尝试使用断言函数检查元素是否在屏幕上。我在我的测试应用程序 (AndroidDriver) 中使用 Appium 和 Java。我期望的是,如果元素在屏幕上,则返回 1;如果不在屏幕上,则返回
我正在开发图像上传系统。我使用 CommonsMultipartResolver 设置 maxUploadSize。当我尝试上传超过最大尺寸的图像文件时,会发生 MaxUploadSizeExcced
我有以下代码和@ComponentScan(basePackages = "com.project.shopping"),包结构为 com.project.shopping.Controller co
我尝试运行此程序作为测试,但收到错误“发生了 JNI 错误,请检查您的安装并重试”,然后是“发生了 Java 异常”。关于如何解决这个问题有什么想法吗? package java; public cl
我是一名优秀的程序员,十分优秀!