我有一个常见的侧面导航栏,我已经将几页链接到它。我已经将其包含在所有页面上,使用以下PHP包含语句。
<?php include '../php/playersidenav.php';?>
.
Sidenavigation如下。
<div class="column sidenav">
<div class="row">
<img src="../images/avatar.png" alt="Avatar">
<h1 style="color:white;float:right;padding-top:7%">Hello John!</h1>
</div>
<a class="normal" href="news.php" onclick="makeActive(event)">NEWS</a>
<a class="normal" href="schedule.php" onclick="makeActive(event)">SCHEDULE</a>
<a class="normal" href="partners.php" onclick="makeActive(event)">PARTNERS</a>
<a class="normal" href="coaches.php" onclick="makeActive(event)">COACHES</a>
<a class="normal" href="tournaments.php" onclick="makeActive(event)">TOURNAMENTS</a>
<a class="normal" href="events.php" onclick="makeActive(event)">EVENTS</a>
<a class="normal" href="shops.php" onclick="makeActive(event)">SHOPS</a>
</div>
此代码工作正常,除非它不会使链接类活动。我曾经追随javascript函数以使链接处于活动状态。但它不起作用。
function makeActive(evt) {
var i, normal;
normal = document.getElementsByClassName("normal");
for (i = 0; i < normal.length; i++) {
normal[i].className = normal[i].className.replace(" active", "");
}
evt.currentTarget.className += " active";
}
这是CSS代码我在激活时常用的链接样式。
.sidenav a.active {
background-color: #001F5A;
color: white;
border-radius: 5px;
}
我一直试图找到我的代码有什么问题,但我似乎无法找到我在这里缺少的东西。请帮忙!谢谢!
分析解答
您可以做的一种方式是利用浏览器的localStorage
- 如果通过删除如下如下inline事件处理程序稍微修改上述playersidenav.php
,然后在此文件中包含一些JavaScript,因此它如下所示:
<div class="column sidenav">
<div class="row">
<img src="../images/avatar.png" alt="Avatar">
<h1 style="color:white;float:right;padding-top:7%">Hello John!</h1>
</div>
<a class="normal" href="news.php">NEWS</a>
<a class="normal" href="schedule.php">SCHEDULE</a>
<a class="normal" href="partners.php">PARTNERS</a>
<a class="normal" href="coaches.php">COACHES</a>
<a class="normal" href="tournaments.php">TOURNAMENTS</a>
<a class="normal" href="events.php">EVENTS</a>
<a class="normal" href="shops.php">SHOPS</a>
</div>
<script>
//The name of the store in localStorage
const store='LINK_ACTIVATED_MEMORY';
// the class to add to indicate active state
const cn='active';
// nodelist of all sidenav links
const links=document.querySelectorAll('.sidenav > a.normal');
// ensure any "active" links have class removed and then
// save new hyperlink to localStorage
const makeActive=(e)=>{
e.preventDefault();
links.forEach(a=>a.classList.remove(cn));
localStorage.setItem( store, e.target.href );
location.href=e.target.href;
};
// on page load run this function - check the store
// and iterate through nodelist to match saved value and
// node value.
const loadActive=()=>{
let stored=localStorage.getItem( store );
if( stored==null )return;
Array.from( links ).some(a=>{
if( stored==a.href ){
a.classList.add(cn)
return true;
}
});
};
//bind the event handler
links.forEach(a=>a.addEventListener('click',makeActive));
// load active link class
loadActive();
</script>
被单击的链接将存储在localStorage
中,然后加载新页面时,将调用loadActive
函数以设置active
类。根据@kiko软件的评论 - 单击超链接时的默认操作将屏蔽任何突出显示尝试,以便在第load/reload页面上完成类的实际设置。
在思考@Kiko软件的建议之后,这可以通过PHP完成,并将其分配到JavaScript,我将其写为作为替代解决方案。
包含的文件playersidenav.php
:
<?php
$cn='active';
$links=array(
'home.php' => 'TEST PAGE HOME',
'news.php' => 'NEWS',
'schedule.php' => 'SCHEDULE',
'partners.php' => 'PARTNERS',
'coaches.php' => 'COACHES',
'tournaments.php' => 'TOURNAMENTS',
'events.php' => 'EVENTS',
'shops.php' => 'SHOPS'
);
?>
<div class="column sidenav">
<div class="row">
<img src="../images/avatar.png" alt="Avatar" />
<h1 style="color:white; float:right; padding-top:7%">Hello John!</h1>
</div>
<?php
foreach( $links as $href => $text ){
printf(
'<a href="%s" class="normal %s">%s</a>',
$href,
( basename( $_SERVER['SCRIPT_FILENAME'] )==$href ? $cn : '' ),
$text
);
}
?>
</div>
和一个示例页面调用所述文件,称为home.php
:
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8' />
<title></title>
<style>
.sidenav a.active {
background-color: #001F5A;
color: white;
border-radius: 5px;
}
a{margin:1rem;}
</style>
</head>
<body>
<?php
require sprintf('%s/playersidenav.php',__DIR__);
?>
<h1>Hello World!</h1>
</body>
</html>
PHP包含文件将数组键与当前SCRIPT_FILENAME
服务器变量进行比较,并相应地添加类并完全否定对JavaScript的需求。刚刚证明旧的谚语 - "There's more than one way to skin a cat"