1.首先禁用window原生的右键弹窗(禁用包括2个区域,1是鼠标右键的区域div 2是弹出窗口的div):
//禁用区域右键 $('body').on('contextmenu','.bottompage',function(){ return false; }); $('body').on('contextmenu','#notebookedit',function(){ return false; });
2.下面就是右键点击事件的方法了。
需要注意的是(1,弹窗多次点击会有偏移,所有每次弹出需要位置置为0 2,如果页面存在滚动条的话,需要将滚动条计算进去 3,获取滚动条偏移量不一定使用body对象,使用滚动条所在的div作为对象)
//点击需要重命名的div $('body').on('mousedown','.noteitemstyle',function(event){ //右键事件event.button==2 if(event.button==2) { var offset=$(this).offset(); //放置点击别处时的弹窗不消失造成误差 $('.noteeditlist').css('display','none'); //将弹窗的div绝对定位置清零,否则多次点击会产生偏移量 $('.noteeditlist').css('position','absolute'); $(".noteeditlist").css("left","0px"); $(".noteeditlist").css("top","0px"); //获取当前页面所在div的滚动条的高度,本页面只有垂直滚动条 var locationY = $('.wrap').scrollTop(); offset.top=parseInt(offset.top)+parseInt(locationY); //展示弹窗div ,并根据点击源对其属性赋值 $('.noteeditlist').offset(offset); $('.noteeditlist').css('display','block'); var id=$(this).attr('noteid'); $('.noteeditlist').attr('renameid',id); } });
3 弹窗弹出之后,我们一般会希望点击页面其它部分时 弹窗会自动隐藏 实现方法如下
//点击页面其他部分弹窗隐藏 $(document).bind('click',function(e){ var e = e || window.event; //浏览器兼容性 var elem = e.target || e.srcElement; while (elem) { //循环判断至跟节点,防止点击的是div子元素 if ((elem.id && elem.id=='notebookedit')||(elem.className && elem.className=='notebooklistview')){ return; } elem = elem.parentNode; } $('#notebookedit').css('display','none'); //点击的不是div或其子元素 });
4 关于本文标题所说的重命名的功能,实现思路是
1)右键弹窗 ,弹窗中有重命名子项的选项,
2)点击之后, 最初右键的div变为可编辑的状态,
3)点击是会将最初右键的主题id赋值给弹窗的一个属性
4)编辑之后点击页面任何其他地方即代表重命名完成,发送ajax请求进行重命名
代码如下:
$(document).bind('click',function(e){ var e = e || window.event; //浏览器兼容性 var elem = e.target || e.srcElement; while (elem) { //循环判断至跟节点,防止点击的是div子元素 if ((elem.className && elem.className=='notebookrenameedit')||(elem.id && elem.id=='notebookrename')){ return; } elem = elem.parentNode; } var renameid=$('#notebookrename').attr('renameid'); //判断是否进行了重命名的编辑操作:点击弹窗重命名时会对renameid赋值 if(renameid!='-1') { var renameval=$("#"+renameid+" .notebookrenameedit :input[name='rename']").val(); //点击的不是div或其子元素 $.post('index.php?r=coursespace/coursespace/notelistreload', { renameid: renameid, renameval: renameval }, function(data, status) { if (status = 'success') { $('.bottompage').html(data); //赋值标记为未点击重命名的状态 $('#notebookrename').attr('renameid', '-1'); $('.notebookrenameedit').css('display', 'none'); CKEDITOR.replace("cke3",{toolbar:[ //加粗 斜体,划线 穿过线 下标字 上标字 ['Bold','Italic','Underline','Strike','Subscript','Superscript'], //数字列表 实体列表 减小缩进 增大缩进 ['NumberedList','BulletedList','-','Outdent','Indent'], //左对齐 居中对齐 右对齐 两端对齐 ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'], ['Styles','Format','Font','FontSize'],],450}); } else { alert("加载失败!") } }); } });
5 重命名是采用替换的思路,将展示的div替换为可编辑的input 。示例如下:
<div class='notebookname'><?= $Rpnotebook->title ?></div> <div class='notebookrenameedit' style='display:none;'> <input type='text' name='rename' value=<?= $Rpnotebook->title ?> style='120px;' class='notebookrenameeditid'>
</div>
6 弹窗的div
<div id='notebookedit' class="notebookdelete" style="display:none; " editid="-1" > <div class='notebookedititem' id='notebookitemdelete'>删除</div> <div class='notebookedititem' id='notebookrename' renameid='-1'>重命名</div> </div>
附上效果图:
OK ,that's all ! 本文实现思路过程 偏移量部分参考过一位别人的博客思路,附上地址:http://blog.csdn.net/xuexiaodong009/article/details/6553292