问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么用js做出自定义菜单对li标签 右键 删除/变颜色 效果

发布网友 发布时间:2022-04-07 05:57

我来回答

2个回答

懂视网 时间:2022-04-07 10:18

1、使用方式

js文件引入<script src="RightMenu.js"></script>

初始化:

let rightMenu = new RightMenu({
 targetId:'menu',//需要改变右键菜单的元素id
 menuItems: items//菜单项数据,json数组
 })

2、menuItems参数

items = [
 {
 id: 'aa',//菜单id
 text: 'ccc',//菜单文字,可以是html元素
 show: true, //菜单是否显示
 active: false,//菜单是否可用
 style: 'item-unactive'
 }
]

3、方法

setItems(menuItems) 设置菜单。动态设置菜单

hide() 隐藏菜单

on(eventType, event) 事件监听

4、事件

itemClick 菜单项点击,回调函数参数为菜单项的所有属性

例:

rightMenu.on('itemClick',(param) => {
 console.log(param)
 if(param.active === false){
 return
 }
 alert(JSON.stringify(param))
 // rightMenu.hide()
})

createBefore 菜单内容生成前调用,可以实现动态菜单设置

例:

rightMenu.on('createBefore',(param) => {
 rightMenu.setItems(items1)
})

注:暂不支持级联功能

代码:

class RightMenu{
 constructor(param){
 this.targetId = param.targetId
 this.ele = document.querySelector('#' + this.targetId)
 console.assert(this.ele != null, '未找到id=' + this.targetId + '的元素')
 this.menu = null
 this.menuItems = param.menuItems
 this._menuItems = {}
 this.itemDefaultClass = 'item-default'
 this.event = {
 itemClick: null,
 createBefore: null
 }
 this.flag = true
 this.init()
 }
 
 init(){
 let that = this
 that.createMenu()
 this.ele.oncontextmenu = function(ee) {
 let e = ee || window.event;
 //鼠标点的坐标
 let oX = e.clientX;
 let oY = e.clientY;
 //菜单出现后的位置
 that.menu.style.display = "block";
 that.menu.style.left = oX + "px";
 that.menu.style.top = oY + "px";
 that.createMenu()
 //阻止浏览器默认事件
 return false;//一般点击右键会出现浏览器默认的右键菜单,写了这句代码就可以阻止该默认事件。
 }
 document.oncontextmenu = function(ee){
 let e = ee || window.event;
 if(e.target.id !== that.targetId && e.target.dataset.type != 'item'){
 that.menu.style.display = "none"
 }
 }
 document.onclick = function(ee) {
 let e = ee || window.event;
 that.menu.style.display = "none"
 }
 that.menu.onclick = function(ee) {
 let e = ee || window.event;
 if(e.target.dataset.type == 'item'){
 if(that.event.itemClick instanceof Function){
 that.event.itemClick(that._menuItems[e.target.id])
 }
 }
 e.cancelBubble = true;
 }
 this.menu.onmouseover = function(ee){
 that.flag = true
 }
 this.menu.onmouseleave = function(ee){
 that.flag = false
 }
 }
 createMenu(){
 if(this.menu == null){
 this.menu = document.createElement('div')
 this.menu.className = 'menu-default'
 document.body.appendChild(this.menu)
 }
 
 let mark = true
 if(this.event.createBefore instanceof Function){
 mark = this.event.createBefore()
 }
 if(mark){
 this.creatItem()
 }
 }
 _bindOncontextmenu(obj){
 obj.oncontextmenu = function(ee){
 ee.target.click()
 return false
 }
 }
 creatItem(){
 if(this.menuItems.length == 0){
 return
 }
 let fragement = document.createDocumentFragment()
 let temp = null
 let tempItem = null
 for (let i = 0, len = this.menuItems.length; i < len; i++){
 tempItem = this.menuItems[i]
 if(tempItem.show === false){
 continue
 }
 temp = document.createElement('div')
 temp.id = tempItem.id
 temp.innerHTML = tempItem.text
 temp.className = tempItem.style || 'item-default'
 temp.dataset.type = 'item'
 
 this._menuItems[tempItem.id] = tempItem
 fragement.appendChild(temp)
 this._bindOncontextmenu(temp)
 }
 this.menu.innerHTML = ''
 this.menu.appendChild(fragement)
 }
 
 on(type,event){
 this.event[type] = event
 }
 
 hide(){
 this.menu.style.display = 'none'
 }
 
 setItems(items){
 this.menuItems = items
 this.creatItem()
 }
}

推荐教程:js教程

热心网友 时间:2022-04-07 07:26

