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 弹出层 定位至屏幕居中示例
May 21 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
Apr 01 Javascript
url中的特殊符号有什么含义(推荐)
Jun 17 Javascript
vue.js中指令Directives详解
Mar 20 Javascript
javascript实现二叉树的代码
Jun 08 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
Aug 17 Javascript
十个免费的web前端开发工具详细整理
Sep 18 Javascript
JavaScript实现省市联动过程中bug的解决方法
Dec 04 Javascript
Vue.js 动态为img的src赋值方法
Mar 14 Javascript
新手如何快速理解js异步编程
Jun 24 Javascript
在小程序中推送模板消息的实现方法
Jul 22 Javascript
vue改变循环遍历后的数据实例
Nov 07 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 之入门篇
2006/12/04 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
JavaScript this调用规则说明
2010/03/08 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
Jquery网页出现的乱码问题的三种解决方法
2013/06/30 Javascript
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
js实现的tab标签切换效果代码分享
2015/08/25 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
基于Python的身份证号码自动生成程序
2014/08/15 Python
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
网游商务专员求职信
2013/10/15 职场文书
毕业生自荐书
2014/02/03 职场文书
学生评语集锦
2015/01/04 职场文书
幼儿园个人师德总结
2015/02/06 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
Python实现简单的猜单词
2021/06/15 Python