自己写的模仿JQ的UI-TAB控件,兼容多浏览器
先来看看效果如何:[img]http://omeweb.com/photo/temp/ui_tab/ui-tab.jpg[/img]
注意,这不是JQUERY的UI-TAB,核心JS大小只要2K,而且,使用比较简单,
[url=http://omeweb.com/photo/temp/ui_tab/ui_tab.htm]大家来这里看看DEMO吧[/url].......
具体的使用说明见DEMO页,[url=http://omeweb.com/photo/temp/ui_tab/ui_tab.rar]这里也提供下载[/url],如有BUG等,欢迎交流.
[[i] 本帖最后由 omeweb 于 2008-7-11 12:22 编辑 [/i]] 不错 下来研究下 没发现可以保持刷新 如果页面里有多个这样的tab的话,能保持的就其中的一个,因为url后面的锚只有一个 大叔,大叔……:) [html]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<link rel="stylesheet" href="ui.tabs.css" type="text/css" media="print, projection, screen">
<title>Simple Tabs</title>
<style>
* { font-size:14px;}
h2{font-size:24px;}
.highlight {background-color:#FFFF00;}
.note{color:#FF0000; font-weight:bold;}
/* Caution! Ensure accessibility in print and other media types... */
@media projection, screen { /* Use class for showing/hiding tab content, so that visibility can be better controlled in different media types... */
.ui-tabs-hide {
display: none;
}
}
/* Hide useless elements in print layouts... */
@media print {
.ui-tabs-nav {
display: none;
}
}
/* Skin */
.ui-tabs-nav, .ui-tabs-panel {
font-family: "Trebuchet MS", Trebuchet, Verdana, Helvetica, Arial, sans-serif;
font-size: 12px;
}
.ui-tabs-nav {
list-style: none;
margin: 0;
padding: 0 0 0 4px;
}
.ui-tabs-nav:after { /* clearing without presentational markup, IE gets extra treatment */
display: block;
clear: both;
content: " ";
}
.ui-tabs-nav li {
float: left;
margin: 0 0 0 1px;
/*min-width: 84px; be nice to Opera */
}
.ui-tabs-nav a, .ui-tabs-nav a span {
display: block;
padding: 0 10px;
background: url(http://omeweb.com/photo/temp/ui_tab/tab.png) no-repeat;
}
.ui-tabs-nav a {
margin: 1px 0 0; /* position: relative makes opacity fail for disabled tab in IE */
padding-left: 0;
color: #27537a;
font-weight: bold;
line-height: 1.2;
text-align: center;
text-decoration: none;
white-space: nowrap; /* required in IE 6 */
outline: 0; /* prevent dotted border in Firefox */
}
.ui-tabs-nav .ui-tabs-selected a {
position: relative;
top: 1px;
z-index: 2;
margin-top: 0;
color: #000;
}
.ui-tabs-nav a span {
width: 50px; /* IE 6 treats width as min-width */
min-width: 50px;
height: 18px; /* IE 6 treats height as min-height */
min-height: 18px;
padding-top: 6px;
padding-right: 0;
}
*>.ui-tabs-nav a span { /* hide from IE 6 */
width: auto;
height: auto;
}
.ui-tabs-nav .ui-tabs-selected a span {
padding-bottom: 1px;
}
.ui-tabs-nav .ui-tabs-selected a, .ui-tabs-nav a:hover, .ui-tabs-nav a:focus, .ui-tabs-nav a:active {
background-position: 100% -150px;
}
.ui-tabs-nav a, .ui-tabs-nav .ui-tabs-disabled a:hover, .ui-tabs-nav .ui-tabs-disabled a:focus, .ui-tabs-nav .ui-tabs-disabled a:active {
background-position: 100% -100px;
}
.ui-tabs-nav .ui-tabs-selected a span, .ui-tabs-nav a:hover span, .ui-tabs-nav a:focus span, .ui-tabs-nav a:active span {
background-position: 0 -50px;
}
.ui-tabs-nav a span, .ui-tabs-nav .ui-tabs-disabled a:hover span, .ui-tabs-nav .ui-tabs-disabled a:focus span, .ui-tabs-nav .ui-tabs-disabled a:active span {
background-position: 0 0;
}
.ui-tabs-nav .ui-tabs-selected a:link, .ui-tabs-nav .ui-tabs-selected a:visited, .ui-tabs-nav .ui-tabs-disabled a:link, .ui-tabs-nav .ui-tabs-disabled a:visited { /* @ Opera, use pseudo classes otherwise it confuses cursor... */
cursor: text;
}
.ui-tabs-nav a:hover, .ui-tabs-nav a:focus, .ui-tabs-nav a:active { /* @ Opera, we need to be explicit again here now... */
cursor: pointer;
}
.ui-tabs-disabled {
opacity: .4;
filter: alpha(opacity=40);
}
.ui-tabs-panel {
border-top: 1px solid #97a5b0;
padding: 1em 8px;
background: #fff; /* declare background color for container to avoid distorted fonts in IE while fading */
}
.ui-tabs-loading em {
padding: 0 0 0 20px;
background: url(http://omeweb.com/photo/temp/ui_tab/loading.gif) no-repeat 0 50%;
}
/* Additional IE specific bug fixes... */
* html .ui-tabs-nav { /* auto clear, @ IE 6 & IE 7 Quirks Mode */
display: inline-block;
}
*:first-child+html .ui-tabs-nav { /* @ IE 7 Standards Mode - do not group selectors, otherwise IE 6 will ignore complete rule (because of the unknown + combinator)... */
display: inline-block;
}
</style>
</head>
<body>
<h2>Simple Tabs</h2>
<h2>使用说明</h2>
<div>
<ul class="ui-tabs-nav" id="Div_li_ui-tabs-selected_">
<li class="ui-tabs-selected"><a href="javascript:void(0)"><span>高度封装</span></a></li>
<li><a href="javascript:void(0)"><span>使用简单</span></a></li>
<li><a href="javascript:void(0)"><span>兼容性好</span></a></li>
<li><a href="javascript:void(0)"><span>刷新保持</span></a></li>
<li><a href="javascript:void(0)"><span>程序控制</span></a></li>
<li><a href="javascript:void(0)"><span>结构简单</span></a></li>
</ul>
<div style="display: block;" class="ui-tabs-panel ui-tabs-hide" id="Div_1">
结构比较简单,已经封装,<span class="note">本作品为 橘子香水 原创,其中样式借用了jquery的ui-tab的样式,JS部分getElementsByClassName是来自网络,其他均为自己写的,程序还可以被扩展,也可能有bug,欢迎指正:QQ 61632273 ,MSN omeweb(at)hotmail.com。</span>
</div>
<div class="ui-tabs-panel ui-tabs-hide" id="Div_2">
使用简单,两行代码 :var s=new UI_TAB();s.init("container-1");//init方法的参数就是tab的外围DIV的ID
</div>
<div class="ui-tabs-panel ui-tabs-hide" id="Div_3">
兼容IE6,7,8(样式有一点问题),FF1.5,FF3.0
</div>
<div class="ui-tabs-panel ui-tabs-hide" id="Div_4">
刷新页面后仍然可以保持被激活的选项卡
</div>
<div class="ui-tabs-panel ui-tabs-hide" id="Div_5">
要用程序激活指定的tab,只需要:s2.activeIndex(1);//其中s2是实例名,后面的1是从0开始的序号,这里有一个例子:<a href="" onclick="s2.activeIndex(1); return false;">点这里激活第二个TAB的第二个</a>
</div>
<div class="ui-tabs-panel ui-tabs-hide" id="Div_6"><pre style="margin:0; padding:0;">
<div id="container-1"><span class="note"><!--使用时: var s=new UI_TAB();s.init("container-1");--></span>
<ul class="ui-tabs-nav">
<li class="<span class="highlight">ui-tabs-selected</span>"><a href="<span class="highlight">#fragment-1</span>"><span><span class="highlight">One</span></span></a></li>
<li class=""><a href="#fragment-2"><span>Two</span></a></li>
<li class=""><a href="#fragment-3"><span>Three</span></a></li>
</ul>
<span class="note"><!--上面的导航项目全放在class为的UL下面的LI下,高亮部分依次是默认显示的项目,显示内容的id,选项卡的标题--></span>
<div style="<span class="highlight">display: block;</span>" class="<span class="highlight">ui-tabs-panel ui-tabs-hide</span>" id="<span class="highlight">fragment-1</span>">
<p>First tab</p>
</div>
<span class="note"><!--上面的结构就是内容的结构,高亮部分依次是默认显示的内容,每一个内容都要有的class,以及和选项卡对应的ID--></span>
<div class="ui-tabs-panel ui-tabs-hide" id="fragment-2">
<p>Second tab</p>
</div>
<div class="ui-tabs-panel ui-tabs-hide" id="fragment-3">
<p>Third tab</p>
</div>
</div>
</pre>
</div>
</div>
<script type="text/javascript">
//<![data[
new tab('Div_li_ui-tabs-selected_');
function tab(o){
var $ = function(o){return document.getElementById(o)};
var css = o.split('_');
if(css.length!=4)return;
o = $(o);
o.id = css[0];
if(o){
var item = o.getElementsByTagName(css[1]);
o['cur'] = item[0];
for(var i=0;i<item.length;i++){
item[i]['css'] = css;
item[i]['link'] = o;
item[i]['Index'] = i+1;
item[i].onclick = function(){
this['link']['cur'].className = this['css'][3];
this.className = this['css'][2];
try{
$(this['link']['id']+'_'+this['link']['cur']['Index']).style.display = 'none';
$(this['link']['id']+'_'+this['Index']).style.display = 'block';
}catch(e){}
this['link']['cur'] = this;
}
}
}
}
//]]-->
</script>
</body>
</html>
[/html]
随便写的..
献丑了....
使用方法
new tab(id)
id的命名规则,自己看...说出来觉得好绕嘴...
实例中有.你可以参照一下..
[code]
new tab("Div_li_ui-tabs-selected_")
下面的div的命名是
Div_1
Div_2
Div_3
Div_4
Div_5
Div_6
Div是 传给tab的第一个_前面的字符.
后面的数字分别对应第一个标签,第二个标签.等等....
li代表的是给当前对象下面的哪个标签绑定onclick事件.[下面会有一个table的应用实例]
ui-tabs-selected 是单击某个标签时给它设置的样式名称
最后一个因为是空所以就是个空,什么也不写就行了.中间用_分隔..
[/code]
[html]
<style type="text/css" media="screen">
.td1{
background: #ccc;
}
.td2{
background: #FFF;
}
td{
cursor: pointer;
text-align: center;
}
#test_2, #test_3, #test_4{
display: none;
}
</style>
<table width="400">
<tr id="test_td_td1_td2">
<td class="td1">标签1</td>
<td>标签2</td>
<td>标签3</td>
<td>标签4</td>
</tr>
<tr>
<td colspan="4">
<div id="test_1">11111111111</div>
<div id="test_2">22222222222</div>
<div id="test_3">3333333333333333333333333</div>
<div id="test_4">4444444444444444444444444444444444444</div>
</td>
</tr>
</table>
<script type="text/javascript">
function tab(o){
var $ = function(o){return document.getElementById(o)};
var css = o.split('_');
if(css.length!=4)return;
o = $(o);
o.id = css[0];
if(o){
var item = o.getElementsByTagName(css[1]);
o['cur'] = item[0];
for(var i=0;i<item.length;i++){
item[i]['css'] = css;
item[i]['link'] = o;
item[i]['Index'] = i+1;
item[i].onclick = function(){
this['link']['cur'].className = this['css'][3];
this.className = this['css'][2];
$(this['link']['id']+'_'+this['link']['cur']['Index']).style.display = 'none';
$(this['link']['id']+'_'+this['Index']).style.display = 'block';
this['link']['cur'] = this;
}
}
}
}
window.onload = function(){
new tab('test_td_td1_td2');
}
</script>
[/html]
最后顺便说一下...做人要学会低调...把旗帜打那么高干嘛呀.
代码写成那样,还说是高度封装..
[[i] 本帖最后由 faeng220 于 2008-7-11 09:49 编辑 [/i]] 恩,我是来学习的,你做的不错,代码也很精练,思路也不错,不过是否要考虑一下下面的问题呢?
1 ,刷新保持
2 ,程序控制决定哪个显示
3 ,另外,你的ID命名方式局限有点大,特别是在DOTNET 编程的时候影响会比较大,比如在UserControl里,或者是MasterPage里
诚心提的一点意见,呵呵,另外,不想和你讨论"做人要学会低调"的问题 :D 看来你是不会低调了.真不想打击你..
1,保持刷新[我用的是Cookie]
2.程序控制决定显示哪个.. [实现方法自己看代码]
下面代码我在IE6,FF2.0,FF3.0测试均可正常运行.
IE7和Opera没条件没测试..有测试的谁给发个测试结果..
下面的例子中,第一个,在页面转入两秒后,让第二个显示,再过两秒第三个显示.
想让哪个显示.可以直接使用
对象[索引值].show(); [索引值从1开始计数]
例如
[code]
var xx = new tab('test_td_td1_td2');
if(xx)xx[2].show();
第二个标签显示
[/code]
[html]
<style type="text/css" media="screen">
.td1{
background: #ccc;
}
.td2{
background: #FFF;
}
table{
border-collapse : collapse;
border: 1px solid #6298E1;
}
td{
cursor: pointer;
text-align: center;
}
#test_2, #test_3, #test_4{
display: none;
}
#test2_2, #test2_3, #test2_4{
display: none;
}
</style>
<h1>第一个标签</h1>
<table width="400" border="1">
<tr id="test_td_td1_td2">
<td class="td1">标签1</td>
<td>标签2</td>
<td>标签3</td>
<td>标签4</td>
</tr>
<tr height="200">
<td colspan="4">
<div id="test_1">11111111111</div>
<div id="test_2">22222222222</div>
<div id="test_3">3333333333333333333333333</div>
<div id="test_4">4444444444444444444444444444444444444</div>
</td>
</tr>
</table>
<h1>第二个标签</h1>
<table width="400" border="1">
<tr id="test2_td_td1_td2">
<td class="td1">标签1</td>
<td>标签2</td>
<td>标签3</td>
<td>标签4</td>
</tr>
<tr height="100">
<td colspan="4">
<div id="test2_1">11111111111</div>
<div id="test2_2">22222222222</div>
<div id="test2_3">3333333333333333333333333</div>
<div id="test2_4">4444444444444444444444444444444444444</div>
</td>
</tr>
</table>
<script type="text/javascript">
cookie = {};
cookie.set = function(n, v, t){
var exp = new Date();
exp.setTime(exp.getTime() + (t||24)*60*60*1000);
document.cookie = n + "="+ escape(v) + ";expires=" + exp.toGMTString();
}
cookie.get = function(n){
var arr = document.cookie.match(new RegExp("(^| )"+ n +"=([^;]*)(;|$)"));
if(arr != null) return unescape(arr[2]);
return null;
}
function tab(o){
var $ = function(o){return document.getElementById(o)};
var css = o.split('_');
if(css.length!=4)return;
o = $(o);
o['old_id'] = o.id;
o.id = css[0];
if(o){
var item = o.getElementsByTagName(css[1]);
o['cur'] = item[0];
for(var i=0;i<item.length;i++){
item[i]['css'] = css;
item[i]['link'] = o;
item[i]['Index'] = i+1;
item[i].onclick = function(){
this['link']['cur'].className = this['css'][3];
this.className = this['css'][2];
$(this['link']['id']+'_'+this['link']['cur']['Index']).style.display = 'none';
$(this['link']['id']+'_'+this['Index']).style.display = 'block';
this['link']['cur'] = this;
cookie.set(this['link']['old_id'], this['Index']);
}
item[i].show = function(){
if(document.all)this.click();
else this.onclick();
}
}
var co = cookie.get(o['old_id']);
if(co != undefined){
item[co-1].show();
}
return item;
}
return false;
}
window.onload = function(){
var xx = new tab('test_td_td1_td2');
if(xx)setTimeout(function(){
xx[1].show();
setTimeout(function(){
xx[2].show();
}, 2000);
},2000);
var x = new tab('test2_td_td1_td2');
}
</script>
[/html]
=================================================
[color=red]最后请允许我再BS一次,做人不知道低调的人..[/color]
=================================================
还有不要跟我提.NET
本人不玩.NET
[[i] 本帖最后由 faeng220 于 2008-7-11 11:33 编辑 [/i]] 楼上口气好低调,小弟我我学习了。。。-_!!
楼主的代码全局方法太多,不太好呀,取class用正则会更简单,不过选项卡还不错,可以自动伸缩~ 非常不错,就是你的ID我还是觉得是一个小瑕疵,不适合我用.
1,仁者见仁,智者见智,至少在我的应用范围内,你的不适合我,因为我是做ASP.NET的,我以前是我玩ASP的,现在一看到ASP的代码就觉得厌恶了.
2,再者,我不认为我有多高调,观者自有分晓.如有过的地方,直接批评.
3,JS并不是我的长处,不过是一个爱好,我的那代码,有些是没有封装进去,是因为开始的时候我把它们放到一个common.js里去了,在这里不过是提取出来了.
4,JS貌似是你的长处,在这个tab问题上能和你杠上,我算是值了,不过,我觉得我写的JS和你写的差别也不是很大嘛,呵呵.
欢迎继续拍砖... [quote]
3,JS并不是我的长处,不过是一个爱好,我的那代码,有些是没有封装进去,是因为开始的时候我把它们放到一个common.js里去了,在这里不过是提取出来了.
[/quote]
那你还在标题上写 高度封装?:confused:
兼容多浏览器,我倒没试你的代码是不是兼容其他的浏览器.
就是看了你的代码以后...特烦这种 标题党,把标题打的高高的,其实也没那么高嘛.:o 看来 你是对我的那标题有意见了?实在惭愧,因为要演示,临时把一些常用的方法提出来直接放在那里了,这里应该说是 核心代码 被封装了....仓促了,不严密啊.对不起大家.
另外,我还想请教下你的这个tab的扩展性如何,比如,怎么在某个tab里使用AJAX动态加载呢,这个对你来说肯定不是问题,因为我也不觉得是什么问题,只是来完善下而已,我的那个TAB呢,可以在那选项卡名字的href上做文章...... [quote]兼容多浏览器,我倒没试你的代码是不是兼容其他的浏览器.[/quote]
我是做程序的,我会对我做出来的东西负责,所以,我会先测试兼容性问题,目前在IE8下的样式有一点小问题(标题太短了背景没有被撑开,很容易修改),其他的都没有问题.
[[i] 本帖最后由 omeweb 于 2008-7-11 12:36 编辑 [/i]] tab 构造类里面添加了两个新参数call和res,
call 为单击每个tab时同时激发的函数名.[类型function对象]
res 为页面刷新的时候,重不重现上一次选择的标签.[类型非undefined的值]
call 和 res这两个参数为可选参数.可传可不传.
省略res参数.则刷新页面的时候,不重现上一次选择的标签项.
对于每一个tab标签,可以通过重写标签对象的callBack来实现自定义的方法.
在callBack函数中 this指向当前的标签对象.
this['link']['id']+'_'+this['Index']为当前标签对应的要显示区域的id值.然后可以通过
document.getElementById(this['link']['id']+'_'+this['Index'])
来得到这个对象.
接下要,要做什么事..看你自己的了..
[html]
<style type="text/css" media="screen">
.td1{
background: #ccc;
}
.td2{
background: #FFF;
}
table{
border-collapse : collapse;
border: 1px solid #6298E1;
}
td{
cursor: pointer;
text-align: center;
}
#test_2, #test_3, #test_4{
display: none;
}
#test2_2, #test2_3, #test2_4{
display: none;
}
</style>
<h1>第一个标签</h1>
<table width="400" border="1">
<tr id="test_td_td1_td2">
<td class="td1">标签1</td>
<td>标签2</td>
<td>标签3</td>
<td>标签4</td>
</tr>
<tr height="200">
<td colspan="4">
<div id="test_1">11111111111</div>
<div id="test_2">22222222222</div>
<div id="test_3">3333333333333333333333333</div>
<div id="test_4">4444444444444444444444444444444444444</div>
</td>
</tr>
</table>
<script type="text/javascript">
cookie = {};
cookie.set = function(n, v, t){
var exp = new Date();
exp.setTime(exp.getTime() + (t||24)*60*60*1000);
document.cookie = n + "="+ escape(v) + ";expires=" + exp.toGMTString();
}
cookie.get = function(n){
var arr = document.cookie.match(new RegExp("(^| )"+ n +"=([^;]*)(;|$)"));
if(arr != null) return unescape(arr[2]);
return null;
}
function tab(o, call, res){
var $ = function(o){return document.getElementById(o)};
var css = o.split('_');
if(css.length!=4)return;
o = $(o);
o['old_id'] = o.id;
o.id = css[0];
if(o){
var item = o.getElementsByTagName(css[1]);
o['cur'] = item[0];
for(var i=0;i<item.length;i++){
item[i]['css'] = css;
item[i]['link'] = o;
item[i]['Index'] = i+1;
if(call)item[i].callBack = call;
item[i].onclick = function(){
this['link']['cur'].className = this['css'][3];
this.className = this['css'][2];
$(this['link']['id']+'_'+this['link']['cur']['Index']).style.display = 'none';
$(this['link']['id']+'_'+this['Index']).style.display = 'block';
this['link']['cur'] = this;
cookie.set(this['link']['old_id'], this['Index']);
if(this.callBack)this.callBack.call(this);
}
item[i].show = function(){
if(document.all)this.click();
else this.onclick();
}
}
var co = cookie.get(o['old_id']);
if(co != undefined && res!=undefined){
item[co-1].show();
}
return item;
}
return false;
}
window.onload = function(){
var xx = new tab('test_td_td1_td2', who);
xx[1].callBack = function(){//0代表第一个.1代表第二个标签项.依次类推
alert('自定义');
}
}
function who(){
alert(document.getElementById(this['link']['id']+'_'+this['Index']).innerHTML);
}
</script>
[/html]
[[i] 本帖最后由 faeng220 于 2008-7-11 14:32 编辑 [/i]] 两位莫争了,
如果有心情,可以看看我写的:
[url]http://bbs.blueidea.com/thread-2748975-1-1.html[/url]
不要伤和气。 1,我真的很遗憾,你每次发的帖子里都带着一种挑屑和不服气,以及要突出你的js是如何如何的好.你的帖子一开始就充满了火药味.
2,我只是想要你把东西做的完善点,你却以为我是在为难你,这使我真的很生气,觉得你很无聊.
3,什么叫"不要跟我提什么ajax,貌似你提了.你水平就高了???",你以为AJAX你很牛?还是怎么滴?叫什么板?
4,我不喜欢拿自己的长处和别人的短处比,而你总以为我JS如何的乱,事实上我并没输到多少吧?优雅的代码我看多了,你的编码也不过如此吧?
5,如果有100个ajax选项,你要写上100个xx[1].callBack = function(){},我可不想做民工. xling版主的这个去年我就用过了,很不错,我的这个不过是个轻量的
另外,我上一帖主要说的是,faeng220 扩展AJAX的方式我觉得并不好 . 回复你的1,2
我并没有说JS怎么怎么好..这话是你自己说的.每种语言都有每种语言的优点,也有它的缺点.所以你无法做出JS和.NET或者和PHP或者JSP其他任何语言哪一种更好.
回复3:我已经无语..还在提AJAX
回复4
我并不是你.所以我不知道,你擅长什么不擅长什么.所以我没有拿我的长处比你的短处.
而且我并不认为JS是我的长处,也没有认为JS是你的短处.这只是你自己一个人在猜想.
回复5:
如果你有100个选项卡,而每个选项卡上面的每个标签的要求都不一样,我想没有一个人敢说他不需要为每个标签都写一个自定义的函数.如果要求一样,则在构造对象的时候,传递一个函数名就可以了.
你每次对我的提问只是想证明,你没有输. 我并没有说你输,也没有说你赢,我只是希望你以后发帖子能谦虚点,低调点.....不要玩那种标题党,没意思. 送你一句话,我没有必要以你所谓的(谦虚,低调)标准来做事,我就是我,你所谓的标准,说白了管我什么事!!
建议版主封帖.我不会再回复了,无聊. 那你干嘛改标题??
继续把那四个字挂上面呀. :D 漂亮,谢谢楼主! 好厉害,研究一下 都吵起来了,呵呵没必要。楼主得这个还是不错得了。共享精神就值得我们学习 虽然还是不算很完美,但是再努图啦。其实记录状态放到URL中也不是坏事,起码保持TAB状态在禁用COOKIE时还可以记录。 呵呵 看完了觉得好想笑 顶起来你们来继续吵嘛…… 学习下。。。 我觉得两个人水平都很高:D ,两个人的胸心都不大:) !
页:
[1]