zTree右鍵菜單(Bootstrap風格)

来源:http://www.cnblogs.com/LeslieHoward/archive/2017/02/17/zTreeContextMenu_Bootstrap.html
-Advertisement-
Play Games

HTML: CSS: JS: 步驟: 1、引入zTree相關js、css文件(以我自己的項目為例:jquery.ztree.all-3.5.min.js,zTreeStyle.css); 2、將上面給出的右鍵菜單插件另存為js文件引入頁面(以我自己的項目為例:bsContextmenu.js) 3、 ...


HTML:


<%-- 右鍵菜單 --%>
<div id="zTreeRightMenuContainer" style="z-index: 9999;">
<%-- 層級 0 --%>
<ul class="dropdown-menu" role="menu" level="0">
    <%-- 通過給菜單項添加樣式“hasChildren”併在li標簽下添加菜單結構即可擴展子級菜單 --%>
        <li class="hasChildren"><a tabindex="-1" action="refreshzTreeObj">刷新</a>
<ul class="dropdown-menu" role="menu" level="1">
<li><a tabindex="-1">將資料庫複製到不同的主機/資料庫</a></li>
<li><a tabindex="-1">創建資料庫</a></li>
<li><a tabindex="-1">改變資料庫</a></li>
<li><a tabindex="-1">新數據搜索</a></li>
<li><a tabindex="-1">創/建</a></li>
<li><a tabindex="-1">更多資料庫操作</a></li>
<li class="divider"></li>
<li><a tabindex="-1">備份/導出</a></li>
<li><a tabindex="-1">導入</a></li>
<li class="divider"></li>
<li><a tabindex="-1">在創建資料庫架構HTML</a></li>
</ul>
</li>
</ul>
<%-- 層級 1 --%>
<ul class="dropdown-menu" role="menu" level="1">
<li><a tabindex="-1">將資料庫複製到不同的主機/資料庫</a></li>
<li><a tabindex="-1">創建資料庫</a></li>
<li><a tabindex="-1">改變資料庫</a></li>
<li><a tabindex="-1">新數據搜索</a></li>
<li><a tabindex="-1">創/建</a></li>
<li><a tabindex="-1">更多資料庫操作</a></li>
<li class="divider"></li>
<li><a tabindex="-1">備份/導出</a></li>
<li><a tabindex="-1">導入</a></li>
<li class="divider"></li>
<li><a tabindex="-1">在創建資料庫架構HTML</a></li>
</ul>
<%-- 層級 2 --%>
<ul class="dropdown-menu" role="menu" level="2">
<li><a tabindex="-1">創建表</a></li>
<li><a tabindex="-1">將表複製到不同的主機/資料庫</a></li>
<li><a tabindex="-1">數據搜索</a></li>
<li class="divider"></li>
<li><a tabindex="-1">計劃備份</a></li>
<li><a tabindex="-1">備份表作為SQL轉儲</a></li>
</ul>
</div>

CSS:

/* 右鍵菜單 - start */
    .dropdown-menu .dropdown-menu {
        position: absolute;
        top: -9px;
        left: 100%;
    }

    .dropdown-menu li {
        position: relative;
    }

    .dropdown-menu li.hasChildren:before {
        content: '';
        position: absolute;
        top: 50%;
        right: 8px;
        width: 0;
        height: 0;
        margin-top: -5px;
        border-style: solid;
        border-color: transparent transparent transparent rgba(0, 0, 0, 0.5);
        border-width: 5px 0 5px 5px;
        pointer-events: none;
    }

    .dropdown-menu li.hasChildren:hover > .dropdown-menu {
        display: block;
    }

    /* 右鍵菜單 - end */

JS:

