0

我需要使用 JavaScript 创建多级导航菜单。我已经创建了第一级菜单,但我需要创建第二级和第三级菜单,但不知何故,当我创建它们时,我没有得到想要的结果。

请找到我的以下工作场景。

阶段 01

我正在使用下面的 JavaScript 创建多级菜单。

JS:

if (typeof (XMLHttpRequest) != 'undefined') {
    var getXMLHttpObj = function() {
        return new XMLHttpRequest();
    };

} else {
    var getXMLHttpObj = function() {
        var activeXObjects = [ 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0',
                'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP',
                'Microsoft.XMLHTTP' ];

        for ( var i = 0; i < activeXObjects.length; i++) {
            try {
                return new ActiveXObject(activeXObjects[i]);
            } catch (err) {
            }
        }
    };
}

// Code for Identify page with page parameter
var pageName = getUrlVars()["layout_config"]; // read this parameter and store

var re = /_/g, str = pageName;
var a = 6;
var b = 0;
var c = 0;
var i = 0;
var strLength = str.length;

while ((match = re.exec(str)) != null) {
    if (i == 0) {
        a = match.index;

    } else {
        b = match.index;

    }
    c = a + 1;
    //alert("match found at " + match.index+"i"+ i);
    i++;

    if (i > 1) {
        break;
    }
}

var mainMenuCatName = pageName.substring(0, a);
var subMenuCatName = "";
if (b != 0) {
    subMenuCatName = pageName.substring(c, b);
} else {
    subMenuCatName = pageName.substring(c, strLength);
}

//alert(mainMenuCatName + ", " + subMenuCatName);
// in to pageName
var currentElement = "";
var lastElement = "";

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,
            function(m, key, value) {
                vars[key] = value;
            });
    return vars;
}
// alert(pageName);

// XML object
var newsSubscriptionsPage_id;
var selectedSubItem;
var subMenuId;

var ajxObj = getXMLHttpObj();

ajxObj.open('GET', 'xml/leftMenu.xml', false);
ajxObj.send(null);
var myXml = ajxObj.responseXML;
prs = myXml.getElementsByTagName("tab");

// load XML Base Top Menu
var totalMenuItems = prs.length;
var totalMenuWapper = document.getElementById("leftNav");
var ul = document.createElement("ul");
var totalLoadTab = 0;
if (totalMenuWapper != null) {
    totalMenuWapper.appendChild(ul);

    for (i = 0; i < totalMenuItems; i++) {

        var li = document.createElement("li");
        ul.appendChild(li);

        var tabName = prs[i].childNodes[0].nodeValue;
        var URL = prs[i].getAttribute("href");
        var targetURL = prs[i].getAttribute("target");
        var urlAlias = prs[i].getAttribute("name");
        var cosClass = prs[i].getAttribute("cssClass");
        var submenuWidth = prs[i].getAttribute("width");
        subTabSour = prs[i].getElementsByTagName("subTab");
        var totalSubmenuItems = subTabSour.length;
        tabName = newLine(tabName);
        //alert(tabName);   
        if (totalSubmenuItems > 0) {
            // alert(newsSubscriptionsPage_id);
            // newsSubscriptionsPage_id = 'menu_' + i;

            li.innerHTML = "<a id='menu_" + i + "' href='" + URL
                    + "' class='submenuItem' target='" + targetURL + "' >"
                    + tabName + "</a>";

            var tabBtnWidth = li.offsetWidth;

            var subUl = document.createElement("ul");
            li.appendChild(subUl);
            var subMenuWidth = subUl.offsetWidth;
            var subMenuLeftMarg = Math.round((subMenuWidth / 2)
                    - (tabBtnWidth / 2)) - 1;
            subUl.setAttribute("style", "margin-left:-1px; width:"
                    + submenuWidth + "px");
            subUl.style.marginLeft = "-1px";
            subUl.style.width = submenuWidth + "px";

            var lastTab = totalSubmenuItems - 1;

            for (a = 0; a < totalSubmenuItems; a++) {

                var subTabName = subTabSour[a].childNodes[0].nodeValue;
                var subURL = subTabSour[a].getAttribute("href");
                var targeSubtURL = subTabSour[a].getAttribute("target");
                var subUrlAlias = subTabSour[a].getAttribute("name");
                var subLi = document.createElement("li");
                subMenuId = "subMenu_" + i + "_" + a;
                subTabName = newLine(subTabName);
                subUl.appendChild(subLi);

                if (lastTab == a) {
                    //alert("last_mach");
                    subLi.innerHTML = "<a href='"
                            + subURL
                            + "' id='"
                            + subMenuId
                            + "'target='"
                            + targeSubtURL
                            + "'style='width:"
                            + submenuWidth + "px;' >" + subTabName + "</a>";
                    //alert(urlAlias+" = "+mainMenuCatName+", "+subUrlAlias+"=="+subMenuCatName);
                    if (urlAlias == mainMenuCatName
                            && subUrlAlias == subMenuCatName) {
                        //alert("last_mach"+subMenuId);
                        currItem(subMenuId, "selected");

                    }
                } else {

                    subLi.innerHTML = "<a href='" + subURL + "' id='"
                            + subMenuId + "'target='" + targeSubtURL
                            + "' style='width:" + submenuWidth + "px'>"
                            + subTabName + "</a>";
                    if (urlAlias == mainMenuCatName
                            && subUrlAlias == subMenuCatName) {
                        currItem(subMenuId, "selected");


                    }
                }

            }// end for loop

            if (urlAlias == mainMenuCatName) {
                newsSubscriptionsPage_id = 'menu_' + i;
                currItem(newsSubscriptionsPage_id, "subSelected");

            }

        } else {

            if (cosClass != null) {

                li.innerHTML = "<a id='menu_" + i + "' name='" + urlAlias
                        + "' href='" + URL + "' target='" + targetURL
                        + "' class='" + cosClass + "'>" + tabName + "</a>";
            } else {

                li.innerHTML = "<a id='menu_" + i + "' name='" + urlAlias
                        + "' href='" + URL + "' target='" + targetURL + "'>"
                        + tabName + "</a>";
            }

            if (urlAlias == mainMenuCatName) {
                newsSubscriptionsPage_id = 'menu_' + i;
                currItem(newsSubscriptionsPage_id, "selected");


            }

        }
        totalLoadTab = i + 1;

    }// end for loop

}

