【问题标题】:HTML Menu, php, highlight first item of its submenu itemHTML Menu,php,突出显示其子菜单项的第一项
【发布时间】:2013-02-23 09:55:48
【问题描述】:

我正在寻找自动突出显示顶部菜单项的解决方案。

目前的情况是这样的: 我将默认菜单存储在 .txt 文件中:

<li><a href="index.php">HOME</a></li>
<li><a href="#">MENU_1</a>
  <ul>
    <li><a href="submenu_1.php">Submenu_1</a></li>
    <li><a href="submenu_2.php">Submenu_2</a></li>
  </ul>
</li>
<li><a href="#">MENU_2</a>
  <ul>
    <li><a href="#">Submenu_1</a>
      <ul>
        <li><a href="sub_submenu_1.php">Sub_Submenu_1</a></li>
        <li><a href="sub_submenu_2.php">Sub_Submenu_2</a></li>
      </ul>
    </li>
    <li><a href="#">Submenu_2</a></li>
  </ul>
</li>
<li><a href="menu_3.php">MENU_3</a></li>
<li><a href="menu_4.php">MENU_4</a></li>

所以,当 submenusub_submenu 或任何项目是当前页面时,我需要突出显示其最顶部的 MENU_X 父项目(因为只有 MENU_X 项目在我的页面上可见顶栏)。

我将 CSS 样式应用于MENU_X,所以当我设置顶部菜单时:

<li class="current"><a href="#">MENU_1</a>

它以.current CSS 样式突出显示。

现在我正在寻找一个 PHP 脚本,它会做这样的事情(仅作为示例):

<?php
$currentPage = $_SERVER["PHP_SELF"];
$url_parts = Explode('/', $currentPage);
$current_php_file = $url_parts[count($url_parts) - 1];

$raw_menu = file_get_contents("menu.txt");

$current_menu_item = '<li><a href="' . $current_php_file . '">'

$top_menuitem_of_current_page = someFunctionToFindOut(); //need some script to find out

$highlighted_menu_item = '<li class="current"><a href="' . $top_menuitem_of_current_page . '">';
$ready_menu = str_replace($top_menuitem_of_current_page, $highlighted_menu_item, $raw_menu);
echo $ready_menu;
?>

上面的代码基本上可以解决问题,但是我需要调用一些函数someFunctionToFindOut() 来找出$top_menuitem_of_current_page 是什么。

有什么建议吗?

【问题讨论】:

  • 没有。这似乎突出了当前页面。我需要突出显示包含当前页面的第一个菜单。不是当前页面或其父页面。

标签: php html arrays function menu


【解决方案1】:

由于没有人提供可行的解决方案,我想回答我的问题:

include("menu.php");

$current_page = basename($_SERVER['PHP_SELF']);

$menu = "";

function menu_to_array($array, $found) {
    foreach($array as $key => $element){
        if(!is_array($element)){
            if($element == $current_page && !$found){
                $found = true;
                $menu .= "<li class='current'><a href='$element'>$key</a></li>";
            }else{
                $menu .= "<li><a href='$element'>$key</a></li>";
            }
        }else{ 
            if(found_current_page_in($element) && !$found){
                $menu .= "<li class='current'><a href='#'>$key</a><ul>" . menu_to_array($element, true) . "</ul></li>";
            }else{
                $menu .= "<li><a href='#'>$key</a><ul>" . menu_to_array($element, false) . "</ul></li>";
            }
        }
    }
    return $menu; 
}

function found_current_page_in($elem){
    foreach($elem as $key => $element){
        if(!is_array($element)){
            if($element == $current_page){
                return true;
            }
        }else{
            if(found_current_page_in($element)){
                return true;
            }
        }
    }
    return false;
}

$highlighted_menu = menu_to_array($menu_array, false);

还有 menu.php 文件(一个 php 数组,而不是存储在 .txt 文件中的平面文本):

<?PHP

$menu_array = Array(
            'Main Page 1' => "page_1.php",
            'Main Page 2' => Array("Sub Page 1" => "sub_page_1.php", "Sub Page 2" => "sub_page_2.php"),
            'Main Page 3' => Array('Sub Page 1' => Array("Sub Sub Page 1" => "sub_sub_page_1.php", "Sub Sub Page 2" => "sub_sub_page_2.php"), 'Sub Page 2' => "#"),
            'Main Page 4' => "page_4.php"
        );

?>

这很好用。它基本上是在互联网上找到的代码聚合的结果。

【讨论】:

    【解决方案2】:

    您可以改用 jQuery。所以,也许这段代码 sn-p 可以帮助你解决你的问题:

    $(document).ready(function(){
    
        var pathname = window.location.pathname;
        var filename = pathname.substr(pathname.lastIndexOf("/") + 1);
    
        if( ! filename)
        {
            filename = "index.php";
        }
    
        $("ul.navigation > li > a").each(function(){
    
            if($(this).attr("href") == filename || $(this).next("ul").find("a[href='"+filename+"']").length > 0)
            {
                $(this).addClass("current");
            }
    
        });
    
    });
    

    【讨论】:

    • 试过了,但对我不起作用。当然,我已将“yourMenuClass”替换为“navigation”,这是我的菜单的类名......谢谢。
    • 真正的子菜单链接看起来如何?是否只有 PHP 文件或 GET 参数,或其他任何东西?
    • 仅 php 文件,例如“index.php”、“page1.php”、“sub_page1.php”... 但是,上面的代码会突出显示包含当前页面的第一个菜单项?或者只是当前页面或其父页面?我需要它来突出显示第一个菜单项,即使当前页面在菜单中很深。谢谢。
    • 我已经更新了我的代码 - 看看吧!现在它只突出显示一级菜单链接!我测试了脚本,它对我有用!
    • 无论我多么努力,我都无法让它工作:(。你的代码中的ul.navigation到底是什么?我的菜单以:&lt;div id="menu" &gt; &lt;ul id="navigation"&gt; &lt;li&gt; &lt;a href="index.php"&gt;Home&lt;/a&gt; ...等等开头。 ..
    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多