最优雅的不刷新下拉联动解决方案--数据库版--xml版

一个有两个select ,要求第一个select 改变后,第二个select的option也都相应地变化。

先看看这段代码:

function getSecondTrades(id){
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
var uri = "/u2publishAdvertise.do?method=getSecondTrades&id="+id;
xmlhttp.Open("POST", uri, false);
xmlhttp.Send();
document.all.secondTrades.innerHTML=xmlhttp.responseText;

}

首先,第一个select onchage时间调用该方法。

第一,这个js方法会执行一个url对应的Action 。

第二,这个Action得到一个对应的List作为新下拉框内容,并mapping到一个新页面。

第三,这个新页面就显示被联动的<select>,这个页面的整个内容被当前的<div>当作内容显示在当前页面。

如此,无刷新地解决了联动问题。

总结:

  这种情况适合下拉框内容为数据库表。下拉框内容是xml,那么就不能使用了。记得有个人写过这样的

东西,也是用xmlhttp实现的。网址忘了,代码如下:

<script>
var m_oXMLDoc = new ActiveXObject("Microsoft.XMLDOM");
var m_sXmlSrc = "MaterialClass.xml";
//-----------------------------------------------
// LoadXML(strXMLSrc)
//-----------------------------------------------

function BindSelect( strXMLSrc , objSelectName)
{
    m_oXMLDoc.async = true; 
    m_oXMLDoc.onreadystatechange = Function( "fnLoadComplete('" + objSelectName + "');" );   
    m_oXMLDoc.load( strXMLSrc );
}

function fnLoadComplete(objSelectName)
{
 var objSelect = document.all[objSelectName];
 var aryXMLNodes;
 var node;
 if (objSelect == null)
  return;
    try
    {
        var iReadyState = m_oXMLDoc.readyState;
    }
    catch(e)
    {
        return;
    }
   
    if(  iReadyState != 4 ) return;
   
    if( m_oXMLDoc != null && m_oXMLDoc.xml != "" )
    {
  objSelect.length = 0;
  aryXMLNodes = m_oXMLDoc.documentElement.selectNodes("MaterialClass");
  for (var i=0; i < aryXMLNodes.length; i++)
  {
   node = aryXMLNodes[i];
   objSelect.options[i] = new Option(node.getAttribute("Description"),node.getAttribute("MaterialClassCode"));
  }
  
  if(objSelect.ChildSelectName != null)
  {
   objSelect.onchange = Function( "BindSelect('MaterialClass'+this.options[this.selectedIndex].value+'.xml', '"+objSelect.ChildSelectName+"');" );   
   objSelect.fireEvent("onchange");
   
  }
 }
}

function Init()
{
 try{
  BindSelect( m_sXmlSrc, "MaterialClass1");
 }
 catch(e)
 {
  setTimeout("Init()",1000)
 }
}


</script>

<body οnlοad="Init()">
<p>多级联动下拉选择框,动态获取下一级,每一级数据为XML,可支持无限级(浏览器端需要Microsoft.XMLDOM支持)</p>
<select name="MaterialClass1" ChildSelectName="MaterialClass2"></select>
<select name="MaterialClass2" ChildSelectName="MaterialClass3"></select>
<select name="MaterialClass3"></select>

<p>HTML代码如下:
<pre>
&lt;select name="MaterialClass1" ChildSelectName="MaterialClass2"&gt;&lt;/select&gt;
&lt;select name="MaterialClass2" ChildSelectName="MaterialClass3"&gt;&lt;/select&gt;
&lt;select name="MaterialClass3"&gt;&lt;/select&gt;
</pre>
其中ChildSelectName表示下一级Select的name</p>
<p>其中的一个xml如下:
<pre>
&lt;MaterialClasses&gt;
 &lt;MaterialClass MaterialClassCode="01" Description="黑色及有色金属"/&gt;
 &lt;MaterialClass MaterialClassCode="02" Description="水泥、砂石砖瓦、砼"/&gt;
 &lt;MaterialClass MaterialClassCode="03" Description="木、竹材及其制品"/&gt;
&lt;/MaterialClasses&gt;
</pre>
</p>

</body>

=========================

MaterialClasses.xml

<?xml version="1.0" encoding="GB2312"?>
 <MaterialClasses>
  <MaterialClass MaterialClassCode="01" Description="黑色及有色金属"/>
  <MaterialClass MaterialClassCode="02" Description="水泥、砂石砖瓦、砼"/>
  <MaterialClass MaterialClassCode="03" Description="木、竹材及其制品"/>
 </MaterialClasses>

===========================

MaterialClass01.xml

<?xml version="1.0" encoding="GB2312"?>
 <MaterialClasses>
  <MaterialClass MaterialClassCode="0101" Description="圆钢"/>
  <MaterialClass MaterialClassCode="0102" Description="钢筋、盘条"/>
  <MaterialClass MaterialClassCode="0103" Description="钢丝、钢棒"/>
 </MaterialClasses>

这样能解决xml数据为基础的。

如果连xml都没有使用,数据又不多,那么写js,增加几个case.设置select的options.
代码略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值