账号通
    

账号  

密码  

6292

查看

10

回复
主题:[分享]用SQL语句来写搜索标签!打造属于你的搜索! [收藏主题] 转到:  
jxz_211 当前离线

340

主题

0

广播

1

粉丝
添加关注
级别:三年级

用户积分:3974 分
登录次数:356 次
注册时间:2008/6/12
最后登录:2011/4/23
jxz_211 发表于:2009/4/16 20:03:00   | 只看该作者 查看该作者主题 楼主 
科汛在线考试系统(NET)

看到有人说科讯的搜索不好看,也看到有人说搜索的样式不好控制,今天乘空来给大家写个分享教程,希望能给大家一些帮助,小弟不才,有什么说得不好的地方还请指出,大家一起切磋分享。


现在我就以文章模型搜索为例,大家看看用SQL标签是怎么来打造不一样的搜索的。


文章搜索是自动生成在JS文件下的S_Article.js文件。


打开这个文件,大家看看源代码,就会发现其实就是一个用JS写出来的搜索表单。


现在我们把它转成HTML代码,那么表单就变成


<form id="SearchForm" name="SearchForm" method="get" action="/plus/Search.asp">


 


<select name="SearchType">
<option value="1">标 题</option>
<option value="2">内 容</option>
<option value="3">作 者</option>
<option value="4">录入者</option>
<option value="5">关键字</option>
</select>


 


<select name="ClassID" style="width:150">
<option value="0" selected="selected">所有栏目</option>
<option value='20088106776907'>新闻动态 </option><option value=\'20082039846991\'> ├ 国外新闻</option><option value='20080440748080'>└ 国内新闻</option>


</select>


 


<input name="KeyWord" type="text" class="textbox"  value="关键字" onfocus="this.select();"/>


<input name="ChannelID" value="1" type="hidden" />
<input type="submit" class="inputButton" name="Submit" value="搜 索" />


</form>


这样一来,这个搜索表单就一目了然了。把它抠出来,放在你的模板里。现在我们来改样式。


蓝色的这段。你可以自由发挥了。比如<option value="1">标 题</option>你可以把里面的文字改成文章标题。


你也可以把<option value="4">录入者</option>这行去掉。看你的喜欢。如果你还想加些其它自定义字段的搜索,那你就要到plus/search.asp里面做做文章了。这个就是题外话了。


重点的来了。看到红色背景的那段。我们用SQL语句循环嵌套来解决它。


(1)标签名:文章搜索内循环


查询语句:select ClassID,ID,FolderName,FolderOrder,TJ,TN from KS_Class where TJ=2 and TN="{$Param(0)}" order by FolderOrder asc


循环体:


[loop=50]
<option value="{$Field(ID,GetInfoUrl,100,2)}" class="suboption">{$Field(FolderName,Text,0,...,0,)}</option>
[/loop]


(2)标签名:文章搜索外输出


查询语句:select ClassID,ID,FolderName,ChannelID,FolderOrder,TJ from KS_Class where ChannelID=1 and TJ=1 order by FolderOrder asc


循环体:


[loop=50]
<option value="{$Field(ID,GetInfoUrl,100,2)}" class="mainoption" disabled="disabled">{$Field(FolderName,Text,0,...,0,)}</option>
{SQL_文章搜索内循环({$Field(ID,GetInfoUrl,100,2)})}
[/loop]


OK,于是上面的表单红色背景那段就可以用SQL标签{SQL_文章搜索外输出()}来代替了。


