设为首页收藏本站

PHP.La 开源社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1384|回复: 1

jQuery 1.3 with PHP(3) [复制链接]

Rank: 7Rank: 7Rank: 7

Sanakan 发表于 2009-11-17 09:57:02 |显示全部楼层
本帖最后由 Sanakan 于 2009-11-17 10:02 编辑

Tabs and Accordions第3章笔记
标签和手风琴
tab和accordion都是用来分割页面的不同内容
不同点在于
1.tab的handles(控制器)是在标签内容边缘水平或垂直放置,而accordion是交错放在内容中的,就像章节标题一样。
2.tab切换是即时,而accordion的都动画效果。
3.accordion类似于IDE的代码折叠,便于查找内容而不需浏览剩余的部分。
相同点是都需要一个东西来暗示可以用于切换和一点点代码来实现。
Using a jQuery tab plugin
jQuery UI http://jqueryui.com/,插件中的精华部分(the cream of the crop),配合美观的css主题,提供一系列windgets
tab widget由Tabs List,Tabs Content二部分组成,并包含在一个容器里(wrapper)
首先来看硬编码的Tabs Content

Client-side code
客户端需要2个额外的文件
http://ajax.googleapis.com/ajax/ ... .2/jquery-ui.min.js
http://ajax.googleapis.com/ajax/ ... tness/jquery-ui.css
[snippet 46页]
<div id="tabs">
    <ul>
        <li><a href="#tabs-1">Nunc tincidunt</a></li>
    ...
    </ul>
    <div id="tabs-1">
        <p>roin elit arcu, rutrum commodo, vehicula tempus,commodoa,    risus. </p>
    </div>
    ...
</div>
注意ul中每一个li是如何与下面div标签对应的。
Tip:里面的占位文本在http://www.lipsum.com/.可以找到。
    $(document).ready(function() {
        $("#tabs").tabs();
    });
