关于本节课的问题
来源:3-2 改写搜索框功能--自动完成
迷失的小麦
2020-02-09 16:25:09
1.function createHeaderSearchLayer中为什么要再定义一次var html="";?外面全局中已经定义过一次了var html=""(第二行)
2.$.ajax中的this(如:done方法中的this)需要var self=this;,不指向Search,指向了谁?为什么?
3.为什么显示隐藏的初始化this.$layer.showHide(this.options);写在autoComplete中?
4.为什么Search.prototype.setInputVal中this.$input.val(removeHTMLTags(value));不需要return?
// JavaScript Document
(function($){
function Search($elem,options){
this.$elem=$elem;
this.options=options;
this.$input=this.$elem.find('.search-inputbox');
this.$form=this.$elem.find(".search-form");
this.$layer=this.$elem.find('.search-layer');
this.$elem.on("click",".search-btn",$.proxy(this.submit,this));
if(this.options.autocomplete){this.autoComplete();}
}
Search.DEFAULTS={
autocomplete:false,
url:"https://suggest.taobao.com/sug?code=utf-8&_ksTS=1581165417160_722&callback=jsonp723&k=1&area=c2c&bucketid=15&q=",
css3:false,
js:false,
animation:"fade"
};
Search.prototype.submit=function(){
if(this.getInputVal()===""){
return false;
}
this.$form.submit();
};
Search.prototype.autoComplete=function(){
this.$input
.on("input",$.proxy(this.getData,this))
.on("focus",$.proxy(this.showLayer,this))
.on("click",function(){
return false;//阻止冒泡,否则$input得到焦点时显示的同时冒泡到document又隐藏了
});
this.$layer.showHide(this.options);
$(document).on("click",$.proxy(this.hideLayer,this));
};
Search.prototype.getData=function(){
var self=this;
$.ajax({
url:this.options.url+this.getInputVal(),
dataType:'jsonp'
}).done(function(data){
self.$elem.trigger("search-getData",[data,self.$layer]);
}).fail(function(){
self.$elem.trigger("search-noData",[self.$layer]);
});
};
Search.prototype.showLayer=function(){
if(this.$layer.children().length===0)return;
this.$layer.showHide("show");
};
Search.prototype.hideLayer=function(){
this.$layer.showHide("hide");
};
Search.prototype.getInputVal=function(){
return $.trim(this.$input.val());
};
Search.prototype.setInputVal=function(value){
this.$input.val(removeHTMLTags(value));
function removeHTMLTags(str){
return str.replace(/<(?:[^>'"]|"[^"]*"|'[^']*')*>/g,"");
}
};
$.fn.extend({
search:function(option,val){
return this.each(function(){
var $this=$(this);
var search=$this.data('search');
var canshu=$.extend({},Search.DEFAULTS,$this.data(),typeof option==='object'&&option);
//首先是默认参数,然后是data-active="menu",最后是传参数时的参数
if(!search){//如果没有值就进入if判断,添加上实例化的对象;有值的话就不会进入if判断再次实例化了
$this.data('search',search=new Search($this,canshu));
}
//var search=new Dropdown(this,canshu);添加data属性后删除
//if(typeof option === 'string')这样写不容许出错
if(typeof search[option]==='function'){
search[option](val);
}
});
}
});
})(jQuery);
var $headerSearch=$("#header-search");
var html="",
maxlength=5;
$headerSearch.on("search-getData",function(e,data,$layer){
var $this=$(this);
html=createHeaderSearchLayer(data,maxlength);
$layer.html(html);
if(html){
$this.search("showLayer");
}else{
$this.search("hideLayer");
}
}).on("search-noData",function(e,$layer){
$(this).search("hideLayer");
$layer.html("");
}).on("click",".search-layer-item",function(){
$headerSearch.search("setInputVal",$(this).html());
$headerSearch.search("submit");
});
$headerSearch.search({
autocomplete:true,
css3:false,
js:false,
animation:"fade"
});
function createHeaderSearchLayer(data,maxlength){
var dataNum=data["result"].length;
var html="";
if(dataNum===0){
//$layer.hide().html("");具体的事情外面解决
return;
}
for(var i=0;i<dataNum;i++){
if(i>maxlength)break;
html+='<li class="search-layer-item text-ellipsis">'+data["result"][i][0]+'</li>';
}
return html;
}1回答
同学你好,对于你的问题解答如下:
因为在此定义的局部变量,用来保存对应搜索结果的元素列表, 然后将这个结果通过return返回出去,在search-getDat方法中调用createHeaderSearchLayer方法,将结果赋值给全局作用域中的html,让代码更加易于阅读。
done方法中的this指向jQuery对象,因为是在jQuery对象的ajax方法中调用,方法内部的this指向jQuery对象,所以需要在ajax方法为使用var self = this保存当前this指向Search的实例化对象。
简单理解这里的autoComplete就是一个初始化函数,输入、聚焦、点击事件都在autoComplete方法中定义的,所以将显示隐藏初始化也一并放在这里了
这里使用val方法,直接就设置了输入框的内容,不需要return返回
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
相似问题