定义一下.mainoption{background:#ccc;}就可以看到一级栏目的背景变灰了。还有其它效果可以自己改。


如果您想要它不能被选中,可以参考以下这段JQuery代码:(前提是你的网站里要有JQuery文件包)


<javascript>


//这个方法的参数oSelect是select的对象


function preventSelectDisabled(oSelect)
{


   //得到当前select选中项的disabled属性。
   var isOptionDisabled = oSelect.options[oSelect.selectedIndex].disabled;


   //如果是有disabled属性的话
   if(isOptionDisabled)
   {


      //让他恢复上一次选择的状态,oSelect.defaultSelectedIndex属性是前一次选中的选项index
      oSelect.selectedIndex = oSelect.defaultSelectedIndex;
      return false;
   }


  //如果没有disabled属性的话
   else
   {


       //oSelect.defaultSelectedIndex属性,设置成当前选择的index
       oSelect.defaultSelectedIndex = oSelect.selectedIndex;
       return true;
   }
}


//为页面所有select绑定这个功能


$(document).ready(function(){
 $("select").each(
     function(){
      var tempfun=this.onchange;
      this.onchange=function(){
         if(!preventSelectDisabled(this)){return false};
         tempfun.call(this);
      }
    }
 )


//加上这段代码吧,如果加入你是A画面转到B画面的话,B画面需要根据A画面传来的参数来focus某些select的时候 ,你就这道他的作用了。


   $("select", document.forms[0]).each
    (
        function(i)
        {
            this.defaultSelectedIndex = this.selectedIndex;
        }
    );
});


</javascript>


我没去试,有兴趣的可以去试试。还有为了美化select而做的模拟select菜单。大家可以参考这段javascript代码。


<script language="javascript" type="text/javascript">


var childCreate=false;
function Offset(e)
//取标签的绝对位置
{
var t = e.offsetTop;
var l = e.offsetLeft;
var w = e.offsetWidth;
var h = e.offsetHeight-2;
while(e=e.offsetParent)
{
t+=e.offsetTop;
l+=e.offsetLeft;
}
return {
top : t,
left : l,
width : w,
height : h
}
}
function loadSelect(obj){
//第一步:取得Select所在的位置
var offset=Offset(obj);
//第二步:将真的select隐藏
obj.style.display="none";
//第三步:虚拟一个div出来代替select
var iDiv = document.createElement("div");
iDiv.id="selectof" + obj.name;
iDiv.style.position = "absolute";
iDiv.style.width=offset.width + "px";
iDiv.style.height=offset.height + "px";
iDiv.style.top=offset.top + "px";
iDiv.style.left=offset.left + "px";
iDiv.style.background="url(images/monise_bg.gif) no-repeat right";
iDiv.style.border="1px solid #ddd";
iDiv.style.textAlign="left";
iDiv.style.paddingLeft="10px";
iDiv.style.color="#999";
iDiv.style.fontSize="12px";
iDiv.style.lineHeight=offset.height + "px";
iDiv.style.textIndent="4px";
document.body.appendChild(iDiv);
//第四步:将select中默认的选项显示出来
var tValue=obj.options[obj.selectedIndex].innerHTML;
iDiv.innerHTML=tValue;
//第五步:模拟鼠标点击
iDiv.onmouseover=function(){//鼠标移到
iDiv.style.background="url(images/monise_bg.gif) no-repeat right";
}
iDiv.onmouseout=function(){//鼠标移走
iDiv.style.background="url(images/monise_bg.gif) no-repeat right";
}
iDiv.onclick=function(){//鼠标点击
if (document.getElementById("selectchild" + obj.name)){
//判断是否创建过div
   if (childCreate){
    //判断当前的下拉是不是打开状态,如果是打开的就关闭掉。是关闭的就打开。
    document.getElementById("selectchild" + obj.name).style.display="none";
    childCreate=false;
   }else{
    document.getElementById("selectchild" + obj.name).style.display="";
    childCreate=true;
   }
}else{
   //初始一个div放在上一个div下边,当options的替身。
   var cDiv = document.createElement("div");
   cDiv.id="selectchild" + obj.name;
   cDiv.style.position = "absolute";
   cDiv.style.width=(offset.width+10) + "px";
   cDiv.style.height=(obj.options.length *20+10) + "px";
   cDiv.style.top=(offset.top+offset.height+2) + "px";
   cDiv.style.left=offset.left + "px";
   cDiv.style.background="#f7f7f7";
   cDiv.style.border="1px solid #333";
   cDiv.style.color="#666";
   var uUl = document.createElement("ul");
   uUl.id="uUlchild" + obj.name;
   uUl.style.listStyle="none";
   uUl.style.margin="0";
   uUl.style.paddingTop="5px";
   uUl.style.paddingBottom="5px";
   uUl.style.fontSize="12px";
   cDiv.appendChild(uUl);
   document.body.appendChild(cDiv);
   childCreate=true;
   for (var i=0;i<obj.options.length;i++){
    //将原始的select标签中的options添加到li中
    var lLi=document.createElement("li");
    lLi.id=obj.options[i].value;
    lLi.style.textIndent="4px";
    lLi.style.height="20px";
    lLi.style.lineHeight="20px";
    lLi.innerHTML=obj.options[i].innerHTML;
    uUl.appendChild(lLi);
   }
   var liObj=document.getElementById("uUlchild" + obj.name).getElementsByTagName("li");
   for (var j=0;j<obj.options.length;j++){
    //为li标签添加鼠标事件
    liObj[j].onmouseover=function(){
     this.style.background="#666";
     this.style.color="#fff";
     this.style.cursor="pointer"
    }
    liObj[j].onmouseout=function(){
     this.style.background="#fff";
     this.style.color="#666";
    }
    liObj[j].onclick=function(){
     //做两件事情,一是将用户选择的保存到原始select标签中,要不做的再好看表单递交后也获取不到select的值了。
     obj.options.length=0;
     obj.options[0]=new Option(this.innerHTML,this.id);
     //同时我们把下拉的关闭掉。
     document.getElementById("selectchild" + obj.name).style.display="none";
     childCreate=false;
     iDiv.innerHTML=this.innerHTML;
    }
   }
}
}
}


</script>


如果你还想在关键字输入框做个google suggest的效果,这就有点麻烦了。我还没找到个能兼容IE和Firefox的好代码,多半是上下按钮等等不能进行选择取消等。如果哪位大哥有兼容性比较完美的,麻烦记得告诉我一个。

 
  支持(1) | 反对(0) 回到顶部顶端 回到底部底部
didadida 当前离线

99

主题

0

广播

0

粉丝
添加关注
级别:学前班

用户积分:1723 分
登录次数:266 次
注册时间:2007/11/11
最后登录:2015/5/14
didadida 发表于:2009/7/23 9:03:00   | 只看该作者 查看该作者主题 沙发 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
iwo630 当前离线

532

主题

0

广播

0

粉丝
添加关注
级别:五年级

用户积分:3724 分
登录次数:152 次
注册时间:2008/11/8
最后登录:2010/12/10
iwo630 发表于:2009/6/16 16:15:00   | 只看该作者 查看该作者主题 藤椅 
科汛智能建站系统
以下是引用cnmichle在2009-6-16 13:50:00的发言:
做个记号

 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
cnmichle 当前离线

176

主题

0

广播

0

粉丝
添加关注
级别:一年级

用户积分:1360 分
登录次数:116 次
注册时间:2008/8/21
最后登录:2015/5/26
cnmichle 发表于:2009/6/16 13:50:00   | 只看该作者 查看该作者主题 板凳 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
k52086 当前离线

1156

主题

0

广播

0

粉丝
添加关注
级别:八年级

用户积分:5486 分
登录次数:192 次
注册时间:2008/12/18
最后登录:2011/3/10
k52086 发表于:2009/4/18 9:48:00   | 只看该作者 查看该作者主题 报纸 
科汛在线网校系统
以下是引用msy168在2009-4-17 15:08:00的发言:
收藏 不错

 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
msy168 当前离线

315

主题

0

广播

0

粉丝
添加关注
级别:三年级

用户积分:2400 分
登录次数:190 次
注册时间:2008/3/30
最后登录:2014/11/15
msy168 发表于:2009/4/17 15:08:00   | 只看该作者 查看该作者主题 地板 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
liaohongchu 当前离线

150

主题

0

广播

0

粉丝
添加关注
级别:一年级

用户积分:1797 分
登录次数:121 次
注册时间:2008/10/13
最后登录:2011/10/21
liaohongchu 发表于:2009/4/17 14:53:00   | 只看该作者 查看该作者主题 7楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
cnfang 当前离线

330

主题

0

广播

0

粉丝
添加关注
级别:三年级

用户积分:2987 分
登录次数:202 次
注册时间:2007/6/2
最后登录:2013/6/25
cnfang 发表于:2009/4/16 21:41:00   | 只看该作者 查看该作者主题 8楼 
最近有很多的高人潜伏在论坛里
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
ks1w 当前离线

2796

主题

4

广播

1

粉丝
添加关注
级别:大一

用户积分:14338 分
登录次数:665 次
注册时间:2006/11/3
最后登录:2019/7/26
ks1w 发表于:2009/4/16 21:10:00   | 只看该作者 查看该作者主题 9楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
ayzsx 当前离线

873

主题

1

广播

3

粉丝
添加关注
级别:七年级

用户积分:29841 分
登录次数:941 次
注册时间:2006/11/28
最后登录:2021/9/10
ayzsx 发表于:2009/4/16 20:54:00   | 只看该作者 查看该作者主题 10楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
<上一主题 | 下一主题 >
Powered By KesionCMS Version X1
厦门科汛软件有限公司 © 2006-2016 页面执行1.69531秒 powered by KesionCMS 9.0