关于本节课的问题

来源: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回答

好帮手慕慕子

2020-02-09

同学你好,对于你的问题解答如下:

  1. 因为在此定义的局部变量,用来保存对应搜索结果的元素列表, 然后将这个结果通过return返回出去,在search-getDat方法中调用createHeaderSearchLayer方法,将结果赋值给全局作用域中的html,让代码更加易于阅读。

  2. done方法中的this指向jQuery对象,因为是在jQuery对象的ajax方法中调用,方法内部的this指向jQuery对象,所以需要在ajax方法为使用var self = this保存当前this指向Search的实例化对象。

  3. 简单理解这里的autoComplete就是一个初始化函数,输入、聚焦、点击事件都在autoComplete方法中定义的,所以将显示隐藏初始化也一并放在这里了

  4. 这里使用val方法,直接就设置了输入框的内容,不需要return返回

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

0

0 学习 · 14456 问题

查看课程