PHP+JS無限級可伸縮菜單詳解(簡單易懂)
更新時間:2007年01月02日 00:00:00 作者:
發(fā)了幾天基礎的東西,今天來點稍微難的,一般在CMS系統(tǒng)后臺中都要用到的類別管理部分的精華--無限級分類菜單,對于新手來說,這個可能有一定難度,但是今天聽完我細細道來,相信以后大家就都會弄這東東了。怎么實現(xiàn)呢?大家先做個數(shù)據(jù)庫出來先:
--
-- 表的結(jié)構(gòu) `cr_columninfo`
--
這些是測試數(shù)據(jù),基本原理就是按照樹型結(jié)構(gòu)建立數(shù)據(jù)字段,核心就是欄目都有本身的ID號和父欄目的ID號,依靠這兩個關(guān)系,建立樹型結(jié)構(gòu),頂級欄目父ID=0,這個都好理解,現(xiàn)在來敘述下程序執(zhí)行原理,本程序采用最為普遍的遞歸算法來遍歷子菜單,首先,先查詢出所有頂級菜單,顯示在一個大表格里,沒一行顯示一個頂級菜單,再通過遞歸列出所有子菜單,子菜單處在上級菜單的所在行的下一行,且行的顯示屬性為不顯示,通過程序動態(tài)生成的行ID號,結(jié)合JS控制行的顯示與隱藏,也就是類似于微軟菜單的可伸縮效果,文章最后有張圖有助于大家理解,這是把生成頁面的HTML復制進DW來只管演示程序的最終結(jié)果。
來看代碼部分,并沒有難懂的語法,請大家借助注釋自己閱讀,有興趣可擴展此代碼。
PHP代碼如下:
最后貼上效果圖和源代碼打包,希望本文對大家有所幫助^_^
下載此文件
--
-- 表的結(jié)構(gòu) `cr_columninfo`
--
復制代碼 代碼如下:
CREATE TABLE `cr_columninfo` (
`columnid` int(4) NOT NULL auto_increment,
`columnfatherid` int(4) NOT NULL default '0',
`columnname` varchar(100) NOT NULL default '',
`columnadder` varchar(50) NOT NULL default '',
`columninputdate` date NOT NULL default '0000-00-00',
PRIMARY KEY (`columnid`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;
-- 導出表中的數(shù)據(jù) `cr_columninfo`
--
INSERT INTO `cr_columninfo` (`columnid`, `columnfatherid`, `columnname`, `columnadder`, `columninputdate`) VALUES (1, 0, '影音明星', 'leehui', '2006-09-28'),
(2, 0, '校園風情', 'leehui1983', '2006-09-28'),
(3, 1, '港臺明星', 'leehui', '2006-09-28'),
(4, 0, '風景圖片', 'leehui1983', '2006-09-29'),
(5, 4, '浩瀚大海', 'leehui1983', '2006-09-29'),
(6, 5, '福州的海', 'leehui1983', '2006-09-29'),
(7, 2, '畢業(yè)圖片', 'leehui', '2006-09-29'),
(9, 0, '體育明星', 'leehui1983', '2006-10-02'),
(10, 0, '精美壁紙', 'leehui1983', '2006-10-02'),
(11, 0, '城市風光', 'leehui1983', '2006-10-02'),
(12, 0, '卡通動漫', 'leehui1983', '2006-10-02'),
(13, 0, '游戲截圖', 'leehui1983', '2006-10-02'),
(14, 0, '作者相冊', 'leehui1983', '2006-10-02');
`columnid` int(4) NOT NULL auto_increment,
`columnfatherid` int(4) NOT NULL default '0',
`columnname` varchar(100) NOT NULL default '',
`columnadder` varchar(50) NOT NULL default '',
`columninputdate` date NOT NULL default '0000-00-00',
PRIMARY KEY (`columnid`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;
-- 導出表中的數(shù)據(jù) `cr_columninfo`
--
INSERT INTO `cr_columninfo` (`columnid`, `columnfatherid`, `columnname`, `columnadder`, `columninputdate`) VALUES (1, 0, '影音明星', 'leehui', '2006-09-28'),
(2, 0, '校園風情', 'leehui1983', '2006-09-28'),
(3, 1, '港臺明星', 'leehui', '2006-09-28'),
(4, 0, '風景圖片', 'leehui1983', '2006-09-29'),
(5, 4, '浩瀚大海', 'leehui1983', '2006-09-29'),
(6, 5, '福州的海', 'leehui1983', '2006-09-29'),
(7, 2, '畢業(yè)圖片', 'leehui', '2006-09-29'),
(9, 0, '體育明星', 'leehui1983', '2006-10-02'),
(10, 0, '精美壁紙', 'leehui1983', '2006-10-02'),
(11, 0, '城市風光', 'leehui1983', '2006-10-02'),
(12, 0, '卡通動漫', 'leehui1983', '2006-10-02'),
(13, 0, '游戲截圖', 'leehui1983', '2006-10-02'),
(14, 0, '作者相冊', 'leehui1983', '2006-10-02');
這些是測試數(shù)據(jù),基本原理就是按照樹型結(jié)構(gòu)建立數(shù)據(jù)字段,核心就是欄目都有本身的ID號和父欄目的ID號,依靠這兩個關(guān)系,建立樹型結(jié)構(gòu),頂級欄目父ID=0,這個都好理解,現(xiàn)在來敘述下程序執(zhí)行原理,本程序采用最為普遍的遞歸算法來遍歷子菜單,首先,先查詢出所有頂級菜單,顯示在一個大表格里,沒一行顯示一個頂級菜單,再通過遞歸列出所有子菜單,子菜單處在上級菜單的所在行的下一行,且行的顯示屬性為不顯示,通過程序動態(tài)生成的行ID號,結(jié)合JS控制行的顯示與隱藏,也就是類似于微軟菜單的可伸縮效果,文章最后有張圖有助于大家理解,這是把生成頁面的HTML復制進DW來只管演示程序的最終結(jié)果。
來看代碼部分,并沒有難懂的語法,請大家借助注釋自己閱讀,有興趣可擴展此代碼。
PHP代碼如下:
復制代碼 代碼如下:
<html>
<head>
<meta http-equiv="Content-Type" c />
<title>類別目錄樹</title>
<script type="text/javascript">
function ShowMenu(MenuID)
{
if(MenuID.style.display=="none"){
MenuID.style.display="";
}
else{
MenuID.style.display="none";
}
}
</script>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body topmargin="0" bgcolor="#EFEFE7">
<table width="100%" height="25" border="0" cellpadding="0" cellspacing="0" bgcolor="#739E18">
<tr>
<td align="left"> <strong>欄目樹形結(jié)構(gòu)列表</strong></td>
</tr>
</table>
<?php
//基本變量設置
$GLOBALS["ID"] =1; //用來跟蹤下拉菜單的ID號
$layer=1; //用來跟蹤當前菜單的級數(shù)
//連接數(shù)據(jù)庫
$Con=mysql_connect("localhost","root","7529639");
mysql_select_db("cr_download");
mysql_query("SET NAMES 'GBK'");
//提取一級菜單
$sql="select * from cr_columninfo where columnfatherid=0";
$result=mysql_query($sql,$Con);
//如果一級菜單存在則開始菜單的顯示
if(mysql_num_rows($result)>0) ShowTreeMenu($Con,$result,$ID);
//=============================================
//顯示樹型菜單函數(shù) ShowTreeMenu($con,$result,$layer)
//$con:數(shù)據(jù)庫連接
//$result:需要顯示的菜單記錄集
//$layer:需要顯示的菜單的級數(shù)
//=============================================
function ShowTreeMenu($Con,$result,$layer)
{
//取得需要顯示的菜單的項目數(shù)
$numrows=mysql_num_rows($result);
//開始顯示菜單,每個子菜單都用一個表格來表示
echo "<table cellpadding='0' cellspacing='0' border='0' width='100%'>";
for($rows=0;$rows<$numrows;$rows++)
{
//將當前菜單項目的內(nèi)容導入數(shù)組
$menu=mysql_fetch_array($result);
//提取菜單項目的子菜單記錄集
$sql="select * from cr_columninfo where columnfatherid=$menu[columnid]";
$result_sub=mysql_query($sql,$Con);
echo "<tr>";
//如果該菜單項目有子菜單,則添加JavaScript onClick語句
if(mysql_num_rows($result_sub)>0)
{
echo "<td width='20'><img src='./images/plus.png' border='0' > </td>";
echo "<td class='Menu' >";
}
else{
echo "<td width='20'><img src='./images/page.png' border='0'> </td>";
echo "<td class='Menu'>";
}
//如果該菜單項目沒有子菜單,只顯示菜單名稱
echo $menu[columnname];
echo "</td></tr>";
//如果該菜單項目有子菜單,則顯示子菜單
if(mysql_num_rows($result_sub)>0)
{
//指定該子菜單的ID和style,以便和onClick語句相對應
echo "<tr id=Menu".$GLOBALS["ID"]++." style='display:none'>";
echo "<td width='20'> </td>";
echo "<td>";
//將級數(shù)加1
$layer++;
//遞歸調(diào)用ShowTreeMenu()函數(shù),生成子菜單
ShowTreeMenu($Con,$result_sub,$layer);
//子菜單處理完成,返回到遞歸的上一層
echo "</td></tr>";
}
//子菜單處理完成,返回到遞歸的上一層,將級數(shù)減1
$layer--;
}
echo "</table>";
}
?>
</body>
</html>
<head>
<meta http-equiv="Content-Type" c />
<title>類別目錄樹</title>
<script type="text/javascript">
function ShowMenu(MenuID)
{
if(MenuID.style.display=="none"){
MenuID.style.display="";
}
else{
MenuID.style.display="none";
}
}
</script>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body topmargin="0" bgcolor="#EFEFE7">
<table width="100%" height="25" border="0" cellpadding="0" cellspacing="0" bgcolor="#739E18">
<tr>
<td align="left"> <strong>欄目樹形結(jié)構(gòu)列表</strong></td>
</tr>
</table>
<?php
//基本變量設置
$GLOBALS["ID"] =1; //用來跟蹤下拉菜單的ID號
$layer=1; //用來跟蹤當前菜單的級數(shù)
//連接數(shù)據(jù)庫
$Con=mysql_connect("localhost","root","7529639");
mysql_select_db("cr_download");
mysql_query("SET NAMES 'GBK'");
//提取一級菜單
$sql="select * from cr_columninfo where columnfatherid=0";
$result=mysql_query($sql,$Con);
//如果一級菜單存在則開始菜單的顯示
if(mysql_num_rows($result)>0) ShowTreeMenu($Con,$result,$ID);
//=============================================
//顯示樹型菜單函數(shù) ShowTreeMenu($con,$result,$layer)
//$con:數(shù)據(jù)庫連接
//$result:需要顯示的菜單記錄集
//$layer:需要顯示的菜單的級數(shù)
//=============================================
function ShowTreeMenu($Con,$result,$layer)
{
//取得需要顯示的菜單的項目數(shù)
$numrows=mysql_num_rows($result);
//開始顯示菜單,每個子菜單都用一個表格來表示
echo "<table cellpadding='0' cellspacing='0' border='0' width='100%'>";
for($rows=0;$rows<$numrows;$rows++)
{
//將當前菜單項目的內(nèi)容導入數(shù)組
$menu=mysql_fetch_array($result);
//提取菜單項目的子菜單記錄集
$sql="select * from cr_columninfo where columnfatherid=$menu[columnid]";
$result_sub=mysql_query($sql,$Con);
echo "<tr>";
//如果該菜單項目有子菜單,則添加JavaScript onClick語句
if(mysql_num_rows($result_sub)>0)
{
echo "<td width='20'><img src='./images/plus.png' border='0' > </td>";
echo "<td class='Menu' >";
}
else{
echo "<td width='20'><img src='./images/page.png' border='0'> </td>";
echo "<td class='Menu'>";
}
//如果該菜單項目沒有子菜單,只顯示菜單名稱
echo $menu[columnname];
echo "</td></tr>";
//如果該菜單項目有子菜單,則顯示子菜單
if(mysql_num_rows($result_sub)>0)
{
//指定該子菜單的ID和style,以便和onClick語句相對應
echo "<tr id=Menu".$GLOBALS["ID"]++." style='display:none'>";
echo "<td width='20'> </td>";
echo "<td>";
//將級數(shù)加1
$layer++;
//遞歸調(diào)用ShowTreeMenu()函數(shù),生成子菜單
ShowTreeMenu($Con,$result_sub,$layer);
//子菜單處理完成,返回到遞歸的上一層
echo "</td></tr>";
}
//子菜單處理完成,返回到遞歸的上一層,將級數(shù)減1
$layer--;
}
echo "</table>";
}
?>
</body>
</html>
最后貼上效果圖和源代碼打包,希望本文對大家有所幫助^_^

您可能感興趣的文章:
- 基于BootStrap Metronic開發(fā)框架經(jīng)驗小結(jié)【二】列表分頁處理和插件JSTree的使用
- jsTree 基于JQuery的排序節(jié)點 Bug
- jquery下jstree簡單應用 - v1.0
- jquery.jstree 增加節(jié)點的雙擊事件代碼
- 基于jsTree的無限級樹JSON數(shù)據(jù)的轉(zhuǎn)換代碼
- JQery jstree 大數(shù)據(jù)量問題解決方法
- jsTree樹控件(基于jQuery, 超強悍)[推薦]
- 關(guān)于無限分級(ASP+數(shù)據(jù)庫+JS)的實現(xiàn)代碼
- js實現(xiàn)無限級樹形導航列表效果代碼
- json+jQuery實現(xiàn)的無限級樹形菜單效果代碼
- javascript實現(xiàn)無限級select聯(lián)動菜單
- 基于jquery的無限級聯(lián)下拉框js插件
- js無限級折疊菜單精簡版
- php 無限級數(shù)據(jù)JSON格式及JS解析
- jstree創(chuàng)建無限分級樹的方法【基于ajax動態(tài)創(chuàng)建子節(jié)點】
相關(guān)文章
使用tp框架和SQL語句查詢數(shù)據(jù)表中的某字段包含某值
今天小編就為大家分享一篇使用tp框架和SQL語句查詢數(shù)據(jù)表中的某字段包含某值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10Laravel timestamps 設置為unix時間戳的方法
今天小編就為大家分享一篇Laravel timestamps 設置為unix時間戳的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10基于jQueryUI和Corethink實現(xiàn)百度的搜索提示功能
這篇文章主要介紹了基于jQueryUI和Corethink實現(xiàn)百度的搜索提示功能,這里是以corethink模塊的形式,只需要安裝上訪問index.php?s=/test/index 就可以了,需要的朋友可以參考下2016-11-11淺談php中的循環(huán)while、do...while、for、foreach四種循環(huán)
下面小編就為大家?guī)硪黄獪\談php中的循環(huán)while、do...while、for、foreach四種循環(huán)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11Yii使用ajax驗證顯示錯誤messagebox的解決方法
這篇文章主要介紹了Yii使用ajax驗證顯示錯誤messagebox的解決方法,可以自行設置Ajax提示信息的方式,是非常實用的技巧,需要的朋友可以參考下2014-12-12Laravel框架數(shù)據(jù)庫CURD操作、連貫操作總結(jié)
這篇文章主要介紹了Laravel框架數(shù)據(jù)庫CURD操作、連貫操作、鏈式操作總結(jié),本文包含大量數(shù)據(jù)庫操作常用方法,需要的朋友可以參考下2014-09-09