javascript写的以xml为数据源的下拉框控件

本文介绍了一个使用XML作为数据源的自定义下拉框组件,该组件能够根据输入的内容自动匹配并显示相应的选项,支持多属性适配,并详细展示了其构造方法和常用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

此控件以xml为数据源,可以进行输入的多属性自动适配

例如,当你在输入框中输入张三或是长沙,或是湖南,都会出现张三让你选择,输入18,将同时出现张三李四

测试数据源如下:

<?xml version="1.0" encoding="utf-8" ?>
<students>
<student>
   <id>s1</id>
   <name>张三</name>
   <province>湖南</province>
   <city>长沙</city>
   <age>18</age>
</student>
<student>
   <id>s2</id>
   <name>李四</name>
   <province>湖北</province>
   <city>武汉</city>
   <age>18</age>
</student>
<student>
   <id>s3</id>
   <name>王五</name>
   <province>四川</province>
   <city>成都</city>
   <age>20</age>
</student>
</students>

//---------------------------------------------DropDownListx.js------------------------

function DropDownListx(parent,id)
{
    this.id = id;
    var i;
    var me = this;
    this.parent = parent;
    var e = this.parent;
    var y = e.offsetTop;
    var x = e.offsetLeft;
    this.text = e.value;
    while (e = e.offsetParent)
    {
        y += e.offsetTop;
        x += e.offsetLeft;
    }
    this.parentInfo = {x:0,y:0};
    this.parentInfo.x = x;
    this.parentInfo.y = y;
   
    //外观
    this.width = this.parent.offsetWidth;
    this.height = 150;
    this.disabled = false;
    this.visibility = "hidden";
    this.attributed = false;//数据是否以属性表示,也可以用node来表示
    this.mainText = "";//要显示的字段名字
    this.mainValue = "";//要返回的值的字段名字
    this.selectedIndex = -1;//被選中的索引
    this.mouseoverIndex = -1;//鼠標懸停時的索引
    this.mouseoutIndex = -1;//鼠標離開時的索引
    this.selectedValue = "";
    this.selectedText = "";
    this.value = "";
    this.text = "";
    this.drawed = false;//表示是否重繪過
    this.table = null;
    //数据源
    this.dataSource = null;
    try
    {
        for(i = 6;i>0;i--)
        {
            try
            {
                this.dataSource = new ActiveXObject("MSXML2.DOMDocument." + i + ".0");
                break;
            }
            catch(ex1){;};
        }
    }
    catch(ex2){;};
    this.dataSource.async = false;
    this.dataSource.setProperty("SelectionLanguage", "XPath");
    var sh = function(){if(me.visibility == "hidden")me.show();};
    this.parent.attachEvent("onfocus",function(){window.setTimeout(sh,100);});
    this.parent.attachEvent("onchange",function(){me.filter(me.parent.value);});
    this.parent.attachEvent("onkeyup",function(){me.filter(me.parent.value);});
    this.parent.attachEvent("onclick",function(){if(event.button == "1")window.setTimeout(sh,10);});
    this.parent.style.cursor = "hand";
    //事件
    this.onSelected=null;
    this.onmouseover = null;
    this.onmouseout = null;
    this.onhide = null;
   
    window.document.attachEvent("onclick",function()
    {
        //有可能e不在最上層,所以要找到牠的區域
        if(event.x < me.parentInfo.x ||
           event.x > me.parentInfo.x + me.parent.offsetWidth ||
           event.y < me.parentInfo.y ||
           event.y > me.parentInfo.y + me.parent.offsetHeight)
        {
            if(me.visibility == "visible")
                me.hide();
        }
    });
}
//重新獲取位置,因爲parent的位置可能變動
DropDownListx.prototype.getPosition=function()
{
    var e = this.parent;
    var y = e.offsetTop;
    var x = e.offsetLeft;
    while (e = e.offsetParent)
    {
        y += e.offsetTop;
        x += e.offsetLeft;
    }
    this.parentInfo = {x:0,y:0};
    this.parentInfo.x = x;
    this.parentInfo.y = y;
    this.width = this.parent.offsetWidth;
}
//画出列表
DropDownListx.prototype.show=function()
{
    this.getPosition();
    var me = this;
    //画一个div
    var divid = this.id + "_div_" + this.parent.id;
    var d = document.getElementById(divid);
    if(d==null)
    {
        d = document.createElement("div");
        d.style.position = "absolute";
    }
    d.style.borderLeft   = "black 1px groove";
    d.style.borderTop    = "black 1px groove";
    d.style.borderRight = "black 1px groove";
    document.body.appendChild(d);
    d.setAttribute("id",divid);
    d.style.borderBottom = "black 1px groove";
    d.style.backgroundColor = "white";
    d.style.left = this.parentInfo.x + "px";
    if(document.body.clientHeight < this.parentInfo.y + this.parent.offsetHeight + this.height)
        d.style.top = (this.parentInfo.y - this.height) + "px";
    else
        d.style.top = (this.parentInfo.y +( this.parent.offsetHeight==""?20:this.parent.offsetHeight)) + "px";
    d.style.overflowX = "hidden";
    d.style.overflowY = "auto";
    d.style.zIndex = 999;
    d.style.visibility = "visible";
    d.style.borderWidth = "1px";
    this.visibility = "visible";
    this.listData();
    this._selectByName(this.parent.value);
}
DropDownListx.prototype.listData=function()
{
    var e = this.parent;
    var base = this;
    //显示数据
    if(this.nodeList == null)
        this.nodeList = this.dataSource.documentElement.childNodes;
    var str="<table id = /"" + this.id + "_table_" + e.id + "/" width=/"" + (this.width) + "px/" height=/"24px/">";
    for(var i = 0;i<this.nodeList.length;i++)
    {
        var text = (base.attributed?this.nodeList.item(i).getAttribute(this.mainText):this.nodeList.item(i).selectSingleNode(this.mainText).text);
        str = str + "<tr><td id = /"" + this.id + "_td_" + i + "_" + e.id + "/" style=/"border-bottom: black 1px dotted;cursor:hand/" >" + text + "</td></tr>";
    }
    str += "</table>";
    var div = document.getElementById( this.id + "_div_" + e.id);
    div.innerHTML = str;
    var table = document.getElementById( this.id + "_table_" + e.id);
    this.table = table;
    if(table.offsetHeight < this.height)
        div.style.height = table.offsetHeight + 3;
    else
        div.style.height = this.height + 3;
    div.style.width = table.offsetWidth;
    for(var j = 0;j<this.nodeList.length;j++)
    {
        var d = document.getElementById(this.id + "_td_" + j + "_" + e.id );
        d.attachEvent('onclick',function()
        {
            var _td = document.getElementById(base.id + "_td_" + base.selectedIndex + "_" + e.id);
            if(_td)
            {
                _td.style.backgroundColor = "";
                _td.style.color = "";
            }
            base.selectedIndex = event.srcElement.parentElement.rowIndex;
            document.getElementById(base.id + "_div_" + base.parent.id ).style.visibility="hidden";
            base.selectedValue = (base.attributed?base.nodeList.item(base.selectedIndex).getAttribute(base.mainValue):base.nodeList.item(base.selectedIndex).selectSingleNode(base.mainValue).text);
            base.selectedText = (base.attributed?base.nodeList.item(base.selectedIndex).getAttribute(base.mainText):base.nodeList.item(base.selectedIndex).selectSingleNode(base.mainText).text);
            base.value = base.selectedValue;base.text = base.selectedText;
           
            if(base.onSelected != null)
                base.onSelected.apply(base);
            return false;
        });
        d.onmouseover=function()
        {
            base.mouseoverIndex =parseInt(event.srcElement.id.split("_td_")[1].split("_")[0]);
            try
            {
                event.srcElement.style.backgroundColor='gray';
                event.srcElement.style.color='white';
                e.value = event.srcElement.innerText;
                if(base.onmouseover != null)
                    base.onmouseover.apply(base);
            }
            catch(ex){};
        };
        d.onmouseout = function()
        {
            base.mouseoutIndex = parseInt(event.srcElement.id.split("_td_")[1].split("_")[0]);
            if(event.srcElement.id == base.id + "_td_" + base.selectedIndex + "_" + e.id)
            {
                event.srcElement.style.backgroundColor='red';
                event.srcElement.style.color='blue';
            }
            else
            {
                event.srcElement.style.backgroundColor='';
                event.srcElement.style.color='';
            }
            if(base.onmouseout != null)
                base.onmouseout.apply(base);
        }
    }
    this.drawed = true;
}
DropDownListx.prototype.hide=function()
{
    var d = document.getElementById(this.id + "_div_" + this.parent.id);
    if(d)
        d.style.visibility = "hidden";
    this.visibility = "hidden";
    this._select(this.selectedIndex);//为了防止有筛选的数据,要先选择
    this.nodeList = this.dataSource.documentElement.childNodes;
    if(this.onhide != null)
        this.onhide.apply(this);
}
DropDownListx.prototype.setSource=function(d)
{
    this.dataSource.loadXML(d.xml);
    this.nodeList = d.documentElement.childNodes;
    this.drawed = false;
}
DropDownListx.prototype.setChildNodes=function(nodes)
{
    this.dataSource.loadXML("<?xml version=/"1.0/" encoding=/"utf-8/" ?><options></options>");
    var node = this.dataSource.documentElement;
    for(var i = 0;i<nodes.length;i++)
    {
        var opt = doc.createNode(1,"option","");
        var r   = nodes.item(i).childNodes
        for(var j = 0;j<r.length;j++)
        {
            var att = doc.createNode(1,r.item(j).nodeName,"");
            att.text = r.item(j).text;
            opt.appendChild(att);
        }
        node.appendChild(opt);
    }
    this.drawed = false;
}
DropDownListx.prototype.filter=function(text)
{
    if(text==null || text =="")
    {
        this.reset();      
    }
    else
    {
        var _text = text.split(" ");
        var str = "./*[contains(.,'" + _text[0] + "')";
        for(var i=1;i<_text.length;i++)
        {
            str = str + " and contains(.,'" + _text[i] + "')"
        }
        str = str + "]";
       
        this.nodeList = this.dataSource.documentElement.selectNodes(str);
    }
    this.listData();
}
//根据查询选中的节点的子节点的值
DropDownListx.prototype.getNodeValue=function(nodeName)
{
    if(nodeName == null || nodeName == "")
        return this.value;
    return (this.attributed?this.nodeList.item(this.selectedIndex).getAttribute(nodeName):this.nodeList.item(this.selectedIndex).selectSingleNode(nodeName).text);
   
}

