首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

jsp+ajax的二级联动无刷新菜单

2012-03-15 
求一个jsp+ajax的二级联动无刷新菜单类似这个http://www.10090.com/demo/hpmenu/hpmenu.html二级联动就可

求一个jsp+ajax的二级联动无刷新菜单
类似这个
http://www.10090.com/demo/hpmenu/hpmenu.html

二级联动就可以了

两个字段都是动态从数据库中读取

郁闷了好几天了,帮帮忙,谢谢!

[解决办法]
只要你搞清楚,父菜单与子菜单之间的联系(sql),实现起来并不难
你的菜单是放一个表中,还是父菜单放一个表,子菜单放另一个表?
[解决办法]
根据select的值,得到父id的值,使用ajax传递到服务器,返回它的下级,显示即可
[解决办法]

HTML code
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-type" content="text/html; charset=utf-8"><title>多级联动菜单</title><script type="text/javascript">var xmlHttp;        //用于保存XMLHttpRequest对象的全局变量var targetSelId;    //用于保存要更新选项的列表idvar selArray;       //用于保存级联菜单id的数组//用于创建XMLHttpRequest对象function createXmlHttp() {    //根据window.XMLHttpRequest对象是否存在使用不同的创建方式    if (window.XMLHttpRequest) {       xmlHttp = new XMLHttpRequest();                  //FireFox、Opera等浏览器支持的创建方式    } else {       xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式    }}//获取列表选项的调用函数function buildSelect(selectedId, targetId) {    if (selectedId == "") {                             //selectedId为空串表示选中了默认项        clearSubSel(targetId);                          //清除目标列表及下级列表中的选项        return;                                         //直接结束函数调用,不必向服务器请求信息    }    targetSelId = targetId;                             //将传入的目标列表id赋值给targetSelId变量    createXmlHttp();                                    //创建XmlHttpRequest对象    xmlHttp.onreadystatechange = buildSelectCallBack;   //设置回调函数    xmlHttp.open("GET", "select_menu.jsp?selectedId=" + selectedId, true);    xmlHttp.send(null);}//获取列表选项的回调函数function buildSelectCallBack() {    if (xmlHttp.readyState == 4) {        var optionsInfo = eval("("+xmlHttp.responseText+")");           //将从服务器获得的文本转为对象直接量        var targetSelNode = document.getElementById(targetSelId);        clearSubSel(targetSelId);                                    //清除目标列表中的选项        //遍历对象直接量中的成员        for (var o in optionsInfo) {            targetSelNode.appendChild(createOption(o, optionsInfo[o])); //在目标列表追加新的选项        }    }}//根据传入的value和text创建选项function createOption(value, text) {     var opt = document.createElement("option");                        //创建一个option节点     opt.setAttribute("value", value);                                  //设置value     opt.appendChild(document.createTextNode(text));                    //给节点加入文本信息     return opt;}//清除传入的列表节点内所有选项function clearOptions(selNode) {    selNode.length = 1;                                                 //设置列表长度为1,仅保留默认选项    selNode.options[0].selected = true;                                 //选中默认选项}//初始化列表数组(按等级)function initSelArray() {    selArray = arguments;                                               //arguments对象包含了传入的所有参数}//清除下级子列表选项function clearSubSel(targetId) {    var canClear = false;                                               //设置清除开关,初始值为假    for (var i=0; i<selArray.length; i++) {                             //遍历列表数组        if (selArray[i]==targetId) {                                    //当遍历至目标列表时,打开清除开关            canClear = true;        }        if (canClear) {                                                 //从目标列表开始到最下级列表结束,开关始终保持打开            clearOptions(document.getElementById(selArray[i]));         //清除该级列表选项        }    }}</script></head><!-- 页面加载完毕做两件事:1.初始化列表数组 2.为第一个列表赋值 --><body onload="initSelArray('selA','selB','selC');buildSelect('INIT', 'selA')"><h1>多级联动菜单</h1><table><tr>    <td>列表A</td>    <td>        <select name="selA" id="selA" onchange="buildSelect(this.value, 'selB')">            <option value="" selected>------请选择------</option>        </select>    </td></tr><tr>    <td>列表B</td>    <td>        <select name="selB" id="selB" onchange="buildSelect(this.value, 'selC')">            <option value="" selected>------请选择------</option>        </select>    </td></tr><tr>    <td>列表C</td>    <td>        <select name="selC" id="selC">            <option value="" selected>------请选择------</option>        </select>    </td></tr></table></body></html> 


[解决办法]
我这里有两个

第一个 http://blog.csdn.net/zenwong/archive/2007/10/30/1857605.aspx

第二个 http://blog.csdn.net/zenwong/archive/2007/10/30/1857513.aspx
[解决办法]
呵呵,可以参看下我的文章~~
http://j2ee.blog.sohu.com/68011726.html
[解决办法]
我有,加我的QQ21020540 我发文件给你.
[解决办法]
谈谈思路比较好。

这种东西一段时间来做的巨多。

如果你的菜单放在一个表内,那么请加一个标识,加一个parent字段,区分子菜单和父菜单。SQL方面你也更方便,select * from menu where parent =?

AJAX , 既然你是用这个东西,那相信用AJAX 的方式与后台沟通楼主是应该清楚的。

建一个Servlet,调用你的逻辑方法返回值(list),迭代list,插入到目标XML中,返回XML

用 xmlHttpRequest 对象返回XML , 解释XML 循环读出 Servlet 返回的 xml 子节点,逐一添加到子菜单的<Select> 的 中去 (<option>)。


[解决办法]
思路:大类select控件的onchange事件将自身的大类id传递给javascript函数,然后js函数利用ajax查询数据库得到该大类所属小类信息(我这里返回的是一段xml),并显示到另一个select控件中即可。实现起来比树形菜单要简单。

-------------页面代码片段----------------

HTML code
<tr>                <td>                    <b>节目类型</b>                </td>                <td>                    <select name="bigTypeSelect" onchange="getSmallType(this.value);">                        <option value="-1">                            未选择                        </option>                        <c:forEach items="${bigTypeList}" var="temp">                            <option value="${temp.typeId}">                                ${temp.typeName}                            </option>                        </c:forEach>                    </select>                    &nbsp;                    <select name="typeId">                        <option value="-1">                            未选择                        </option>                    </select>                </td></tr> 

热点排行