IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    自定义右键菜单和多选

    dwqs发表于 2015-08-14 13:28:49
    love 0

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

    右键菜单

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

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

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

    1. $(function(){
    2. $('#box').on('contextmenu',function(event){
    3. event.preventDefault();
    4. $(this).trigger('click');
    5. $('#menulist').css({
    6. top: event.pageY,
    7. left: event.pageX
    8. });
    9. });
    10. $('#box').click(function(){
    11. $('#menulist').css('display','block');
    12. });
    13. })

    完成示例:https://jsfiddle.net/dwqs/jvxopkqk/

    全选

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

    1. <div id='box'>
    2. <p class='first'>这是个div,这是个div,</p>
    3. <p>这是个div,这是个div,</p>
    4. <p>这是个div,这是个div,</p>
    5. <p>这是个div,这是个div,</p>
    6. <p>这是个div,这是个div,</p>
    7. </div>
    8. <div id='other'>
    9. <p class='first'>这是另外一个div,这是另外一个div,</p>
    10. <p>这是另外一个div,这是另外一个div,</p>
    11. <p>这是另外一个div,这是另外一个div,</p>
    12. <p>这是另外一个div,这是另外一个div,</p>
    13. </div>

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

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

    1. $(function(){
    2. $(document).keydown(function(event){
    3. //windows下是event.ctrlKey
    4. if(event.metaKey && event.which === 65){
    5. event.preventDefault();
    6. $('#box>p').trigger('click');
    7. }
    8. });
    9. $('#box').on('click', 'p', function(){
    10. $(this).css('color','red');
    11. });
    12. });

    完成示例:https://jsbin.com/dagidoyina/1/edit?html,css,js,console,output

    shift实现连续的选择

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

    1. <div id='box' class="unselect">
    2. <p class='first'>这是个div,这是个div,</p>
    3. <p>这是个div,这是个div,</p>
    4. <p>这是个div,这是个div,</p>
    5. <p>这是个div,这是个div,</p>
    6. <p>这是个div,这是个div,</p>
    7. </div>

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

    1. .unselect{
    2. -webkit-user-select: none;
    3. -moz-user-select: none;
    4. -ms-user-select: none;
    5. -o-user-select: none;
    6. user-select: none;
    7. }

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

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

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

    1. $(document).keydown(function(e){
    2. if(e.shiftKey){
    3. shiftkey = 1;
    4. }
    5. }).keyup(function(){
    6. shiftkey = 0;
    7. });
    8. $('#box').on('click','p',function(){
    9. if(shiftkey === 1){
    10. second = $(this).index();
    11. for(var min = Math.min(first,second); min <= Math.max(first,second); min++){
    12. $('#box').find('p').eq(min).css('color','red');
    13. }
    14. } else {
    15. first = $(this).index();
    16. $(this).css('color','red').siblings().css('color','black');
    17. }
    18. })

    完成示例:https://jsfiddle.net/dwqs/gjpgr5uw/1/

    不连续选择

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

    1. $(document).keydown(function(e){
    2. if(e.metaKey){ //win是e.ctrlKey
    3. ctrlkey = 2;
    4. }
    5. }).keyup(function(){
    6. ctrlkey = 0;
    7. });
    8. $('#box').on('click','p',function(){
    9. if(ctrlkey === 2){
    10. $(this).css('color','red');
    11. } else {
    12. $(this).css('color','red').siblings().css('color','black');
    13. }
    14. })

    完整示例:https://jsfiddle.net/dwqs/w5qsy5bq/

    淡忘~浅思猜你喜欢

    jQuery实现上传进度条效果

    JQuery总结三:DOM完全操作和动画

    DOM笔记(六):怎么进行JQuery扩展?

    JQuery总结四:Ajax和延迟对象

    Lazy Load, 延迟加载图片的 jQuery 插件
    无觅

    转载请注明:淡忘~浅思 » 自定义右键菜单和多选



沪ICP备19023445号-2号
友情链接