DropDownListx.prototype.reset=function()
{
    this.nodeList = this.dataSource.documentElement.childNodes;
    var _td = document.getElementById(this.id + "_td_" + this.selectedIndex + "_" + this.parent.id);
    if(_td)
    {
        _td.style.backgroundColor = "";
        _td.style.color = "";
    }
    this.selectedIndex = -1;
    this.selectedValue = "";
    this.selectedText = "";
    this.value = "";
    this.text = "";
    this.parent.value = "";
}
DropDownListx.prototype.select=function(index)
{
    if(index == -1)
        this.reset();
    else
    {
        var _td = document.getElementById(this.id + "_td_" + this.selectedIndex + "_" + this.parent.id);
        if(_td)
        {
            _td.style.backgroundColor = "";
            _td.style.color = "";
        }
        this.nodeList = this.dataSource.documentElement.childNodes;
        this.selectedIndex = index;//被選中的索引
        this.selectedValue = this.attributed?this.nodeList.item(index).getAttribute(this.mainValue):this.nodeList.item(index).selectSingleNode(this.mainValue).text;
        this.selectedText = this.attributed?this.nodeList.item(index).getAttribute(this.mainText):this.nodeList.item(index).selectSingleNode(this.mainText).text;
        this.value = this.selectedValue;
        this.text = this.selectedText;
        this.parent.value = this.selectedText;
        try
        {
            this.table.rows.item(index).cells.item(0).focus();
            this.table.rows.item(index).cells.item(0).style.backgroundColor = "red";
            this.table.rows.item(index).cells.item(0).style.color = "blue";
            this.parent.focus();
        }catch(ex){}
        if(this.onSelected != null)
            this.onSelected.apply(this);       
    }
}
DropDownListx.prototype.selectByName=function(name)
{
    if(name == null || name == "")
    {
        this.reset();
        return;
    }
    for(var i = 0;i<this.nodeList.length;i++)
    {
        var _name = this.attributed?this.nodeList.item(i).getAttribute(this.mainText):this.nodeList.item(i).selectSingleNode(this.mainText).text;
        if(_name == name) break;
    }
    if(i != this.nodeList.length)
    {
        this.select(i);
    }
    else
        this.reset();
}
DropDownListx.prototype.selectByValue=function(value)//不響應事件的副本
{
    if(value == null || value == "")
    {
        this.reset();
        return;
    }
    for(var i = 0;i<this.nodeList.length;i++)
    {
        var _value = this.attributed?this.nodeList.item(i).getAttribute(this.mainValue):this.nodeList.item(i).selectSingleNode(this.mainValue).text;
        if(_value == value) break;
    }
    if(i != this.nodeList.length)
    {
        this.select(i);
    }
    else
        this.reset();
}
DropDownListx.prototype._select=function(index)//不響應事件的副本
{
    if(index == -1)
        this.reset();
    else
    {
        var _td = document.getElementById(this.id + "_td_" + this.selectedIndex + "_" + this.parent.id);
        if(_td)
        {
            _td.style.backgroundColor = "";
            _td.style.color = "";
        }
        //this.nodeList = this.dataSource.documentElement.childNodes;
        this.selectedIndex = index;//被選中的索引
        this.selectedValue = this.attributed?this.nodeList.item(index).getAttribute(this.mainValue):this.nodeList.item(index).selectSingleNode(this.mainValue).text;
        this.selectedText = this.attributed?this.nodeList.item(index).getAttribute(this.mainText):this.nodeList.item(index).selectSingleNode(this.mainText).text;
        this.value = this.selectedValue;
        this.text = this.selectedText;
        this.parent.value = this.selectedText;
        try
        {
            this.table.rows.item(index).cells.item(0).focus();
            this.table.rows.item(index).cells.item(0).style.backgroundColor = "red";
            this.table.rows.item(index).cells.item(0).style.color = "blue";
            this.parent.focus();
        }catch(ex){}
    }
}
DropDownListx.prototype._selectByName=function(name)//不響應事件的副本
{
    if(name == null || name == "")
    {
        this.reset();
        return;
    }
    for(var i = 0;i<this.nodeList.length;i++)
    {
        var _name = this.attributed?this.nodeList.item(i).getAttribute(this.mainText):this.nodeList.item(i).selectSingleNode(this.mainText).text;
        if(_name == name) break;
    }
    if(i != this.nodeList.length)
    {
        this._select(i);
    }
    else
        this.reset();
}
DropDownListx.prototype._selectByValue=function(value)//不響應事件的副本
{
    if(value == null || value == "")
    {
        this.reset();
        return;
    }
    for(var i = 0;i<this.nodeList.length;i++)
    {
        var _value = this.attributed?this.nodeList.item(i).getAttribute(this.mainValue):this.nodeList.item(i).selectSingleNode(this.mainValue).text;
        if(_value == value) break;
    }
    if(i != this.nodeList.length)
    {
        this._select(i);
    }
    else
        this.reset();
}