js里面没有直接的右击事件,可采用onmousedown事件进行判断实现。如下:

document.getElementById("test").onmousedown = function(e){
                if(e.button ==2){
                    //alert("你点了右键");
                    //这样设计你的颜色样式...
                }else if(e.button ==0){
                    alert("你点了左键");
                }else if(e.button ==1){
                    alert("你点了滚轮");
                }
            }

2、数据的过滤方法有很多,javaScript 、jQuery里面的filter函数,鉴于本题,最好采用angularJs实现。总体 参考代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js">

    </script>
    <script type="text/javascript">
        window.onload = function(){
            //去掉默认的contextmenu事件,否则会和右键事件同时出现。
            document.oncontextmenu = function(e){
                e.preventDefault();
            };
            document.getElementById("test").onmousedown = function(e){
                if(e.button ==2){
                    alert("你点了右键");
                    //这样设计你的颜色样式...
                }else if(e.button ==0){
                    alert("你点了左键");
                }else if(e.button ==1){
                    alert("你点了滚轮");
                }
            }
        }
    </script>
</head>
<body>
<div ng-app="myApp" ng-controller="namesCtrl">
    <p>输入过滤:</p>
    <p><input type="text" ng-model="test"></p>
    <ul>
        <li ng-repeat="x in names | filter:test | orderBy:'pin'">
            {{ (x.name | uppercase) + ', ' + x.pin }}
        </li>
    </ul>
</div>
<script>
    angular.mole('myApp', []).controller('namesCtrl', function($scope) {
        $scope.names = [
            {name:'张三',pin:'zhang san'},
            {name:'王斌',pin:'wang bin'},
            {name:'*',pin:'zhang chun qiao'},
            {name:'王滨',pin:'wang bin'}
        ];
    });
</script>
<div style="width: 600px;height:50px;margin:auto;border:1px solid pink" id="test">
    <p>朝鲜新建农场</p>
</div>
</body>
</html>

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
笔记本wifi能够联网,但是台式机插网线网络很差 为什么这个wifi就针对一台电脑卡。 电脑连wifi看电视很卡台式电脑连接无线wifi特别卡 为什么本身台式网速特别快,可是用笔记本wifi的网速就特别慢呢... wifi很快电脑很慢是怎么回事电脑和手机连接同一个WiFi手机网速快但是... ...6个梨,要把这些梨全部放在盘子里,至少需要多少个盘子? 看图列算式,一共有多少个梨? 列式:__ 哪些原因会导致长白头发 头上白发特别多是体内缺什么呢还是病还是别的原因 ACL访问控制列表应用 微信新消息怎么不能置顶了啊? 碱性食物有什么作用 六点要多了解 吃碱性食物有什么好处 吃碱性食物有哪些好处? 吃碱性食物对身体有哪些好处? 什么是碱性食品,长期使用有什么好处? 什么是碱性食品 多吃碱性食物的好处 吃碱性食物对我们的身体有什么好处?有副作用么?是否是利大于弊? 吃碱性食物有什么好处 可以提升智商 经常吃碱性食物对人体有什么好处? 碱性食物有什么作用?包括哪些? 怎么用系统盘修复系统 如何使用华硕的系统恢复盘 如何使用华硕系统修复光盘 如何使用系统恢复盘恢复系统? 汽车轮胎为什么没有彩色的汽车轮胎?黑色轮胎好还是彩色轮胎好? 为什么汽车轮胎是黑色的,不是彩色的? 为什么汽车轮胎只有黑色,却没有其他颜色呢? 汽车轮胎的颜色为什么是黑色,而不是其他彩色的? 汽车轮胎图色彩用什么做最好 电脑老是在开机之后自动运行chkdsk检查d盘 怎么关闭? 怎么取消CHKDSK?看图 如何取消chkdsk命令? 如何取消自动chkdsk? 如何关闭开机是自动运行的chkdsk? 运行chkdsk工具怎么停 怎样取消chkdsk程序的运行? (问了n次,还是没有正确、详细的答案) 电脑开机出现“chkdsk”进不了系统怎么取消? 每次开机都自动执行chkdsk命令,怎么取消? chkdsk 怎么停止? 每次开机Chkdsk都自动检测D盘,如何取消? 怎样关闭开机CHKDSK硬盘检测程式? 怎样取消chkdsk程序的运行? chkdsk工具怎么关 怎样取消chkdsk计划 如何关闭在c盘运行的chkdsk计划 梦见梦见一双黑色的鞋子是什么寓意? - 信息提示 梦到别人给我一双黑鞋是啥意思 解梦~!女朋友做梦梦到我送她一双黑色的阿迪鞋~!