`
icezx
  • 浏览: 14796 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个可以无限级联的下拉框 跨浏览器

阅读更多
前阵子要写javaScript,想想接触js这么久,从来没有好好用面向对象的方式写一个出来,
于是就按照我的想法,实现了这个无限级联下拉框,不知道对js面向对象理解的对不对,呵呵。。贴上来分享一下
/**
*   作者:zhengxu         转载请注明作者
*  mail:zhengxu238@163.com
*  版本 0.9
* 时间:2011-3-20
* 描述:原生,可配置无限级下拉框的通用组件  ,包含丰富的事件处理机制
* 浏览器支持:支持ie6以上版本。google Chrome,
*     firefox装载数据的时候有小问题。下个版本再修复。
* MutiSelector类
* 可选参数列表
* el: 表单元素。可理解为containner。可为任意对象。MutiSelector对象初始化的时候将自动替换该对象
* lazyLoad: 是否惰性加载。   程序默认实现惰性加载。该属性暂时无用,可不配置
* width: Mutiselector宽度
* height: 高度
* enable:控件是否为禁用状态,一般级联下拉框的首个下拉框是不禁用的。 true|false
* tip: 下拉列表框的提示信息如:“请选则车辆品牌”
* linkedEl:该属性很重要,代表我们告诉控件,我的下级联动下拉框是谁
* dataLoadingUrl:ajax请求的数据路径
* *****************************************************以下为事件定义。可选配置。不影响正常使用***********************************************************
* **************************************只对第一层的下拉框起作用,后续的操作可以通过onchange前后的事件织入逻辑******************************************************************************
*    onBeforeLoading: 数据加载前事件
*   onLoadingEnd:数据加载结束事件
*   *********************************************************
*     onBeforeChange: 选项框值改变前事件
*     onAfterChange: 值改变后事件
*
*     
************************CSS样式自定义*************
* 可以通过this关键字如 this.style.fontSize=12px 的形式对该下拉框对象进行样式修改
* 如:
*
*
*
*/
var MutiSelector = function() {

    this.othis = arguments[0];
    this.el = this.othis.el;

    this.lazyLoad = this.othis.lazyLoad;
    this.width = this.othis.width;
    this.height = this.othis.height;

    this.onDraw();

    this.comp.enable = typeof this.othis.enable == 'undefined' ? false : this.othis.enable

    if (this.comp.enable)
    {
        if (this.comp.disabled)
        {
            this.comp.disabled = false;
        }
    } else {
        this.comp.disabled = "true";
    }
    this.comp.tip = this.othis.tip;
    this.comp.linkedEl = this.othis.linkedEl;
    this.comp.dataLoadingUrl = this.othis.dataLoadingUrl;
    this.comp.onBeforeLoading = this.othis.onBeforeLoading;
    this.comp.onLoadingEnd = this.othis.onLoadingEnd;


    this.comp.onBeforeChange=this.othis.onBeforeChange;
     this.comp.onAfterChange=this.othis.onAfterChange;
  
    this.comp.onchangeMethod=this.onchange;
  
    this.comp.onchange =function(){
                  if(this.onBeforeChange){this.onBeforeChange();}
                  this.onchangeMethod();
                 if(this.onAfterChange){this.onAfterChange();}
    }
    this.comp.getData = this.getData;
    this.comp.initailizeItemFace = this.initailizeItemFace;
    this.comp.data = null;             //该对象存放服务器返回的jason数据
    this.comp.load = this.load;

  
    this.comp.loadData=function(){
        if(this.onBeforeLoading) {this.onBeforeLoading();}
        this.load();
        if(this.onLoadingEnd) {this.onLoadingEnd();}
    }

    this.comp.loadData();
    this.comp.getComp = function() {
        return this;
    }
}
/**
* 定于MutiSelector的原型内的常量属性
* 原型内的所有属性和方法,在对象间可共享
*/
MutiSelector.prototype = {



    onDraw:function() {
        this.comp = document.createElement("select");
        this.comp.id = this.el;
        this.comp.name = this.el;
        this.comp.style.width = this.width;
        this.comp.style.height = this.height;

        $("#" + this.el).replaceWith(this.comp);
    } ,

    load:function() {

        if (this.dataLoadingUrl && this.enable) {
            var result = this.getData();
            this.initailizeItemFace(result);
        }

    }  ,
    getData:function() {
        var el = this;
//        alert(this.value + ":" + el.dataLoadingUrl);
        var obj = $.ajax({
            type: "POST",
            url:this.dataLoadingUrl,
            data: "id=" + this.value,
            async : false      ,
            success: function(msg) {

                el.data = msg;

            }
        });

        return el.data;
    },
    initailizeItemFace:function(result) {

        //        debugger;
        if (result == '' || result == null || typeof result == 'undefined')
        {
            var optionErr = document.createElement("option");
            optionErr.innerHTML = "没有数据返回";
            this.appendChild(optionErr);
            return false;
        }

        var json = eval(result);
        //        alert("json:"+json);
        this.innerHTML = "";
        var optionNull = document.createElement("option");
        optionNull.innerHTML = this.tip;
        this.appendChild(optionNull);
        for (var i = 0; i < json.length; i++) {
            var option = document.createElement("option");
            option.value = json[i]["code"];
            option.innerHTML = json[i]["title"];
            this.appendChild(option);
        }
    }   ,
    onchange:function() {
       
//                                 alert(132);
//        debugger;
        if (this.linkedEl) {

            var linkEl = $("#" + this.linkedEl);
            var linkDom = linkEl[0];
            var result = this.getData();
            var linkDom = linkEl[0];
            linkDom.initailizeItemFace(result);
            linkEl[0].disabled = false;
        }
        //        if( var paramValue=this.value;)

    }
}

/************结合jquery来使用,也可以单独使用****************/
$(document).ready(function() {


       var obj = new MutiSelector(
    {
        el:       "selector1"             ,
        linkedEl:  "selector2" ,
        tip:"请选则品牌" ,
        width: '500px'     ,
        height:'20px',
        dataLoadingUrl: "http://localhost:60/jq/testServlet.do",
        enable:true    ,
        onBeforeLoading:function(){
            alert("数据加载前事件") ;
        }  ,
        onLoadingEnd:function(){

            alert("获取的comp组件:"+this);
            alert("数据加载后事件 ");
        }  ,
        onBeforeChange:function(){

            alert("选择改变前事件")
        },
        onAfterChange:function(){
            alert("选择改变后")
        }


    })



    var obj1 = new MutiSelector(
    {
        el:       "selector2"             ,
        linkedEl:  "selector3" ,
        dataLoadingUrl: "http://localhost:60/jq/testServlet.do",
        tip:"请选则车系" ,
        width: '500px'     ,
        height:'20px' ,
        enable:false
    })


    var obj2 = new MutiSelector(
    {
        el:       "selector3"             ,
        tip:"请选则颜色" ,
        width: '500px'     ,
        height:'20px' ,
        enable:false
    })
});


1
3
分享到:
评论
2 楼 icezx 2011-08-19  
wulei_wolf1985 写道
学习了!!!

不知道写的怎么样。。很少写js。我是菜禽水平呵呵
1 楼 wulei_wolf1985 2011-08-19  
学习了!!!

相关推荐

    无限下拉框级联

    通过上述技术和方法,我们可以构建出一个高效、易用的无限下拉框级联功能。在实际项目中,开发者可能会选择使用现有的库或框架,如jQuery、React、Vue或Angular,它们提供了丰富的组件和工具,能更便捷地实现这种...

    ajax+asp+acces实现联动无限级下拉框

    这个项目“ajax+asp+acces实现联动无限级下拉框”利用了AJAX(异步JavaScript和XML)、ASP(Active Server Pages)以及Access数据库来创建一个四级联动的下拉菜单系统。 首先,让我们了解一下每个技术的角色: 1. ...

    支持多浏览器的无限级下拉菜单

    以前在网上找的例子,忘了出处了。。。 支持无限级菜单 xml方式书写菜单 完全自定义菜单项 一个文档可实例化多个对象 多种显示模式 可支持灵活切换皮肤 多浏览器兼容(ie6+ ,firefox ,sarari ,opera?)

    级联下拉框

    在这些场景中,用户选择一个选项后,下拉框会动态更新,显示与前一选择相关的下一级别选项,这就是所谓的“无限级联”。 实现无限级联下拉框的核心技术主要包括HTML、CSS和JavaScript。HTML用于构建基础结构,CSS...

    火狐 IE js脚本库【可查找下拉框】【无限级菜单】【加强日历】

    在IT领域,网页开发是不可或缺的一部分,而...对于那些需要在广泛浏览器环境中提供高质量用户体验的开发者来说,这是一个非常有价值的资源。通过深入理解和应用这些组件,开发者可以提升网站的专业性和用户满意度。

    一个基于Vue2后台管理系统demo无限级菜单下拉树形选择框

    **Axios**:这是一个基于Promise的HTTP库,可以在浏览器和node.js中使用。在Vue2项目中,Axios常用于处理API请求,如获取数据、提交表单、更新资源等。它的接口设计友好,易于集成到Vue的生命周期钩子中。 **...

    支持无限级的联动下拉菜单

    1. 数据结构设计:为了支持无限级,我们需要一个能够存储层级关系的数据结构。常见的有树形结构(如JSON对象),每个节点包含自身的值和子节点数组。通过递归处理,可以轻松地构建和遍历这个结构。 2. JavaScript...

    一个级联菜单(IE ONLY),不过代码很精简!

    根据给定文件的信息,我们可以得到关于无限级联下拉框的知识点如下: 1. 什么是级联菜单(Cascading Drop-Down Menu)? 级联菜单是一种用户界面控件,它允许用户在一个下拉列表(下拉框)中选择一个选项后,另一个...

    jQuery实现的无限级下拉菜单功能示例

    标题提到的“jQuery实现的无限级下拉菜单功能示例”,核心在于展示了如何利用jQuery的事件处理机制来实现一个交互式的、多层次的下拉菜单。这不仅仅是关于HTML结构的搭建,更重要的是如何通过jQuery来动态地控制这些...

    无限菜单之 xml+popup 版(IE5.5+)

    我本来一直以为Popup窗口是不可以多个共存的,不过偶然从51js上知道:父Popup窗口可以创建子Popup窗口,子Popup窗口又可以创建子Popup窗口,这样就可以同时存在一个Popup窗口家族,当父Popup窗口关闭,所有的子孙...

    JQuery&CSS;&CSS;+DIV实例大全.rar

    4.JS+CSS通用一个页面同时三个焦点图轮换效果完整实例 5.JS+CSS网页版模拟QQ登录框界面特效示例 6.JS+flash立柱广告代码仿百度MP3搜索右侧可伸缩的立柱广告效果 7.JS版本黑色超动感二级菜单导航模块代码 穿越...

Global site tag (gtag.js) - Google Analytics