jquery自定义右键菜单、全选、不连续选择


Posted in Javascript onMarch 01, 2016

最近在项目中要实现一些自定义效果,例如右键菜单、全选、不连续选择等等,个人认为主要是理清楚逻辑和事件关系。要实现这些,也有现成的插件可以用,如jQuery UI的selectable。

1、右键菜单
当浏览网页时,单击鼠标右键(或ctrl+触模板左键)会出现浏览器默认的右键菜单项,就像这样子的:

jquery自定义右键菜单、全选、不连续选择

但是当要对某个元素自定义右键,像这样子的:

jquery自定义右键菜单、全选、不连续选择

就必须得先禁用浏览器默认的菜单,需要监听contextmenu事件,关键代码如下:

$(function(){
 $('#box').on('contextmenu',function(event){
 event.preventDefault();
  $(this).trigger('click');
  $('#menulist').css({
   top: event.pageY,
   left: event.pageX
  });
 });
 $('#box').click(function(){
  $('#menulist').css('display','block');
 });
})

2、全选
默认的ctrl+A(MAC下是command+A)会选择整个网页或者某个获得焦点的可编辑元素。

<div id='box'>
 <p class='first'>这是个div,这是个div,</p>
 <p>这是个div,这是个div,</p>
 <p>这是个div,这是个div,</p>
 <p>这是个div,这是个div,</p>
 <p>这是个div,这是个div,</p>
</div>
<div id='other'>
 <p class='first'>这是另外一个div,这是另外一个div,</p>
 <p>这是另外一个div,这是另外一个div,</p>
 <p>这是另外一个div,这是另外一个div,</p>
 <p>这是另外一个div,这是另外一个div,</p>
</div>

如果页面中只有这两个div,按下ctrl/cmd+A这两个div都会被选中,若只想选择div#box的内容,简单地方式是给该div加上contentEditable=true。另外一种方式就是键盘事件的监听。

模拟选中div#box所有子元素p并高亮:

$(function(){
 $(document).keydown(function(event){
 //windows下是event.ctrlKey
 if(event.metaKey && event.which === 65){
  event.preventDefault();
  $('#box>p').trigger('click');
 }
 });
 $('#box').on('click', 'p', function(){
 $(this).css('color','red');
 });
});

3、shift实现连续的选择
shift结合鼠标右键实现元素的连续选择,这里对其进行简单模拟。

<div id='box' class="unselect">
 <p class='first'>这是个div,这是个div,</p>
 <p>这是个div,这是个div,</p>
 <p>这是个div,这是个div,</p>
 <p>这是个div,这是个div,</p>
 <p>这是个div,这是个div,</p>
</div>

按住shift时,浏览器有默认的连选,先禁用掉:

.unselect{
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 -o-user-select: none;
 user-select: none;
}

对于低版本的IE,利用selectstart事件:

$('#box')[0].onselectstart = function(e){
  e.preventDefault();
  return false;
 };

给p注册click事件,同时要监听document对象的keydown和keyup事件:

$(document).keydown(function(e){
  if(e.shiftKey){
   shiftkey = 1;
  }
 }).keyup(function(){
  shiftkey = 0;
 });
$('#box').on('click','p',function(){
  if(shiftkey === 1){
   second = $(this).index();
   for(var min = Math.min(first,second); min <= Math.max(first,second); min++){
    $('#box').find('p').eq(min).css('color','red');
   }
  } else {
   first = $(this).index();
   $(this).css('color','red').siblings().css('color','black');
  }
 })

4、不连续选择
不连续选择需要监听ctrl键(mac下command键),同时给元素注册click事件。

$(document).keydown(function(e){
  if(e.metaKey){ //win是e.ctrlKey
   ctrlkey = 2;
  }
 }).keyup(function(){
  ctrlkey = 0;
 });
 $('#box').on('click','p',function(){
  if(ctrlkey === 2){
   $(this).css('color','red');
  } else {
   $(this).css('color','red').siblings().css('color','black');
  }
 })

以上就是本文的全部内容,希望对大家学习jquery程序设计有所帮助。

Javascript 相关文章推荐
js 处理URL实用技巧
Nov 23 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
Mar 11 Javascript
js 验证密码强弱的小例子
Mar 21 Javascript
jquery解析xml字符串简单示例
Apr 11 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
Jun 24 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
Sep 09 Javascript
正则表达式优化JSON字符串的技巧
Dec 24 Javascript
javascript每日必学之继承
Feb 23 Javascript
JS扩展类,克隆对象与混合类实例分析
Nov 26 Javascript
JS对象的深度克隆方法示例
Mar 16 Javascript
微信小程序模板消息推送的两种实现方式
Aug 27 Javascript
浅谈Vue SSR中的Bundle的具有使用
Nov 21 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
Mar 01 #Javascript
详解Wondows下Node.js使用MongoDB的环境配置
Mar 01 #Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
Mar 01 #Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
Mar 01 #Javascript
JavaScript html5 canvas绘制时钟效果
Mar 01 #Javascript
javascript使用Promise对象实现异步编程
Mar 01 #Javascript
javascript html5实现表单验证
Mar 01 #Javascript
You might like
深入PHP数据缓存的使用说明
2013/05/10 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
图片自动缩小 点击放大
2008/07/07 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
vue实现在线翻译功能
2019/09/27 Javascript
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
基于python实现简单日历
2018/07/28 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
上海中网科技笔试题
2012/02/19 面试题
一份文言文检讨书
2014/09/13 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
心理学培训心得体会
2016/01/22 职场文书
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python
Python Django获取URL中的数据详解
2021/11/01 Python