//---------------------------------------------DropDownListx-vsdoc.js------------------------

/// <reference name="MicrosoftAjax.js"/>
function DropDownListx(parent, id)
{
    /// <summary>
    /// 自定义的下拉框类
    /// </summary>
    /// </param>
    /// <param name="parent" type="Objec">
    /// 下柆框的父控件,只能是文本输入框元素;
    /// </param>
    /// </param>
    /// <param name="id" type="String">
    /// 下拉框的ID的文本
    /// </param>
}
DropDownListx.prototype =
{
    getPosition: function()
    {
        /// <summary>
        /// 重新获取下拉框的位置,因为parent的位置可能会变动
        /// </summary>
    },
    show: function()
    {
        /// <summary>
        /// 显示下拉框
        /// </summary>
    },
    listData: function()
    {
        /// <summary>
        /// 绘制下拉框
        /// </summary>
    },
    hide: function()
    {
        /// <summary>
        /// 隐藏下拉框
        /// </summary>
    },
    setSource: function(d)
    {
        /// <summary>
        /// 设置下拉框xml数据源
        /// </summary>
        /// <param name="d" type="Objec">
        /// 要指定的下拉框的xml数据源
        /// </param>
    },
    setChildNodes: function(nodes)
    {
        /// <summary>
        /// 设置下拉框xml数据源
        /// </summary>
        /// <param name="nodes" type="Objec">
        /// 要指定的下拉框的xml节点集
        /// </param>
    },
    filter: function(text)
    {
        /// <summary>
        /// 对下拉框进行全局筛选
        /// </summary>
        /// <param name="text" type="String">
        /// 要查找的文枉
        /// </param>
    },
    getNodeValue: function(nodeName)
    {
        /// <summary>
        /// 返回选中节点对应的子节点的值
        /// </summary>
        /// <param name="nodeName" type="String">
        /// 子节点名
        /// </param>
    },
    reset: function()
    {
        /// <summary>
        /// 重置下拉框
        /// </summary>
    },
    select: function(index)
    {
        /// <summary>
        /// 按索引进行选择
        /// </summary>
        /// <param name="index" type="Int">
        /// 索引值
        /// </param>
    },
    selectByName:function(name)
    {
        /// <summary>
        /// 按文本进行选择
        /// </summary>
        /// <param name="name" type="String">
        /// 要选择的文本,此值将会与mainText属性所对应的节点进行对比
        /// </param>
    },
    selectByValue:function(value)
    {
        /// <summary>
        /// 按值进行选择
        /// </summary>
        /// <param name="value" type="String">
        /// 要选择的值,此值将会与mainValue属性所对应的节点进行对比
        /// </param>
    },
    _select:function(index)
    {
        /// <summary>
        /// 按索引进行选择,select方法不响应事件的副本
        /// </summary>
        /// <param name="index" type="Int">
        /// 索引值
        /// </param>
    },
    _selectByName:function(name)
    {
        /// <summary>
        /// 按文本进行选择,selectByName方法不响应事件的副本
        /// </summary>
        /// <param name="name" type="String">
        /// 要选择的文本,此值将会与mainText属性所对应的节点进行对比
        /// </param>
    },
    _selectByValue:function(value)
    {
        /// <summary>
        /// 按值进行选择,selectByValue方法不响应事件的副本
        /// </summary>
        /// <param name="value" type="String">
        /// 要选择的值,此值将会与mainValue属性所对应的节点进行对比
        /// </param>
    }   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值