jQuery实现搜索框插件+豆瓣音乐接口实现豆瓣搜索框
- jQuery实现搜索框插件
- 豆瓣音乐接口实现豆瓣搜索框
豆瓣接口有时不稳定,网络请求会报400,不要惊慌。我主要是练习一下jQuery的JSONP和封装插件。
<div class="searchWrapper"> </div>
<script src="../js/searchBox.js"></script>
<script>
$(".searchWrapper").search({
placeholder:'唱片名、表演者、条码、ISRC',
url:'https://api.douban.com/v2/music/search',
type:'GET',
dataType:'jsonp',
sucFn:callbackObj.doubanCa,
// data:'tag=',
data:'q=',
count:'&count=7',
errFn:function(){
console.log('error');
}
});
//如果鼠标点击了除搜索框以外的地方,就隐藏下拉列表
$(document).on("mousedown",function(e){
var event = e || window.event;
var target = event.target;
if(target != $('.searchText')[0] && $(target).parents(".searchList")){
$('.searchList').hide();
}
});
formObj.doubanForm();
</script>
css代码参考就好:
/*
* 样式没有做分类处理采用注释提示
* 建议不修改项:表示保留插件样式风格
* 建议保留项:表示会影响插件样式结构,不能随意修改
*/
*{
padding: 0px;
margin: 0px;
list-style: none;
}
.searchBox{
border: none;/*建议不修改项*/
width: 460px;
height: 30px;
margin-top: 15px;
border-top-left-radius: 5px;/*建议不修改项*/
border-bottom-left-radius: 5px;/*建议不修改项*/
border-top-right-radius: 5px;/*建议不修改项*/
border-bottom-right-radius: 5px;/*建议不修改项*/
border-bottom: 1px solid #bbb;/*建议不修改项*/
overflow: hidden;/*建议不修改项
}
.searchBox::after{/*建议保留项*/
content: "";
clear: both;
display: block;
}
.searchBox .searchText{
float: left;/*建议保留项*/
padding-left: 5px;
width: 415px;
height: 30px;
line-height: 30px;
font-size: 13px;
outline: none;/*建议不修改项*/
border-style: none;/*建议不修改项*/ }
.searchBox .searchButton{
display: block;
width: 40px;
height: 30px;
outline: none;
border-style: none;/*建议不修改项*/
position: relative;
z-index:;
opacity:;
}
.searchList{
position: absolute;/*建议保留项*/
/* display: none; */
width: 425px;
border-left: 1px solid #87CEEB;
border-right: 1px solid #87CEEB;
}
.searchList li{
width: 420px;
padding-left: 5px;
padding-top: 5px;
padding-bottom: 5px;
border-bottom: 1px solid #87CEEB;
background-color: #fff;
}
.searchList li:hover{
background-color: #f0f3ef;
}
.searchList li a{
display: block;
width: 100%;
height: 100%;
}
.searchList li a::after{
content: "";
clear: both;
display: block;
}
.searchList li::after{
content: "";
clear: both;
display: block;
}
.searchList img,div{
float: left;
width: 48px;
}
.searchList img{
float: left;
width: 48px;
}
.searchList div{
float: left;
width: 372px;
}
.searchList em{
padding-left: 5px;
font-size: 14px;
font-style: normal;
color: #ff00ff;
}
.searchList span{
font-size: 12px;
color: #888;
} /* 搜索按钮图标 */
.searchBuDivf{
position: relative;
width: 40px;
height: 30px;
background-color:#bbb;/*建议不修改项*/
}
.searchBuDivf::after{
content: "";
clear: both;
display: block;
}
.searchBuDiv{
float: left;
width: 12px;
height: 12px;
position: relative;
border-radius: 100%;
border:2px solid #fff;
position: relative;
margin-top: -25px;
margin-left: 9px;
}
.searchBuDiv::after{
content: "";
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
transform: rotate(45deg);
width:8px;
height: 2px;
position: absolute;
top:13px;
left:11px;
background-color: #fff;
}
js代码:
(function($){
//搜索框插件对象
var searchBoxObj = {
init:function(options){
this.opt = options || {};//将必要的参数缓存到插件对象上,并且使用空对象避免无参数时报错
this.creatDom();//生成DOM结构
this.bindEvent();//给输入框绑定input事件
},
creatDom:function(){//生成DOM结构的方法
var htmlStr = '<form class="searchForm" action="" target="_blank" autocomplete="off">\
<fieldset class="searchBox">\
<legend></legend>\
<input type="text" name="" class="searchText">\
<div class="searchBuDivf">\
<input type="submit" name="" class="searchButton" value="" />\
<div class="searchBuDiv"></div>\
</div>\
</fieldset>\
<ul class="searchList"></ul>\
</form>';
this.opt.father.html(htmlStr);//将插件结构插入到插件容器
$('.searchText').attr("placeholder",this.opt.placeholder); },
bindEvent:function(){//实现输入框input事件绑定
var self = this;
$('.searchText').on('input',function(e){
e.preventDefault();//阻止默认事件
var value = $(this).val();
self.getData(value);//发送请求,获取数据
});
},
getData:function(val){
//根据构建数据构建ajax数据请求方法
var self = this;
var opt = self.opt;
$.ajax({
type:opt.type,
url:opt.url,
dataType:opt.dataType,
jsonp:opt.jsonp,
data:opt.data + val + opt.count,
success:function(data){
opt.sucFn(data);
},
error:function(){
opt.errFn();
}
})
}
}
//在jQuery上扩展插件方法
$.fn.extend({
//options为定义插件的一些数据
search:function(options){
options.father = this || $('body');//将插件容器缓存在options上
searchBoxObj.init(options);//调用插件生成器
}
});
})(jQuery);
//
var callbackObj = {
//豆瓣音乐接口跨域请求成功的回调函数
doubanCa:function(data){
var list = data.musics;
console.log(list);
var $searchList = $('.searchList');
var str = '';
for(var i = 0; i < list.length; i++){
str += '<li>\
<a href="' + list[i].alt +'" onclick="">\
<img src="' + list[i].image + '">\
<div>\
<em>' + list[i].title + '</em>\
<span>(' + list[i].author[0].name + ')</span>\
</div>\
</a>\
</li>';
}
$searchList.html($(str));
$searchList.show();
}
}
var formObj = {
doubanForm:function(){
$('.searchForm').attr('action','https://music.douban.com/subject_search');
$('.searchText').attr('name','search_text');
}
} // <li>
// <a href="https://site.douban.com/adele/" onclick="">
// <img src="https://img3.doubanio.com/view/site/small/public/71c3285636cc0af.jpg" alt="">
// <div>
// <em>adele</em>
// <span>(音乐人)</span>
// </div>
// </a>
// </li>
// 豆瓣API 开发平台:
// https://developers.douban.com/wiki/?title=guide
// 豆瓣API V2 (测试版):
// https://developers.douban.com/wiki/?title=api_v2
// {
// placeholder:'唱片名、表演者、条码、ISRC',
// url:'https://api.douban.com/v2/music/search',
// type:'GET',
// dataType:'jsonp',
// sucFn:function(data){
// console.log(data);
// },
// data:'q=',//搜索的关键字
// count:'&count=7',//搜索数据的条数
// errFn:function(){
// console.log('error');
// }
// } //百度search(options)中的options参数
// {
// placeholder:'请输入关键字',
// url:'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',
// type:'GET',
// dataType:'jsonp',
// sucFn:function(data){
// console.log(data);
// },
// data:'wd=',
// jsonp:'cb',
// count:'',
// errFn:function(){
// console.log('error');
// }
// }
jQuery实现搜索框插件+豆瓣音乐接口实现豆瓣搜索框的更多相关文章
- jQuery打造智能提示插件二(可编辑下拉框)
在上一篇 jQuery打造智能提示插件 上改进,增加下拉按钮,修复点击下拉区域外不隐藏BUG 效果 下拉按钮素材: js封装,注意红色部分为BUG修复,然后传入boxwidth不带px: /* /// ...
- 弹出框插件layer使用
layer是一款近年来备受青睐的web弹层组件,她具备全方位的解决方案,致力于服务各水平段的开发人员,您的页面会轻松地拥有丰富友好的操作体验. 插件官方地址:http://layer.layui.co ...
- Dropdown.js基于jQuery开发的轻量级下拉框插件
Dropdown.js 前言 在SPA(Single Page Application)盛行的时代,jQuery插件的轮子正在减少,由于我厂有需求而开发了这个插件.如果觉得本文对您有帮助,请给个赞,以 ...
- 非常强大的jQuery万能浮动框插件
支持hover, click, focus以及无事件触发:支持多达12种位置的定位,出界自动调整:支持页面元素加载,Ajax加载,下拉列表,提示层效果,tip类效果等:可自定义装载容器:内置UI不错的 ...
- jQuery自定义漂亮的下拉框插件8种效果演示
原始的下拉框不好看这里推荐一个jQuery自定义漂亮的下拉框插件8种效果演示 在线预览 下载地址 实例代码 <!DOCTYPE html> <html lang="en&q ...
- FancySelect – 更好用的 jQuery 下拉选择框插件
FancySelect 这款插件是 Web 开发中下拉框功能的一个更好的选择.FancySelect 使用方便,只要绑定页面上的任何 Select 元素,并调用就 .fancySelect() 就可以 ...
- [原]发布一个jQuery提示框插件,Github开源附主站,jquery.tooltips.js
一个简单精致的jQuery带箭头提示框插件 插件写好快一年了,和一个 弹出框插件(点击查看) 一起写的,一直没有整理出来,昨天得功夫整理并放到了github上,源码和网站均可在线看或下载. CSS中的 ...
- jQuery下拉框插件8种效果
jQuery自定义漂亮的下拉框插件8种效果 jquery美化选择器实例有:边框.下划线. 伸缩 .滑动. 覆盖. 旋转. 弹出层选择 .环形效果. 在线预览 <body class=" ...
- jquery仿alert提示框、confirm确认对话框、prompt带输入的提示框插件[附实例演示]
jquery仿alert提示框.confirm确认对话框.prompt带输入的提示框插件实例演示 第一步:引入所需要的jquery插件文件: http://www.angelweb.cn/Inc/eg ...
随机推荐
- Python 进程(一)理论部分
进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行,即正在运行的程序,是系统进行资源分配和调度的基本单位,进程是对正在运行程序的一个抽象,在早期面向进程设计的计算机结构中,进程是程 ...
- Java基础系列--07_String、StringBuffer和StringBuilder
String类 (1)字符串:字符串是常量:它们的值在创建之后不能更改,存储在堆中. 如果字符串多次赋值,其实是每次重新赋值的时候程序都先在内存中寻找已开辟的空间是否存在该值;如果 ...
- 解决CSDN需要登录才能看全文
本来今天学习遇到一些问题,在网上翻着博客,突然在csdn里就提示要登录才能看全文. 看了下页面源码博客内容已经拿到本地了,只是加了一层罩,也是挺无语的,暂时先用这种方法解决吧: (function() ...
- 【转】HTTP请求中的form data和request payload的区别
jQuery的ajax方法和post方法分别发送请求,在后台Servlet进行处理时结果是不一样的,比如用$.ajax方法发送请求时(data参数是一个JSON.stringify()处理后的字符串, ...
- 编译装php7.2 && nginx-1.14
环境准备 # cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) # uname -r 3.10.0-957.el7.x86_64 ...
- windows环境中JDK环境变量配置
一.环境准备 Windows10 jdk-9.0.1 二.下载并安装JDK 到Java的官网下载JDK安装包,地址:http://www.oracle.com/technetwork/java/jav ...
- EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?
前言 写过上一篇关于EF Core中读写分离最佳实践方式后,虽然在一定程度上改善了问题,但是在评论中有的指出更换到从数据库,那么接下来要进行插入此时又要切换到主数据库,同时有的指出是否可以进行底层无感 ...
- 菜鸟学IT之四则运算升级版
菜鸟学IT之四则运算升级版 本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213 团队代码github远程仓库的 ...
- Java Core - ‘==’和‘equals’的区别
不管是‘==’还是‘equals’,他们的比较都需要区分类型来讨论的: ‘==’ 当比较的数据类型是基本类型时,比较值是否相同 当比较的数据类型是引用类型时,不仅比较值相同还比较其所在内存地址是否相同 ...
- codeforces 792A-D
先刷前四题,剩下的有空补. 792A New Bus Route 题意:给出x 轴上的n 个点,问两个点之间的最短距离是多少,有多少个最短距离. 思路:排序后遍历. 代码: #include<s ...