自写JQ控件-树状菜单控件[demo下载]

自写JQ控件-树状菜单控件[demo下载]

一个多月没有写博客了,最近也弄一个基于JQ的树状菜单控件,在此分享给大家。另外呢,通过这个例子分享一下怎么写JQ控件的。

事实上工作中,也是经常遇到的,有些时候自己想实现一些前端效果,用网上一些插件吧,很强大,但是一些样式可能不是你想要的,改起来牵一发而动全身。这种情况自己写控件会好一些。

【小宝鸽也是前端菜鸟,毕竟咱们算是专攻后台的,不规范的地方还望猿友指正】

费话不多说,直接看看效果吧

这里写图片描述

这效果图吧,说不上好看,但是呢,我们主要了解怎么写JQ控件的。

需要下载源码看效果的请访问链接:http://download.csdn.net/detail/u013142781/9586987

先看看代码吧

<!DOCTYPE html>
<html>
<head>
<title>小宝鸽菜单树控件</title>
<link rel="stylesheet" type="text/css" href="./css/XBGMenuTree.css"/>
<script type="text/javascript" src="./js/jquery-1.8.1.min.js"></script>
<script type="text/javascript" charset="gb2312" src="./js/XBGMenuTree.js"></script>

<style type="text/css"> body{ background-color: #f5f5f5; } * { margin: 0; padding: 0; outline: none; font-size: 14px; font-family: "Microsoft Yahei"; color: #333333; } .menu-show { width: 250px; height: 500px; overflow: auto; background-color: #ffffff; } </style>
</head>
<body>
  <div class="menu-show" id="menuDiv">
    <!-- 这里加入菜单菜单-->
  </div>
<script type="text/javascript"> $(function(){
     var data = [ { name : '个人中心', url : '个人中心url', children: [ { name : '修改资料', url : '修改资料url' } ] }, { name : '我的博客', url : '我的博客url', children : [ { name : '博客专栏', url : '博客专栏url', children : [ { name : 'Java基础', url : 'Java基础url' }, { name : '前端基础', url : '前端基础url' } ] }, { name : '文章分类', url : '文章分类url', children : [ { name : 'Dubbo入门', url : 'Dubbo入门url' } ] } ] }, { name : '阅读排行', url : '阅读排行榜url' }, { name : '最新评论', url : '最新评论url' } ]; $("#menuDiv").XBGMenuTree({ click:function(a){
     if($(a).attr("hasChild") == 'false'){ //这里写点击菜单的响应事件 alert("选中的url为:" + $(a).attr("ref")); } } }, data, "menuDiv"); }); </script>
</body>
</html>

这html代码也很简答,相信有一些基础的猿友应该很容易看懂。真正使用的时候,后台只需要传data到前端,加载到页面就ok了。

这里面依赖了JQuery、XBGMenuTree.css、XBGMenuTree.js。

JQuery文件没什么好说的。
下面我们直接来看看XBGMenuTree.css和XBGMenuTree.js吧

XBGMenuTree.css:

@charset "utf-8";

.st_tree{ margin-top: 20px; }

/* 超链接 */
.st_tree a{ text-decoration:none; color:#7e8f9b; }

.st_tree li{ overflow: hidden; text-overflow:ellipsis; -o-text-overflow: ellipsis; white-space:nowrap; }

/* 菜单项 */
.st_tree ul li{ height: 40px; font-size:18px; line-height:40px; cursor:pointer; list-style:none; text-align: left; padding-left: 20%; }

/** 鼠标经过样式 **/
.st_tree ul li:hover{ background-color: #F5F5F5; }

/** 被选中样式 **/
.st_tree .selected-li{ background-color: #F8ECE6; border-right: 3.5px solid red; border-left: 3.5px solid red; }

.st_tree .selected-li a{ color:red; }

/* 菜单项 */
.st_tree ul li a{ font-size: 18px; }

/* 子菜单项 */
.st_tree ul ul li a{ font-size: 17px; }

/* 子子菜单项 */
.st_tree ul ul ul li a{ font-size: 16px; }


/* 子菜单项 */
.st_tree ul ul li{ padding-left: 30%; }

/* 子子菜单项 */
.st_tree ul ul ul li{ padding-left: 40%; }

XBGMenuTree.js:

$(function(){
   
    $.fn.extend({
        XBGMenuTree:function(options,data,elementId){
   

            initMenuTree(data,elementId);

            //初始化参数
            var option = options;

            option.tree=this;

            option._init=function(){
               
                this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */
                this.tree.find("ul ul[show='true']").show();    /* 显示 show 属性为 true 的子级菜单 */

            }/* option._init() End */

            /* 设置所有超链接不响应单击事件 */
            this.find("a").click(function(){
    $(this).parent("li").click(); return false; });

            /* 菜单项 <li> 接受单击 */
            this.find("li").click(function(){
   
                option.click($(this).find("a")[0]);    /* 触发单击 */
                /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */
                if($(this).next("ul").attr("show")=="true"){
                    $(this).next("ul").attr("show","false");                   
                }else{
                    $(this).next("ul").attr("show","true");
                }
                /* 初始化菜单 */
                option._init();
            });

            /* 设置所有父节点样式 */
            this.find("ul").prev("li").addClass("folder");

            /* 设置节点“是否包含子节点”属性 */
            this.find("li").attr("hasChild",false);
            this.find("li").find("a").attr("hasChild",false);
            this.find("ul").prev("li").attr("hasChild",true);
            this.find("ul").prev("li").find("a").attr("hasChild",true);

            /* 初始化菜单 */
            option._init();

            //添加元素
            function initMenuTree(data, elementId){
   
                var html = '<div class="st_tree"><ul>';
                for(var i=0;i<data.length;i++){
                    html = html + createChildren(data[i]);
                }
                html = html + '</ul></div>';
                $("#" + elementId).html(html);
                $(".st_tree ul li").bind("click",function(){
   
                    if($(this).attr("hasChild") == 'false'){
                        $(".st_tree ul li").removeClass("selected-li");
                        $(this).addClass("selected-li");   
                    }
                });
            };

            function createChildren(data){
   
                var html = '<li><a href="#" ref="' + data.url + '">' + data.name + '</a></li>';
                if(data.children){
                    html = html + '<ul>';
                    for(var i=0;i<data.children.length;i++){
                        html = html + createChildren(data.children[i]);
                    }
                    html = html + '</ul>';
                }
                return html;
            };

        }
    });


});

从css文件里面的样式可以看出,目前这个菜单控件支持三层,如果想支持更多层级,可以自己加样式就好了。

样式可能会比较好理解一些,就是一些初始背景颜色、鼠标放过去的样式、被选中的样式、缩进、子菜单字体等等。所以不多介绍了。

主要js可能需要解释一下。主要有这几点:

(1)$(function() {}); 当文档载入完毕就执行的意思

(2)jQuery插件开发分为两种:

1、 类级别

类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(…),相当于静态方法。

开发扩展其方法时使用$.extend方法,即jQuery.extend(object);

$.extend({ 
    add:function(a,b){
   return a+b;} , 
    minus:function(a,b){
   return a-b;} 
}); 

页面中调用:

var i = $.add(3,2); 
var j = $.minus(3,2); 

2、 对象级别

对象级别则可以理解为基于对象的拓展,如$(“#table”).changeColor(…); 这里这个changeColor呢,就是基于对象的拓展了。

开发扩展其方法时使用$.fn.extend方法,即jQuery.fn.extend(object);

$.fn.extend({ 

    check:function(){
    
        return this.each({ 
            this.checked=true; 
        }); 
    }, 
    uncheck:function(){
    
        return this.each({ 
            this.checked=false; 
        }); 
    } 
}); 

页面中调用:

$('input[type=checkbox]').check(); 
$('input[type=checkbox]').uncheck(); 

很明显本文使用的就是第二种。

(3)this关键字:this是Javascript语言的一个关键字。在XBGMenuTree.js有大量使用到,理解其含义,自然可以理解到其精妙之处。虽然this随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象!好好体会吧。

看到这里,猿友再反复看看上面的代码,估计有点基础的基本可以理解了。

但是,想要写出一个比较不错的控件,还要不断积累。不但是js知识,还有css知识。

(1)比如一些位置的知识:

jquery获取元素位置的方法有两个:

position方法:

获取匹配元素集中第一个元素的坐标,获取的是该元素相当于最近的一个拥有绝对或者相对定位的父元素的偏移位置。使用:

$("#target").position().left;
$("#target").position().top;

offset方法:
获取匹配元素集中第一个元素的坐标,获取的是该元素相对于document对象的偏移位置。
使用:

offset方法:
获取匹配元素集中第一个元素的坐标,获取的是该元素相对于document对象的偏移位置。
使用:

(2)CSS 伪元素

这里写图片描述

(3)JQ的选择器,以及CSS选择器,都有很多十分巧妙的用法。了解理解后,会大大提高你的效率。

先到这里吧,有空再相互交流学习分享!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2265.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • jdk的动态代理机制_jdk动态代理

    jdk的动态代理机制_jdk动态代理摘要:    代理模式为其他对象提供了一种代理以控制对这个对象的访问,具体实现包括两大类:静态代理和动态代理。Java动态代理机制的出现使得Java开发人员只需要简单地指定一组接口及委托类对象便能动态地获得代理类,并且其所生成的代理类在将所有的方法调用分派到委托对象上反射执行的同时,还可以对方法进行增强,这也正是SpringAOP的实现基础。通过阅读本文,读者将会对代理模式和Java动态…

    2022年10月16日
  • 人体表面积的计算公式_体表面积快速计算公式

    人体表面积的计算公式_体表面积快速计算公式体表面积(BSA)即是人体表面积。由于形状的特殊性,直接测量非常复杂。多年来,人们总结出许多计算公式用于估算体表面积。使用这些公式,身体表面积将以平方米计算出来。常用体表面积计算公式:1)Mosteller公式:一个最经常使用的公式,发布于1987年。BSA(m²)=([身高(cm)x体重(kg)]/3600)^½。2)DuBois与DuBois公式(1,注):BSA(…

  • sql if语句实例[通俗易懂]

    sql if语句实例[通俗易懂]if函数语法:if(booleantestCondition,value1,value2)返回值:当判断条件testCondition为TRUE时,返回value1;否则返回value2示例:原始数据转化:SELECTapp_list,if(account_id>20,1,0)FROMtemp.bdl_op_crawler_loan0902…

  • 条件运算符

    条件运算符条件运算符也叫三元运算符语法:条件表达式?语句1:语句2;条件运算符是ECMAScript中功能最多的运算符,它的形式与Java中的相同。variable=boolean_expre

  • k8s添加nfs动态绑定存储(dynamic provisioning)nfs-server-provisioner

    k8s添加nfs动态绑定存储(dynamic provisioning)nfs-server-provisioner

  • java九九乘法表代码加解释_java九九乘法表编程代码是什么?

    java九九乘法表代码加解释_java九九乘法表编程代码是什么?展开全部packagech02;publicclassTEST{publicstaticvoidmain(String[]args){for(inti=1;i<=9;i++){for(intj=1;j<=i;j++){System.out.print(j+”*”+i+”=”+(i*j)+””);}System.out.println(…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号