#tabs里可以用.tabs来建立多个windgets
运用DOM探测工具比如FireFox的Firebug((http://getfirebug.com/)或是Safari的Web Inspector可以看到class已经被添加进去,以便样式化tabs。
你可以在Firebug等DOM工具里暂时改变css属性,观察元素的显示。但是永久行的需要到css文件里去改。
(sanakan:其实在其他浏览器里opera(opera蜻蜓)和charme(内置),在IE里可以外链firebug的js来实现firebug的一些功能。当然IE也由自己的工具。FireFox+Firebug目前是最好的)  
                                                                                                                      Server-side considerations
如何在CMS里写tabs内容呢?一个表单是最好的。先看下accordion,然后再一起讨论。

Using jQuery accordion plugins
Accordions同tabs很像,点击链接(a header link)浏览各板块,不同在于如何定义,将javacript禁用显示可以看出:tabs用于离散的内容,accordion用于便于阅读。
Client-side code

<div id="accordion">
        <h3>Nunc tincidunt</h3>
        <div>
        <p>roin elit arcu, rutrum commodo, vehicula tempus,commodo a, risus.</p>
        </div>
        ...
</div>


对比tabs来说accordion没有可以css,也一样行得通,因为它的元素的位置都是固定的,而tabs的导航条可以在上面,下面等不同地方。
注意accordion的默认设置的高度是固定的,由第一项决定,所以可能会由滚动条。解决方法如下。
$(document).ready(function() {
     $("#accordion").accordion({
        autoHeight:false
     });
});

Server-side management of accordions
假设在你的CMS系统中管理员可以通过富文本编辑器比如TinyMCE (http://tinymce.moxiecode.com/) 或者 CKeditor (http://ckeditor.com/, FCKeditor的继承者(the upcoming successorto FCKeditor)).
简单的方式:所有的H3元素都做成accordion的标题

Client-side code
下载CKeditor解压到例子的上层目录
[snippet54页]
<script src="../jquery.min.js"></script>
<script src="../ckeditor/ckeditor.js"></script>
<script>
$(document).ready(function(){
        $('textarea.rte').each(function(){
            CKEDITOR.replace(this.name);
        });
});
</script>
<form action="page2.php" method="post">
...
<textarea class="rte"
style="width:100%;height:200px;"
name="body">
</textarea>
...

Unobtrusive JavaScript:不唐突的JavaScript写法,将行为层从内容和展现层分离开来,是代码简洁,易于维护。

Server-side code
Just the conversion
page2.php
[snippet 56页]

<?php
$html=@$_REQUEST['body'];
if(strpos($html,'<h3')===false)
$converted=$html;
else{
    $panels=explode('<h3',$html);
    $converted=array_shift($panels).'<div class="accordion">';
    foreach($panels as $panel){
        $panel_bits=explode('</h3>',$panel);
        $converted.='<h3'.$panel_bits[0].'</h3>';
        $converted.='<div>'.$panel_bits[1].'</div>';
    }
    $converted.='</div>';
}
//echo $converted;
?>
// Now show the data with the accordionos,snippet 57page
...
<body>
    <?php echo $converted;?>
</body>
...
(数组操作流畅)
注意:需要做2个数据库,一个是原本的文档,以便管理员编辑,另外一个用来发送到页面(render),使得有accordion效果。
这是个简单的例子(使用h3),更复杂的页面,再比如多个accordionos,留做练习。

Server-side management of tabs
我们依然做H3后面的页面,客户端代码和accordiono一样
Server-side code
Just the conversion
[snippet60]
<?php
$html=@$_REQUEST['body'];
if(strpos($html,'<h3')===false)
$converted=$html;
else{
    $menu=array();
    $tabs=0;
    $tab_c='';
    $panels=explode('<h3',$html);
    $converted=array_shift($panels).'<div class="tabs"><ul>';
    foreach($panels as $panel){
        $panel_bits=explode('</h3>',$panel);
        //取得tab名字的时候,需要考虑到<h3 style="color:red">的情况
        $menu[]=preg_replace('/^[^>]*>/','',$panel_bits[0]);
        $tab_c.='<div id="tab-'.($tabs++).'">'.
            $panel_bits[1].'</div>';
    }
    foreach($menu as $k=>$v)
        $converted.='<li><a href="#tab-'.$k.'">'.$v.'</a></li>';
    $converted.='</ul>'.$tab_c.'</div>';
}
?>
...
<body>
    <?php
    echo $converted;
    ?>
</body>
...
Using special codes to define tabs
同时使用这两个windgets怎么做?
因为文本是你自己写的,所以可以用自定义的文本分割。{{TABSTART}},{{TABPAGE}},{{TABEND}}.

图62页

Client-side code
[63页代码]
同时使用<h3>和上面的分割文本
第1次explode后移除第一项,得到{{TABSTART}}前面的,做成accordion.
第2次剩下的explode,[0]为中间,再用{{TABPAGE}}分割的各个tabs.(S:处理中间这堆,揉得人头晕)
[1]为{{TABEND}}后面的,做成accordion.
例子是tabs中包含accordion的所以要注意convert_accordions函数出现的各个地方。

可以改为{{TABPAGE name="configuration"}},将name做成tags的标签名字。可以自由扩展。因为用户使用的是变换好的,变换占的资源置在编辑保存的时候。
Loading accordion panels through Ajax
配合使用Ajax来accordion一本书的章节。
Client-side code
[snippet 67页]

$chapters=preg_match_all('/Chapter /',$book,$arr);
for($i=1;$i<$chapters+1;++$i){
...
}

accordion()函数的参数:
'collapsible':     是否允许所有的元素关闭,默认是false.
'active':           定义开始的时候打开的是哪个面板。设置为false的话,当collapsible是ture的时候,一个打开的都没有。
'changestart':function(ev,ui){}中ui是jqueryUI中关于accordion状态的,ui.newHeader是刚点击的标题。

Server-side code
[snippet69页]
注意以下php函数的参数和用法:
str_replace
preg_replace
preg_match_all
explode
array_shift
echo(逗号分隔开的内容)
和JavaScript函数replace的用法。

Loading tab panels through Ajax
tab用来分离内容
Client-side code
tabs插件能够自动使用Ajax取得内容。
(《jquery_ui_16_the_user_interface_library_for_jquery》书里有没有提到,倒是记不清了。)
注意:如果使用tabs和Accordions提交表单时候使用Ajax不当,会丢失表单内容。

http://www.bookfm.com/book/bookdetail.html?bid=107006

下一章
PHP/JavaScript表单验证。

ewielrn 发表于 2010-7-3 03:56:47 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|PHP.La 开源社区 ( 京ICP备09104811号 )  

GMT+8, 2012-5-20 12:11

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部