自写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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • http请求415,报错Unsupported Media Type

    http请求415,报错Unsupported Media Type背景:做一个项目的接口对接,用Getman\postman等接口调试工具都是可以的。用程序运行就报415.原因:根据接口所传参数的不同,post请求的Content-type有四种:application/x-www-form-urlencoded(默认)application/xmlapplication/jsonmultipart/form-data我所对接的接口所传的…

    2022年5月1日
    106
  • netfilter-iptable

    netfilter-iptable什么是Netfilter/iptableNetfilter/iptables是Linux内核内置的报文过滤框架,程序可以通过该框架完成报文过滤、地址转换(NAT)以及连接跟踪等功能。Netfilter/iptables由两部分组成,一部分是Netfilter的”钩子(hook)“,这些”钩子”由Linux内核协议栈提供,内核模块可以通过注册”钩子”来完成各种各样的功能。 另一部

    2022年5月28日
    42
  • js替换所有的回车换行符[通俗易懂]

    js替换所有的回车换行符[通俗易懂]//替换所有的回车换行functionTransferString(content){varstring=content;try{string=string.replace(/\r\n/g,””)string=string.replace(/\n/g,””);}catch(e){

    2022年5月24日
    90
  • Enterprise Library 4.0

    Enterprise Library 4.0微软发布了支持VisualStudio2008的新版本EnterpriseLibrary4.0,同时也发布了他们的依赖注入容器Unity应用程序块的1.1版本。模式与实践团队的产品经理GrigoriMelnik宣布发布EnterpriseLibrary4.0和Unity1.1更新,详细描述了所有新特性。MSDN开发中心的新闻稿解释了这个版本对开发人员的意义:此次发布…

    2022年10月20日
    3
  • vs实现用户注册登录_用户注册和登录的实现

    vs实现用户注册登录_用户注册和登录的实现publicstaticUserInfoGetUser(stringname,stringpwd){//填写搜索姓名和密码的sql语句stringsql=string.Format(“select*fromUserInfowhereLoginName='{0}’andPassword='{1}'”,name,pwd);DataTabledt=DBHelper.ExcuteTab.

    2022年8月22日
    12
  • 女生会java找什么工作吗_还在说女生不适合学java? 其实女生学java更有优势, 而且更容易找到工作!…

    女生会java找什么工作吗_还在说女生不适合学java? 其实女生学java更有优势, 而且更容易找到工作!…女生适合学java吗?女生做IT怎么样首先要表明我的观点,编程是不分男女,什么女生不适合学编程的说法,从客观上来说,我觉得这是一种偏见。不少人潜意识里认为女生不适合从事IT岗位的工作,因为他们觉得这些岗位对逻辑性的要求很好,而且要具备一定的操作水平,而女生在这方面比较薄弱。实际上,女生从Java的工作,很多时候能做得比男生更好。为什么说女生比男生更能学好java呢?1、女生往往比男生更细心,我认为…

    2022年7月8日
    24

发表回复

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

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