业务需求:

笔记列表里还有一个按钮可以弹出子菜单,要求做到以下几点:

(1)点击选中的笔记行的弹出按钮后,弹出子菜单,再次点击,子菜单收回。

(2)选中其他笔记后,子菜单消失。效果如下图所示:

业务分析:

在点击按钮后,弹出子菜单,实际上是让子菜单内容显示出来,而再次点击让子菜单收回,就是让子菜单内容隐藏,这里就需要参考jQuery的hide(),show(),toggle()方法。点击其他笔记后,子菜单消失,需要用到document中绑定click事件,将所有子菜单隐藏。

(1)先在chrome控制台测试弹出和收回笔记效果,最终需要找到对应子菜单的内容,将其显示出来。

(2)js脚本中给当前点击的弹出按钮绑定一个单击事件。

//绑定弹出笔记子菜单,删除移动等
$("#pc_part_2").on("click",".alert_subMenu",showSubMenu);
#pc_part_2为对应大div,为父元素,然后在这个div里找到class名为alert_subMenu的元素(其实为弹出按钮),给其绑定一个单击事件,只要点击就触发showSubMenu方法,以下是具体实现。刚开始是想过滤出来没有选中的笔记,将里面的所有子菜单隐藏,然后将当前选中的子菜单再实现切换显示和隐藏。在代码中刚开始出现了没有过滤的情况,造成冲突。
//弹出子菜单
function showSubMenu(){
//找到菜单对象,将其显示或者隐藏,在他们之间来回切换
//只有选定的菜单才能弹出子菜单,当前按钮的父元素就是a,只选择a class属性为checked的进行切换
$(this).parent(".checked").next().toggle(); //以下是最初刘老师讲的,意思是所有菜单收起来后,再在当前点击的按钮上切换弹出和隐藏,但是有个问题
/**
* 意思是所有子菜单先隐藏,然后在弹出或者隐藏子菜单之间切换,逻辑上是不对的
* 因为这个方法是先将所有的子菜单隐藏,然后也包括当前想显示的子菜单,会造成冲突
* 其实本意是想过滤掉不是当前选择的子菜单,将其隐藏,然后再对当前选择的子菜单进行切换
* 需要对方法进行修改
*/
// $(".note_menu").hide(function(){
// $(this).parent().next().toggle();
// }); //修改后方法,还是需要加上阻止事件传播部分
// $(".note_menu").prev().not(".checked").next().hide(function(){
// $(".note_menu").prev(".checked").next().toggle();
// }); return false;//阻止点击事件继续传播,返回false解决
}
后进行了修改,将所有没有选中,也就是a元素class属性不为checked的a全部过滤出,然后将它们的所有子元素,就是子菜单部分,进行了隐藏。隐藏完成后再将选中的行对应的子菜单进行了切换。
$(".note_menu").prev().not(".checked").next().hide(function(){
$(".note_menu").prev(".checked").next().toggle();
});
但是还存在一个问题,就是如果点击子菜单显示出来后,没有隐藏的情况下再去点击其他的笔记列表,子菜单不会消失。这里就需要在document范围内绑定一个单击事件,只要点击了网页的任何一个部分,都会将所有的子菜单隐藏。但是这样会导致所有的子菜单又显示不出来了,因为当点击了按钮后子菜单本来要显示的,在即将显示的过程中,事件冒泡的方式传到了最上层的document,并随后执行了隐藏所有子菜单的方法啊,导致子菜单显示不出来。
$(document).click(hideSubMenu);
//点击网页任何区域,就可以隐藏弹出的菜单
function hideSubMenu(){
$(".note_menu").hide();
}

为了验证这个说法是否正确,再弹出方法后面,以及隐藏所有子菜单方法后面加上打印时间戳,代码以及测试结果如下图:

测试结果如下图,第一次为我点击recycle笔记本时的毫秒数,然后点击了一下弹出按钮,发现先执行了弹出子菜单的方法,随后过了4ms,执行了隐藏所有子菜单的方法,如果除掉获取时间的代码执行时间,两者之间时间差可能更短,因此在几毫秒内将本来要弹出的子菜单又隐藏了,肉眼根本没有任何弹出子菜单的感觉。因此为了解决这个问题,需要用到阻止事件继续传播的方法,就是为了阻止事件继续冒泡。

阻止事件冒泡:

可以参考博文https://blog.csdn.net/aitangyong/article/details/43269793,有两种方式可以阻止事件冒泡,一种是直接在需要阻止的方法里返回false,另外一种是使用event对象的stopPropagation()函数。这里使用第一种,加上这段代码后,就可以正常的弹出和隐藏子菜单了。

总结:

弹出子菜单需要学习如何阻止事件冒泡,以及jQuery常用的show,hide和toggle方法。

云笔记项目-笔记列表弹出"分享移动删除"子菜单的更多相关文章

  1. 奥展项目笔记06--js弹出框、对话框、提示框、弹窗总结

    JS的三种最常见的对话框: //====================== JS最常用三种弹出对话框 ======================== //弹出对话框并输出一段提示信息 functi ...

  2. netbeans运行项目时,弹出“cannot be run from folder that contains non-ASCII characters in path”的对话框 解决方法

    netbeans运行项目时,弹出“cannot be run from folder that contains non-ASCII characters in path”的对话框,原因是项目路径中有 ...

  3. Android ListView 长按列表弹出菜单

    Android ListView 长按列表弹出菜单 设置长按菜单 listView.setOnCreateContextMenuListener(new View.OnCreateContextMen ...

  4. jQuery 学习笔记1 弹出一个对话框

    这里推荐使用sublime text 2来写,外加zen coding. 首先是写html 只需要html:xt,然后tab就可以得到一个html的完整结构. <!DOCTYPE html PU ...

  5. 5月12日上课笔记-js 弹出框、函数、程序调试、基本事件、浏览器对象模型

    一.弹出框 a.提示框 alert(); b.输入框 prompt(); c.确认框 confirm(); var flag= confirm("确认删除吗?"); 二.js程序调 ...

  6. Android APP 分享图片文字到微信刚開始正常,后面就不弹出分享框了

    依照官方的流程走了一遍.一切顺利,分享成功了.本来以为能够大功告成了,结果睡了一觉,第二天要给客户演示了.才发现TMD坑爹了,不能分享了,第三方的分享栏弹不出来了.我一阵惊慌,还好非常快找到了解决的方 ...

  7. jQuery手机端点击弹出分享按钮代码

    一.HTML代码如下: <span onClick="toshare()" style="border:dotted 1px #ddd;display:block; ...

  8. Xcode调试项目时取消弹出框提示授权

    问题2: instruments wants permission to analyze other processes.'DTServiceHub'需要控制另外一个进程,以便继续调试,键入密码以允许 ...

  9. Bootstrap 学习笔记10 弹出框和警告框插件

    隐藏还有2个: 警告框:

随机推荐

  1. 读书笔记--《gongchandang宣言》

    纪念马克思诞辰200周年 末尾 gongchandang人不屑于隐瞒自己的观点和意图.他们公开宣布:他们的目的只有用暴力推翻全部现存的社会制度才能达到. 让统治接机在共产主义革命面前发抖吧. 无产者在 ...

  2. web driver下载地址(selenium-3.141_浏览器版本对应)

    web driver: (Windows环境下) Firefox(上一目录可以找其他浏览器的driver) : 1)http://npm.taobao.org/mirrors/geckodriver/ ...

  3. webpack学习笔记(三)

    访问网址: https://github.com/webpack/analyse "scripts": { "dev-build": "webpack ...

  4. 关于IE无法访问本机网络的问题

    多次遇到IE无法访问本机站点的情况,比如架设了一个花生壳,所有人都可以访问,唯独本机不行(服务器),还需要把这个域名加入信任站点,这TMD什么情况.今天又遇到访问本地restful service,用 ...

  5. 前端 --- 5 BOM 和 DOM

    一.BOM BOM(Browser Object Model)是指浏览器对象模型, 它使 JavaScript 有能力与浏览器进行“对话”. 1. window 对象 一些常用的Window方法: ( ...

  6. [C++/Python] 如何在C++中使用一个Python类? (Use Python-defined class in C++)

    最近在做基于OpenCV的车牌识别, 其中需要用到深度学习的一些代码(Python), 所以一开始的时候开发语言选择了Python(祸患之源). 固然现在Python的速度不算太慢, 但你一定要用Py ...

  7. Spring Boot - 项目构建与解析

    构建 Maven 项目 通过官方的 Spring Initializr 工具来产生基础项目,访问 http://start.spring.io/ ,如下图所示,该页面提供了以Maven构建Spring ...

  8. 黄聪:C#使用Application.Restart重启程序出错解决办法

    调用 Application.Restart重启程序出错 解决办法,就是给程序的.exe文件,加上下面的设置

  9. 【算法和数据结构】_15_小算法_打印EOF的值

    /* 本程序打印EOF的值 */ #include <stdio.h> int main(int argc,char* argv[],char* env) { printf("E ...

  10. [zz]如何学习Polygon Mesh Processing这本书?

    图形学初学者,如何学习Polygon Mesh Processing这本书?修改修改 导师暑假让我看看这本书,目前看了一半觉得这本书比较偏重数学基础,对于具体的 implementation提及的并不 ...