自写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选择器,都有很多十分巧妙的用法。了解理解后,会大大提高你的效率。

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • powershell校验哈希值_哈希校验什么意思

    powershell校验哈希值_哈希校验什么意思  在不安装任何第三方软件的情况下,我们也可在Windows中直接使用Powershell校验文件多种算法的哈希值,其中就包括:SHA1、SHA256、SHA384、SHA512、MACTripleDES、MD5、RIPEMD160算法。  使用起来也非常简单,大家可以参考如下示例:Get-FileHash[-Path文件路径][-Algorithm算法]…

    2022年9月4日
    3
  • sdut 3-7 类的友元函数的应用

    sdut 3-7 类的友元函数的应用

    2022年3月5日
    32
  • C语言-链表排序_单链表的排序c语言

    C语言-链表排序_单链表的排序c语言C语言-链表排序题目描述已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。输入第一行,a、b两个链表元素的数量N、M,用空格隔开。接下来N行是a的数据然后M行是b的数据每行数据由学号和成绩两部分组成输出按照学号升序排列的数据样例输入235100689382495210样例输出210382…

    2022年10月11日
    0
  • 新版白话空间统计(8):莫兰指数小结

    新版白话空间统计(8):莫兰指数小结本节对前面写的莫兰指数部分留下的一下小问题进行解答,里面包括一些读者朋友们通过邮件提出的一些问题。Q1:ArcGIS中,计算莫兰指数的工具里面的那个Row(行标准化)是拿来干嘛的?A:…

    2022年6月25日
    60
  • 移动三国己然鼎立,普​通开发者如何选择开发​平台?

    移动三国己然鼎立,普​通开发者如何选择开发​平台?

    2021年8月13日
    54
  • 什么是java?为什么要学Java? 学Java有什么用?

    什么是java?为什么要学Java? 学Java有什么用?肯定会有许多人或多或少都和我一样,当偶然在电视上看到程序员对着电脑飞快敲下一串代码,不禁为他们发出惊叹,想象着有一天自己也能这样。是的,有一天你也能这样!因为我已经实现了!下面我们来看看到底什么是JAVA?为什么要学习,学习了有什么用?先给大家看一下19年计算机语言排行什么是java?为什么要学Java?学Java有什么用?1.什么是JavaJava它就是一种编程语言,别的编程语言能干的事,它都能干。2.编程语言这么多,我为什么选择Java呢?简单易学首先Java是一个面向对象的编程语言

    2022年7月7日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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