javascript-省市区与分类多级联动的插件

2024-08-23 19:18

本文主要是介绍javascript-省市区与分类多级联动的插件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

最近公司一直在优化项目,需要用到一个无限级的分类,希望在选择的时候,可以做到细分,将对应的视频,教学资料按照一定的规则来进行分类,后来写了这一个插件。

wileselect.js代码:

(function($){
    // 定义插件全局变量,可以在其他的函数中引用
    var config;
    // 定义所有的执行方法
    var methods = {
        // 初始化开始实例函数
        begin : function(options) {
           return this.each(function(){
                // 判断目标DOM是否存在
                var $this = $(this);
                if($this.length < 1) {
                    return false;
                }
                /** 默认配置参数和配置值
                *data:json数据
                *idfield:每一个类别id值的字段,默认id
                *namefield:种类名称的字段
                *childrenfield: 子级种类名称的字段
                *required:必选项,是否显示”请选择“,默认false,显示
            `   */
                var settings = $.extend({
                    data:null,
                    idfield:"id",
                    namefield:"category",
                    childrenfield:"children",
                    required: false
                },options);


                config = settings;


                var screewidth = $(document).width()*0.5;


                $this.parent().css({
                    "position":"relative",
                    "height":"34px"
                });
                $this.css({
                    "position":"absolute",
                    "width":screewidth
                });


                // 变量定义
                var box_obj = $this;
                // 后端的所有数据json格式
                var data_json;
                // 父级的select元素
                var parent_tpl = '<select class="wire-parent wire-select"></select>';
                // 子级的select元素
                var children_tpl = '<select class="wire-select"></select>';
                // select元素的样式
                var cssstyle = {
                        "background-color": "#fff",
                        "background-image": "none",
                        "border": "1px solid #ccc",
                        "border-radius":"4px",
                        "box-shadow": "0 1px 1px rgba(0, 0, 0, 0.075) inset",
                        "color": "#555",
                        "font-size": "14px",
                        "height": "34px",
                        "line-height":"1.42857",
                        "padding": "3px 6px",
                        "transition": "border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s"
                };
                // 父级select选择框
                $(parent_tpl).appendTo(box_obj).css(cssstyle);


                var select_prehtml = (settings.required) ? "" : "<option value='' data-list=''>请选择</option>";


                var parent_obj = box_obj.find('.wire-parent');


                //初始化函数
                var init = function() {
                    var temp_html = select_prehtml;
                    $.each(data_json,function(i,parent) {
                        if(typeof(data_json[i][settings.childrenfield]) == "undefined") {
                            temp_html += "<option value='" + parent[settings.idfield] + "' data-list=''>" + parent[settings.namefield] + "</option>";
                        }else if(typeof(data_json[i][settings.childrenfield])=="object") {
                            var list = JSON.stringify(data_json[i][settings.childrenfield]);
                            temp_html += "<option value='" + parent[settings.idfield] + "' data-list='"+list+"'>" + parent[settings.namefield] + "</option>";
                        }
                        
                    });
                    parent_obj.html(temp_html);


                }


                var hello = function() {
                    alert(select_prehtml);
                }


                // 设置json数据
                if (typeof (settings.data) == "string") {
                    $.getJSON(settings.data, function(json) {
                        data_json = json;
                        init();
                    });
                } else {
                    data_json = settings.data;
                    init();                    
                }


                // 设置选择下一级函数
                box_obj.on("change",'.wire-select',function(){
                    var temp_html = select_prehtml;
                    var data = $(this).find("option:selected").attr("data-list");
                    $(this).nextAll().remove();
                    if(data=='') {
                        return false;
                    }
                    //下一级显示
                    data=JSON.parse(data);
                    $.each(data,function(i,parent) {
                        if(typeof(data[i][settings.childrenfield]) == "undefined") {
                            temp_html += "<option value='" + parent[settings.idfield] + "' data-list=''>" + parent[settings.namefield] + "</option>";
                        }else if(typeof(data[i][settings.childrenfield])=="object") {
                            var list = JSON.stringify(data[i][settings.childrenfield]);
                            temp_html += "<option value='" + parent[settings.idfield] + "' data-list='"+list+"'>" + parent[settings.namefield] + "</option>";
                        }
                        
                    });
                    $(children_tpl).appendTo(box_obj).html(temp_html).css(cssstyle);
                });
            
            });
        },


        /**获取对应逐级分类的值
        *可以获取任意一级
        *
        */
        categoryid : function() {
                var $this = this;
                var first = $this.find("select.wire-select:first");
                var value = first.find("option:selected").val();
                if(value=="") {
                    return value;
                }
                var target = $this.find("select.wire-select:last");
                if(target.find("option:selected").val()=="") {
                    target = target.prev();
                }

                return target.find("option:selected").val();

        }
    }
    // 定义暴露函数
    $.fn.wileselect = function(){
        var method = arguments[0];
        if(methods[method]) {
            method = methods[method];
            //将含有length属性的数组获取从第下标为1的之后的数组元素,并返回数组
            arguments = Array.prototype.slice.call(arguments,1);
        }else if(typeof(method)=="object" || !method) {
            method = methods.begin;
        }else{
            $.error( 'Method ' +  method + ' does not exist plug on jQuery.wileselect' );
            return this;
        }
        
         //jquery的实例对象将拥有执行method的能力,并且arguments为method的参数
        return method.apply(this,arguments);
 
    }
 
})(jQuery);


html代码:

<!DOCTYPE html>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="bootstrap.min.css" />
</head>
<body>
  <div class="container" id="main">
        <div class="demo" style="margin-top:30px">
<div class="row">
<div class="col-md-12 form-horizontal">
               <div class="form-group" class="col-md-3">
   <label for="exampleInputEmail1" class="col-md-1">课程分类</label>
   <div class="col-md-2">
                            <div  id="category">


                            </div>
   </div>   
</div>
</div>
</div>
        </div>


        <div>
            <button type="button" οnclick="save()">保存</button>
        </div>
        
    </div> 
    <script type="text/javascript" src="http://www.sucaihuo.com/Public/js/other/jquery.js"></script>
    <script type="text/javascript" src="select2.js"></script>
    <script type="text/javascript">
        $(function() {
            $("#category").wileselect({
                data:[
                        {"id":1, "category": "前端课程", "children": [{"id":2,"category": "HTML5"}, {"id":3,"category": "CSS3", "children": [{"id":4,"category":"HTML","children":[{"id":22,"category":"HTML5"},{"id":25,"category":"HTML4"}]}, {"id":5,"category": "AJAX"}]}, {"id":6,"category": "JSON"}]},
                        {"id":7,"category": "编程语言", "children": [{"id":8,"category": "C"}, {"id":9,"category": "C++"}, {"id":10,"category": "Python"}, {"id":11,"category": "PHP"}, {"id":12,"category": "JAVA"}]},
                        {"id":13,"category": "数据库", "children": [{"id":14,"category": "Mysql"}, {"id":15,"category": "SqlServer"}, {"id":16,"category": "Oracle"}, {"id":17,"category": "Mssql"},{"id":33,"category": "NOSQL","children":[{"id":34,"category":"mongodb"}]}]},
                    ]
            });


        });
        //
        function save() {
            // 直接获取最后一级选择的值
            var id = $("#category").wileselect("categoryid");
            alert(id);
        }
    </script>
</body>
</html>


data:可以从服务端返回json数据

demo:







这篇关于javascript-省市区与分类多级联动的插件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100265

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input