本文介绍如何使用纯JavaScript实现类似百度学术的高级检索功能。通过动态生成弹窗HTML、拼接查询字符串以及利用隐藏表单提交数据,无需jQuery即可完成条件切换与后台交互。
高级检索功能概述
百度学术的高级检索功能是通过在前端生成特定的内部语法字符串,再传递给后端进行解析实现的。前端可以通过JavaScript进行字符串拼接,将用户输入的条件组合后发送给后台,这一过程的实现难度适中。
纯JS核心代码实现
以下是高级检索核心功能的代码示例。本例采用纯JavaScript编写,未依赖jQuery库。
<p class="fl srh-btn">
<input type="submit" class="srh-submit" style="height:px" value="高级搜索" id="highSearchObj"/>
</p>
//省略部分调用关系
this.highSearch = function () {
document.getElementById('highSearchObj').disabled=true;
var highSearchHtml = '<div class="highSearch" style="display:block"><div class="highMsg"><ul> \
<li><span id="tabReg" class="tab">包含关键词</span><input id="kywds" value=""></li> \
<li><span id="tabReg" class="tab">不包含关键词</span><input id="nokywds" value=""></li>\
<li><span id="tabReg" class="tab">检索范围</span>\
<select id="st">\
<option value ="byrw">本院认为</option>\
<option value ="sljg">审理经过</option>\
<option value="ygsc">原告诉称</option>\
<option value="bgbc">被告辩称</option>\
</select></li>\
</ul>\
<input id="conditionObj" type="submit" value="新增一组条件"></input>\
<hr>\
<div class="fit">\
<select id="type">\
<option value ="all">全部</option>\
<option value ="pj">判决</option>\
<option value ="cd">裁定</option>\
<option value="tz">通知</option>\
<option value="jd">决定</option>\
<option value="tj">调解</option>\
</select><select id="round">\
<option value ="all">全部</option>\
<option value ="one">一审</option>\
<option value ="two">二审</option>\
<option value="again">再审</option>\
</select>\
<input id="bg" value="">-<input id="end" value="">\
<ul><li><span id="tabReg" class="tab">案由</span><input id="ay" value=""></input></li>\
<li><span id="tabReg" class="tab">法院</span><input id="fy" value=""></input></li>\
</ul></div>\
<ul id="sql"></ul>\
<input id="submitHighSearchObj" type="submit" value="提交高级搜索"></input>\
</div></div>';
this.highSearchObj = $(highSearchHtml);
$("body").append(this.highSearchObj);
$("#conditionObj").click(function(){
var kywds="\""+document.getElementById("kywds").value.split(" ").join("\"&\"")+"\"";
var st=document.getElementById("st").value;
var nokywds="\""+document.getElementById("nokywds").value.split(" ").join("\"|\"")+"\"";
var sql="<li name=\"highTag\">@("+st+")("+kywds+"-"+nokywds+")</li>";
$("#sql").append(sql);
})
$("#submitHighSearchObj").click(function(){
var highTags=document.getElementsByName("highTag");
var tags="";
var filters="";
var round=document.getElementById("round").value;
var type=document.getElementById("type").value;
var reason=document.getElementById("ay").value.split(" ").join(",");
var court=document.getElementById("fy").value.split(" ").join(",");
var begin=document.getElementById("bg").value;
var end=document.getElementById("end").value;
if(highTags.length==){
var kywds="\""+document.getElementById("kywds").value.split(" ").join("\"&\"")+"\"";
var st=document.getElementById("st").value;
var nokywds="\""+document.getElementById("nokywds").value.split(" ").join("\"|\"")+"\"";
tags="@("+st+")("+kywds+"-"+nokywds+")";
} else {
for(i=;i<highTags.length;i++){
tags+=highTags[i].innerHTML;
}
}
if(round !="all") {
filters+=" round:"+round+";";
}
if(type !="all") {
filters+=" type:"+type+";";
}
if(reason !="") {
filters+=" reason:"+reason+";";
}
if(court !="") {
filters+=" court:"+court+";";
}
if(begin !="" && end !="") {
filters+=" year:";
while(begin<=end) {
filters=filters+begin+",";
begin++;
}
}
if(filters !="") {
tags="magic:"+tags+";filter:"+filters;
}
var formObj = $('<form id="form" action="/search" target="_self" method="get"></form>');
var html = ['<input type="hidden" name="type" value="">'];
html.push('<input type="hidden" name="keyword" value="' + encodeURIComponent(tags) + '">');
html.push('<input type="hidden" name="TypeKey" value="' + encodeURIComponent(tags) +'">');
formObj.html(html.join(","));
$("body").append(formObj);
formObj.submit();
});
// $("#ay").keyup(function(e){
// });
}
代码第3行至第36行主要包含用于展示高级检索弹窗的HTML结构代码。
第37和第38行展示了JavaScript中一种常见的动态修改页面元素的方法。
第39行和第46行分别处理新增代码的动作逻辑,主要用于提交用户设定的条件及其子条件。
在第46行的函数内部,执行了对查询字符串的拼接处理,以构建完整的检索参数。
第88行至第96行实现了通过隐藏表单提交查询条件的机制,结合了JavaScript与HTML进行调用。
检索条件切换逻辑
在基于jQuery或纯JS实现高级条件检索功能时,检索条件的切换逻辑是关键部分。
其基本实现思路如下:
1. HTML结构部分:
使用表格展示所有检索条件,利用input控件展示每个具体的检索项。同时定义两种CSS类样式,用于区分检索条件的选中与未选中状态。
2. JavaScript实现部分:
为未选中的input元素绑定点击事件。通过切换样式类来实现选中状态的变更,具体代码实现如下:
function (event) {//event为点击事件
$(event.target).parent().find( '.条件input-selected' ).toggleClass('条件input-selected' ).toggleClass( '条件input-default');
$(event.target).toggleClass( '条件input-selected' ).toggleClass('条件input-default' );
},
至此,便实现了所有检索条件的自动切换功能。