禁用瀏覽器默認事件,此處是兼容寫法
$(document).contextmenu(function (e) { var event = e || window.event; if (event.preventDefault) { event.preventDefault(); // 防止瀏覽器默認行為(W3C) } else { event.returnValue = false; // IE中阻止瀏覽器行為 } });
封裝右鍵函數rightClickMouse(),也可將禁用默認瀏覽器事件封裝到此函數中,由於我的項目中如果沒有先選中列表項,就不會調用右鍵函數,因此首先全局禁用瀏覽器默認事件了~
function rightClickMouse(obj, callback) {//給選擇器obj綁定右鍵事件 $(document).on( 'mousedown',obj,function (e) {
var $t = $(this);
if (e.which == 3) {
if (typeof callback == 'function') {
callback($t);
}
}
});
}
右鍵菜單默認隱藏,相對於body絕對定位(absolute),z-index值盡量大,使其位於界面最上層,通過獲取鼠標點擊的位置來對菜單進行定位;
注意HTML中右鍵菜單的位置是body標簽的子元素;
從后台獲取列表數據並以無序列表顯示,然后給li綁定點擊事件。
此處有個坑:由於li是動態添加的節點,因此直接使用$('#itemList>li').click()是無效的!!!
//給點擊的li標簽綁定click事件,則只有選中相機列表時才可彈出右鍵菜單
$('#itemList').on('click', 'li', function () {
rightClickMouse('#cameraList>li', function () {
$(document).contextmenu(function (e) {
// 獲取窗口尺寸
var winWidth = $(document).width();
var winHeight = $(document).height();
// 鼠標點擊位置坐標
var mouseX = e.pageX;
var mouseY = e.pageY;
// ul標簽的寬高
var menuWidth = $(".contextmenu").width();
var menuHeight = $(".contextmenu").height();
// 最小邊緣margin(具體窗口邊緣最小的距離)
var minEdgeMargin = 10;
// 以下判斷用於檢測ul標簽出現的地方是否超出窗口范圍
// 第一種情況:右下角超出窗口
if (mouseX + menuWidth + minEdgeMargin >= winWidth &&
mouseY + menuHeight + minEdgeMargin >= winHeight) {
menuLeft = mouseX - menuWidth - minEdgeMargin + "px";
menuTop = mouseY - menuHeight - minEdgeMargin + "px";
}
// 第二種情況:右邊超出窗口
else if (mouseX + menuWidth + minEdgeMargin >= winWidth) {
menuLeft = mouseX - menuWidth - minEdgeMargin + "px";
menuTop = mouseY + minEdgeMargin + "px";
}
// 第三種情況:下邊超出窗口
else if (mouseY + menuHeight + minEdgeMargin >= winHeight) {
menuLeft = mouseX + minEdgeMargin + "px";
menuTop = mouseY - menuHeight - minEdgeMargin + "px";
}
// 其他情況:未超出窗口
else {
menuLeft = mouseX + minEdgeMargin + "px";
menuTop = mouseY + minEdgeMargin + "px";
};
// ul菜單出現
$(".contextmenu").css({
"left": menuLeft,
"top": menuTop
}).show();
});
// 點擊頁面任意地方之后,右鍵菜單隱藏
$(document).click(function () {
$(".contextmenu").hide();
});
});
});
