在实际的项目中,能用别人写好的插件实现相关功能是最好不过,为了节约时间成本,因为有的项目比较紧急,没充分时间让你自己来写,即便写了,你还要花大量时间调试兼容性。但是出于学习的目的,你可以利用闲暇时间,自己动手写写,看一些原生js的东西,根据自己的思路做插件,这样能提高水平。
说到autotemplete,好多人都用过,引用autotemplete.js,然后就可以实现在输入框输入值的时候提示下拉选项,类似于百度搜索框那种提示功能,下面就来说说自己的思路。
为输入框添加input事件
1.input事件兼容性代码如下:
addevt:function(ele, evt, fn) { if (document.addeventlistener) { ele.addeventlistener(evt, fn, false); } else if (document.attachevent) { ele.attachevent('on' + (evt == input ? propertychange : evt), fn); } else { ele['on' + (evt == input ? propertychange : evt)] = fn; } }
input事件和其他的事件不一样,低版本的ie不支持input事件,只能用propertychange事件,高版本的ie和w3c标准浏览器支持input事件
2.输入事件触发的时候获取数据
这里数据有两种形式,一种是直接设置的对象数组,一种是ajax请求返回数据
这时候我们需要一个ajax请求函数,这里写了一个get请求
get: function(url, paraobj, fn, timeout) { var xhr = null; try { ////兼容firefox,chrom if (window.xmlhttprequest) { xhr = new xmlhttprequest(); } //////兼容ie else if (window.activexobject) { xhr = new activexobject(msxml2.xmlhttp); } } catch (e) { //todo handle the exception xhr = new activexobject('microsoft.xmlhttp'); } xhr.onreadystatechange = function() { if (this.readystate == 4 && this.status == 200) { fn.call(this, this.responsetext); } else { settimeout(function() { xhr.abort(); }, timeout); } }; var parastr = ''; parastr += ?; for (var prop in paraobj) { parastr += prop + = + paraobj[prop] + &; } xhr.open('get', parastr != ? ? (url + parastr) : url, true); xhr.send(); }
3. ajax请求成功,且有数据的时候创建下拉框并在下拉框中追加选项 ////创建下拉div
创建下拉框代码:
createshowdiv: function() { ///如果下拉div已存在,删除掉 var parentnode = this.autoelement.parentnode || this.autoelement.parentelement; var childnodes = parentnode.childnodes; var showdiv = document.getelementbyid(this.config.showdivid); if (showdiv) { parentnode.removechild(showdiv); } //创建下拉div var div = document.createelement('div'); div.id = this.config.showdivid; //设置下拉div样式 var style = this.config.style || { width: '200px', height: 'auto', backgroundcolor: '#1c5683', cursor: 'pointer', display: 'block' };
for (var prop in style) { div.style[prop] = style[prop]; } this.showdiv = div; }
追加选项代码:
appendchild: function(data) { var self = this; var data = data; var fragment = document.createdocumentfragment(); for (var i = 0; i 0) { var config = args[0]; var gettype = object.prototype.tostring; if (config && gettype.call(config) == [object object]) { // this.config = config; this.config = config || { id: '', //控件id data: [], //数据 textfiled: '', //显示的文字的属性名 valuefiled: '', //获取value的属性名 style: {}, //显示的下拉div的样式设置 url: '', //ajax请求的url paraname:'name',//ajax请求的参数 select: function() {}, //选择选项时触发的事件, showdivid: '' //下拉选择区域的id }; } } }, render: function() { var self = this; if (self.config) { var autoelement = document.getelementbyid(self.config.id); this.autoelement = autoelement; if (autoelement) { self.util.addevt(this.autoelement, 'input', function() { try { if (autoelement.value) { ////ajax请求获取数据的方式 if (self.config.url && !self.config.data) { var paraobj = {}; paraobj[self.config.paraname] = autoelement.value; self.util.get(self.config.url, paraobj, function (data) { self.createshowdiv(); self.appendchild(eval('(' + data + ')')); }, 10000); } ////直接设置对象数组的形式 else if (!self.config.url && self.config.data) { self.createshowdiv(); self.appendchild(self.config.data); } } else { self.closediv(); } } catch (e) { //todo handle the exception alert(e); } }); } } }, ////创建下拉div createshowdiv: function() { ///如果下拉div已存在,删除掉 var parentnode = this.autoelement.parentnode || this.autoelement.parentelement; var childnodes = parentnode.childnodes; var showdiv = document.getelementbyid(this.config.showdivid); if (showdiv) { parentnode.removechild(showdiv); } //创建下拉div var div = document.createelement('div'); div.id = this.config.showdivid; //设置下拉div样式 var style = this.config.style || { width: '200px', height: 'auto', backgroundcolor: '#1c5683', cursor: 'pointer', display: 'block' }; for (var prop in style) { div.style[prop] = style[prop]; } this.showdiv = div; }, ///在下拉div里面追加显示项 appendchild: function(data) { var self = this; var data = data; var fragment = document.createdocumentfragment(); for (var i = 0; i p.name.contains(name)).tolist(); } return json(list,jsonrequestbehavior.allowget);}
现在基本的功能实现和调用讲完了,从开始到最后的过程是比较麻烦的,每个方法都是一步步实现,没有引用其他的库,要考虑到各个浏览器的兼容性。
以上就是本文的全部内容,希望对大家的学习有所帮助。