// First load all menu item than call selectedItem function
if (totalLoadTab == totalMenuItems) {

    //selectedItem();

}

function currItem(id, className) {

    currentElement = document.getElementById(id);
    currentElement.setAttribute("className", className); // className
    // use //
    // for ie7
    currentElement.setAttribute("class", className); // this worked
    // all

}

// this code for line Brake 

function newLine(input_Text) {
    var tabText = input_Text;
    var tabTextLength = tabText.length;
    var lineBrakeText = /@newLine/g;
    var lineBrakeTextLength = 8;
    var text = "";
    var startPosion = 0;
    //alert(tabTextLength);
    while ((newLineBrake = lineBrakeText.exec(tabText)) != null) {

        brakePosition = newLineBrake.index;
        text_i = tabText.substring(startPosion, brakePosition) + "<br />";
        //alert(startPosion);
        startPosion = brakePosition + lineBrakeTextLength;
        //alert(text + text_i);
        text = text + text_i;
    }
    text = text + tabText.substring(startPosion, tabTextLength);
    //tabName = text;
    //output_Text = text;

    return text;

}

阶段 02

我将 JavaScript 声明放在下面的 XML 文件中,如下所示。

XML:

<topMenu>
    <tab href="#" target="_self" name="abc">abc</tab>
    <tab href="#" target="_self" width="200" name="def">def
        <subTab href="#" target="_self" name="def1">def1</subTab>
        <subTab href="#" target="_self" name="def2">def2</subTab>
        <subTab href="#" target="_self" name="def3">def3</subTab>
        <subTab href="#" target="_self" name="def4">def4</subTab>
        <subTab href="#" target="_self" name="def5">def5</subTab>
  </tab>
</topMenu>

阶段 03

最后,在 HTML 中,我得到了这个渲染输出。

渲染输出:

<ul>
<li><a target="_self" href="#" name="abc" id="menu_0">abc</a></li>
<li><a target="_self" class="submenuItem" href="#" id="menu_1">def</a>
  <ul style="margin-left:-1px; width:200px">
    <li><a style="width:200px" target="_self" id="subMenu_1_0" href="#">def1</a></li>
    <li><a style="width:200px" target="_self" id="subMenu_1_1" href="#">def2</a></li>
    <li><a style="width:200px" target="_self" id="subMenu_1_2" href="#">def3</a></li>
    <li><a style="width:200px" target="_self" id="subMenu_1_3" href="#">def4</a></li>
    <li><a style="width:200px" target="_self" id="subMenu_1_4" href="#">def5</a></li>
  </ul>
</li>
</ul>

我需要的

我需要以一种能够创建多级菜单的方式对 JavaScript 进行更改。

例如,我的 XML 应该如下所示。

<topMenu>
    <tab href="#" target="_self" name="abc">abc</tab>
    <tab href="#" target="_self" width="200" name="def">def
        <subTab href="#" target="_self" name="def1">def1</subTab>
        <subTab href="#" target="_self" name="def2">def2
             <topMenu-level02>
                <tab href="#" target="_self" name="abc">abc</tab>
                  <subTab-level02 href="#" target="_self" name="def21">def21</subTab-level02>
                  <subTab-level02 href="#" target="_self" name="def22">def22</subTab-level02>
                </tab>
             </topMenu-level02>
        </subTab>
        <subTab href="#" target="_self" name="def3">def3</subTab>
        <subTab href="#" target="_self" name="def4">def4</subTab>
        <subTab href="#" target="_self" name="def5">def5</subTab>
  </tab>
</topMenu>

我渲染的输出应该如下所示。

<ul>
<li><a target="_self" href="#" name="abc" id="menu_0">abc</a></li>
<li><a target="_self" class="submenuItem" href="#" id="menu_1">def</a>
  <ul style="margin-left:-1px; width:200px">
    <li><a style="width:200px" target="_self" id="subMenu_1_0" href="#">def1</a></li>
    <li><a style="width:200px" target="_self" id="subMenu_1_1" href="#">def2</a>
     <ul>
        <li><a style="width:200px" target="_self" id="" href="#">def21</a></li>
        <li><a style="width:200px" target="_self" id="" href="#">def22</a></li>
     </ul>        
    </li>
    <li><a style="width:200px" target="_self" id="subMenu_1_2" href="#">def3</a></li>
    <li><a style="width:200px" target="_self" id="subMenu_1_3" href="#">def4</a></li>
    <li><a style="width:200px" target="_self" id="subMenu_1_4" href="#">def5</a></li>
  </ul>
</li>
</ul>

等待解决方案。

4

0 回答 0