【问题标题】:Submenu keep active when user click on it and open in a new page当用户单击子菜单并在新页面中打开时,子菜单保持活动状态
【发布时间】:2014-12-17 00:57:19
【问题描述】:

当访问者点击子菜单并在新页面中打开链接时遇到问题,因此我想在该页面上保持该子菜单处于活动状态。

我有激活的 css 类和用于打开它的 javascript,我需要使用 php 使其处于活动状态。 这是带有类的 UL:

这是我的代码。可以用php还是用javascript来完成。

<ul>
<?php 
$qKategori = ("SELECT * FROM kategori WHERE kprind = 0");
$rKategori = mysqli_query($dbc, $qKategori);
if ($rKategori) {

while ($exKat = mysqli_fetch_array($rKategori, MYSQLI_ASSOC)){ 
$emrikategorise = $exKat['kemri'];
$idkategori = $exKat['kid'];
$idprind = $exKat['kprind'];
?>  

<li><a href="#"><?=$emrikategorise;?></a>

<ul>
<?php 
$qPrind = ("SELECT * FROM kategori WHERE kprind = '".$idkategori."'");              
$rPrind = mysqli_query($dbc,$qPrind);

while($prind = mysqli_fetch_array($rPrind)) {                 
?>
<li><a href="kategori.php?kid=<?=$prind['kid']?>"><?=$prind['kemri']?></a>   </li>
<?php 
}
mysqli_free_result($rPrind);    
?>
</ul>

</li>

<?php                   }       
mysqli_free_result($rKategori); 
}   

?>
</ul>

您可以在网站的左侧看到菜单 www.sitimobil.mk

【问题讨论】:

    标签: javascript php css menu


    【解决方案1】:

    您可能需要在输出之前构建数组,以确定哪些菜单应该处于活动状态。您还可以将其与查询优化相结合,不必为每个类别执行 1 个查询。

    类似:

    $active = isset($_GET['kid'] ? $_GET['kid'] : -1;
    $tree = array();
    $list = array();
    $qKategori = ("SELECT * FROM kategori ORDER BY kprind");
    $rKategori = mysqli_query($dbc, $qKategori);
    if ($rKategori) {
       while ($exKat = mysqli_fetch_array($rKategori, MYSQLI_ASSOC)){ 
          $id = $exKat['kid'];
          //To prevent numerical array with unused space
          $name = 'kategori'.$exKat['kid']; 
          $list[$name] = $exKat;
    
          //Calculate depth to see if the menu is a sub..sub..sub menu etc.
          $parent = $list[$name]['kprind'];
          if($parent == 0) {
             $list[$name]['depth'] = 0;
             $list[$name]['childCount'] = 0;
          }
          else {
             $list['kategori'.$parent]['childCount']++;
             $list[$name]['depth'] = $list['kategori'.$parent]['depth']+1; //Increment
          }
    
          if($id == $active) {
             $list[$name]['active'] = true;
    
             while($parent != 0) {
                $parentName = 'kategori'.$parent;
                $list[$parentName]['active'] = true;
                $parent = $list[$parentName]['kprind'];
             }
          }
          else 
             $list[$name]['active'] = false;
       }  
       mysqli_free_result($rPrind); 
       //Once we have that we can output the results...
    
       function output_menu($list, $parent = 0, $active = false)
           $activeClass = $active ? ' class="active"' : '';
           echo '<ul'.$activeClass.'>';
           foreach($list as $row){
              if($row['kprind'] != $parent) continue;
              $link = $row['kprind'] == 0 ? '#' : 'kategori.php?kid='.$row['kid'];
              echo '<li><a href="'.$link.'">'.$row['kemri'].'</a>';
              if($row['childCount'] > 0) 
               output_menu($list, $row['kprind'], $row['active']);
              echo '</li>';
           }
           echo '</ul>';
       }
       output_menu($list);
    }
    

    这仍然有点粗糙,但应该可以解决问题。它可能可以进行优化,这样我们就不必多次遍历列表,但好处是不必请求对数据库进行太多调用。这应该会减轻数据库的工作量并加快输出速度。

    【讨论】:

    • 它不起作用,打开网站很慢。我认为最好使用 GET 并将 if-else 放入
        ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2015-10-06
    相关资源
    最近更新 更多