/* 以下為右鍵菜單插件(Bootstrap風格) */
;(function ($) { 'use strict'; /* CONTEXTMENU CLASS DEFINITION * ============================ */ var toggle = '[data-toggle="context"]'; var ContextMenu = function (element, options) { this.$element = $(element); this.before = options.before || this.before; this.onItem = options.onItem || this.onItem; this.scopes = options.scopes || null; if (options.target) { this.$element.data('target', options.target); } this.listen(); }; ContextMenu.prototype = { constructor: ContextMenu , show: function (e) { var $menu , evt , tp , items , relatedTarget = {relatedTarget: this, target: e.currentTarget}; if (this.isDisabled()) return; this.closemenu(); if (this.before.call(this, e, $(e.currentTarget)) === false) return; $menu = this.getMenu(); $menu.trigger(evt = $.Event('show.bs.context', relatedTarget)); tp = this.getPosition(e, $menu); items = 'li:not(.divider)'; $menu.attr('style', '') .css(tp) .addClass('open') .on('click.context.data-api', items, $.proxy(this.onItem, this, $(e.currentTarget))) .trigger('shown.bs.context', relatedTarget); // Delegating the `closemenu` only on the currently opened menu. // This prevents other opened menus from closing. $('html') .on('click.context.data-api', $menu.selector, $.proxy(this.closemenu, this)); return false; } , closemenu: function (e) { var $menu , evt , items , relatedTarget; $menu = this.getMenu(); if (!$menu.hasClass('open')) return; relatedTarget = {relatedTarget: this}; $menu.trigger(evt = $.Event('hide.bs.context', relatedTarget)); items = 'li:not(.divider)'; $menu.removeClass('open') .off('click.context.data-api', items) .trigger('hidden.bs.context', relatedTarget); $('html') .off('click.context.data-api', $menu.selector); // Don't propagate click event so other currently // opened menus won't close. if (e) { e.stopPropagation(); } } , keydown: function (e) { if (e.which == 27) this.closemenu(e); } , before: function (e) { return true; } , onItem: function (e) { return true; } , listen: function () { this.$element.on('contextmenu.context.data-api', this.scopes, $.proxy(this.show, this)); $('html').on('click.context.data-api', $.proxy(this.closemenu, this)); $('html').on('keydown.context.data-api', $.proxy(this.keydown, this)); } , destroy: function () { this.$element.off('.context.data-api').removeData('context'); $('html').off('.context.data-api'); } , isDisabled: function () { return this.$element.hasClass('disabled') || this.$element.attr('disabled'); } , getMenu: function () { var selector = this.$element.data('target') , $menu; if (!selector) { selector = this.$element.attr('href'); selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ''); //strip for ie7 } $menu = $(selector); return $menu && $menu.length ? $menu : this.$element.find(selector); } , getPosition: function (e, $menu) { var mouseX = e.clientX , mouseY = e.clientY , boundsX = $(window).width() , boundsY = $(window).height() , menuWidth = $menu.find('.dropdown-menu').outerWidth() , menuHeight = $menu.find('.dropdown-menu').outerHeight() , tp = {"position": "absolute", "z-index": 9999} , Y, X, parentOffset; if (mouseY + menuHeight > boundsY) { Y = {"top": mouseY - menuHeight + $(window).scrollTop()}; } else { Y = {"top": mouseY + $(window).scrollTop()}; } if ((mouseX + menuWidth > boundsX) && ((mouseX - menuWidth) > 0)) { X = {"left": mouseX - menuWidth + $(window).scrollLeft()}; } else { X = {"left": mouseX + $(window).scrollLeft()}; } // If context-menu's parent is positioned using absolute or relative positioning, // the calculated mouse position will be incorrect. // Adjust the position of the menu by its offset parent position. parentOffset = $menu.offsetParent().offset(); X.left = X.left - parentOffset.left; Y.top = Y.top - parentOffset.top; return $.extend(tp, Y, X); } }; /* CONTEXT MENU PLUGIN DEFINITION * ========================== */ $.fn.contextmenu = function (option, e) { return this.each(function () { var $this = $(this) , data = $this.data('context') , options = (typeof option == 'object') && option; if (!data) $this.data('context', (data = new ContextMenu($this, options))); if (typeof option == 'string') data[option].call(data, e); }); }; $.fn.contextmenu.Constructor = ContextMenu; /* APPLY TO STANDARD CONTEXT MENU ELEMENTS * =================================== */ $(document) .on('contextmenu.context.data-api', function () { $(toggle).each(function () { var data = $(this).data('context'); if (!data) return; data.closemenu(); }); }) .on('contextmenu.context.data-api', toggle, function (e) { $(this).contextmenu('show', e); e.preventDefault(); e.stopPropagation(); }); }(jQuery));

 


/* 以下方法是通過上面的js插件封裝的方法 */

/*
  parentNode(zTree容器 || 指定的節點)
*/
function initzTreeRightMenu(parentNode) {

//樹形菜單右擊事件
$('li, a', $(parentNode)).contextmenu({
target: '#zTreeRightMenuContainer', //此設置項是zTree的容器
before: function (e, element, target) {

//當前右擊節點ID
var selectedId = element[0].tagName == 'LI' ? element.attr('id') : element.parent().attr('id');

//根據節點ID獲取當前節點詳細信息
curSelectNode = zTreeObj.getNodeByTId(selectedId);

//當前節點的層級
var level = curSelectNode.level;

level = 0;

//選中當前右擊節點
zTreeObj.selectNode(curSelectNode);

//根據當前節點層級顯示相應的菜單
$('#zTreeRightMenuContainer ul.dropdown-menu[level="' + level + '"]').removeClass('hide').siblings().addClass('hide');

},
onItem: function (context, e) {

var action = $(e.target).attr('action');

this.closemenu();

if (action) {
zTreeRightMenuFuns[action]();
}
}

});

}
 

步驟:

1、引入zTree相關js、css文件(以我自己的項目為例:jquery.ztree.all-3.5.min.js,zTreeStyle.css);

2、將上面給出的右鍵菜單插件另存為js文件引入頁面(以我自己的項目為例:bsContextmenu.js)

3、在頁面初始化zTree之後,調用上面的方法:initzTreeRightMenu('#schemaMgrTree');  // ‘#schemaMgrTree’ 是我自己項目的zTree容器ID

 

備註:

1、假如zTree中有非同步載入的節點(以我自己項目為例:zTree中有部分節點是展開了父節點之後才載入的,像這種情況則需要在 zTree 的 onExpandFun 裡面綁定當前節點的子節點)

function onExpandFun(event, treeId, treeNode) {

        /* 展開當前節點執行的代碼.... *///綁定當前展開節點的子節點右擊事件
        initzTreeRightMenu('#' + treeNode.tId); //treeNode.tId 是當前展開節點的ID
}
 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是webpack webpack是一個模塊化載入器 支持AMD/CMD。 webpack優勢 代碼分割 Loaders 插件機制 ... 安裝webpack 全局安裝 局部安裝 安裝某個指定的版本 例如1.14.0 webpack命令行參數 p 編譯後會壓縮文件 w/ watch 開發環境下會監 ...
  • //先定義一個數組 anular代碼: var app = angular.module('serApp', []); app.controller('indexCtrl', function($scope, $http) { $scope.arrs = [{ n:'a'; arr:['1','2' ...
  • DOM事件模型 在0級DOM事件模型中,它只是簡單的執行你為它綁定的事件,比如你為某個元素添加了一個onclick事件,當事件觸發時,它只是去調用我們綁定的那個方法,不再做其他的操作。 在2級DOM事件模型中,就比較複雜一些,它將不再是單純的調用一下自身綁定的事件就完事了,它還擁有機會去處理它的祖先 ...
  • 在發送簡訊息驗證碼的時候要用到js設置時間倒序問題:有時候這種常規寫法會導致js失效,試了很多方法才找到問題所在,可能是因為js版本過低導致。 解決方法: jquery代碼:必須用input設置value值,以便利用jquery更改value值 ...
  • 作為一名準前端開發工程師,必須要對http基礎知識有一定的瞭解,可是想學習HTTP相關的知識,發現國內只有兩本相關的圖書,《HTTP權威指南》和《圖解http》,所有的書但凡帶上權威指南,必將是聖經級別的圖書,我在學校圖書館借了一本,600多頁的磚頭書,由於基礎太過薄弱,根本讀不下去,於是轉向了《圖 ...
  • 本節內容我們繼續探討關於ES2015的一些新的內容,Object.assign函數的使用,使用該函數我們可以快速的複製一個或者多個對象到目標對象中,本文內容涉及es6,es7相關的對象複製的內容,以及一些es5的替代方案的介紹。 函數原型 首先看一下函數的定義: 函數參數為一個目標對象(該對象作為最 ...
  • 什麼是babel? babel是一個強大的多用途js編譯器 點擊進入 "官網" 安裝babel babel配置文件 通過.babelrc來表示 命令行的簡單使用 我們可以通過 o ( out file) 參數來編譯一個文件 如果我們想編譯整個目錄 d ( out dir)參數 預設 現在有一段es6 ...
  • 官網鏈接:http://echarts.baidu.com/index.html 官網的demo,api都很詳細;我就分享下我的學習步驟 首先定義一個顯示圖標的區域: <div id="main1" style="width: 600px;height:400px;"></div> js代碼先貼上: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...