454 lines
17 KiB
HTML
454 lines
17 KiB
HTML
<#def title = "输入框样式"/>
|
|
<#def keyword = "ZhiqimUI"/>
|
|
<#def desc = "输入框样式是指对输入框增加样式规则,如指定输入框长度大小、边框颜色、和输入控制等。"/>
|
|
<#def prevUrl = "../js/query.htm"/>
|
|
<#def nextUrl = "button.htm"/>
|
|
${zhiqim_com_head()}
|
|
${zhiqim_com_head_main()}
|
|
<script>
|
|
function doChange(tabnav)
|
|
{
|
|
doUpdateCode(Z(tabnav));
|
|
}
|
|
|
|
function doUpdateCode($this)
|
|
{//更新代码
|
|
var html = $this.find("section > div").htmlt();
|
|
//去除多余的cover代码
|
|
html = Z.S.replaceAll(html, /<span\sclass="z-cover((?!>).)+>/g, '');
|
|
html = Z.S.replaceAll(html, /<div\sclass="z-absolute((?!>).)+>.+span>/g, '');
|
|
$this.find("section > div").next("div > span").html(html);
|
|
}
|
|
</script>
|
|
${zhiqim_com_head_end()}
|
|
|
|
${zhiqim_com_mobileUI_scrollJs()}
|
|
${zhiqim_com_body()}
|
|
${zhiqim_com_topnav("ui")}
|
|
|
|
<!--容器开始 -->
|
|
<div id="container" class="container">
|
|
|
|
${zhiqim_com_container_ui("ZmUI", "form", "input")}
|
|
|
|
<!--主体-->
|
|
<div id="mainbody" class="mainbody">
|
|
|
|
${zhiqim_com_breadcrumb("UI", "ZmUI", "表单", "输入框")}
|
|
|
|
<!-- content开始 -->
|
|
<div id="mobileUI_content" class="content">
|
|
|
|
<!-- 左侧详情 -->
|
|
<div class="mobileUI-left">
|
|
|
|
<#-- 标题 -->
|
|
<div class="z-relative-left z-w100p z-pd16 z-bg-blue z-px18 z-lh200p z-bold" style="border-left:5px solid #4bacc6">
|
|
<p class="z-text-blue">自动提示关键字:</p>
|
|
<p class="z-color-333" style="text-indent:38px;">
|
|
输入内容,匹配数据库显示可选项;支持键盘“上”、“下”键选择,鼠标、“回车”选中
|
|
</p>
|
|
</div>
|
|
|
|
<#-- 一、自动提示关键字 -->
|
|
<div class="tutorial title">一、纯文本框,不显示历史记录、显示高度为5条选框高度</div>
|
|
<div class="z-tabnav z-bordered" data-role="z-tabnav" onchange="doChange(this);">
|
|
<nav>
|
|
<ul class="zi-float-left">
|
|
<li class="z-active">示例</li>
|
|
<li>代码</li>
|
|
<li>说明</li>
|
|
</ul>
|
|
</nav>
|
|
<section style="min-height:150px;">
|
|
<div class="z-active z-pd10 z-px16" style="min-height:200px;"><script>
|
|
Z.onload(function()
|
|
{
|
|
var searchAutoList = new Z.SearchAutoList({
|
|
id: "auto_input", //输入框 id
|
|
ajaxClassName: "com.zhiqim.zhiqim.ui.SearchInputAjaxList", //ajax调用的类名
|
|
ajaxMethodName: "getKeywordsList", //ajax调用的方法名
|
|
history: 0, //可选项;是否显示历史记录,默认为 “1” 显示
|
|
listMax: 5, //可选项;结果列表的显示高度,默认为 “10”
|
|
splitType: ";", //可选项;返回值中的分隔符,默认为 “;”
|
|
callback: null //可选项;选中后的回调函数,默认为 null,this 为定义的 Z.SearchAutoList 对象
|
|
});
|
|
});
|
|
</script>
|
|
<input id="auto_input" class="z-input z-large z-w300" type="text">
|
|
</div>
|
|
<div class="z-relative-left z-w100p z-pd10">
|
|
<span class="z-text-prewrap z-pre"></span>
|
|
</div>
|
|
|
|
<div class="z-pd10 z-px16 z-lh200p">
|
|
1、前三个参数为必填项,缺一不可<br>
|
|
2、Ajax的回调结果为字符串型,字符的分隔符号由类方法决定<br>
|
|
3、splitType 为可选项,默认值为 “;”,字符的分隔符号不为 “;” 时需要定义<br>
|
|
</div>
|
|
</section>
|
|
<div class="tutorial title">二、带按钮的搜索框,显示历史记录,显示高度为10条选项高度</div>
|
|
<div class="z-tabnav z-bordered" data-role="z-tabnav" onchange="doChange(this);">
|
|
<nav>
|
|
<ul class="zi-float-left">
|
|
<li class="z-active">示例</li>
|
|
<li>代码</li>
|
|
<li>说明</li>
|
|
</ul>
|
|
</nav>
|
|
<section style="min-height:150px;">
|
|
<div class="z-active z-pd10 z-px16" style="min-height:200px;"><script>
|
|
Z.onload(function()
|
|
{
|
|
var searchAutoList2 = new Z.SearchAutoList({
|
|
id: "auto_wrap", //盒子 id
|
|
ajaxClassName: "com.zhiqim.zhiqim.ui.SearchInputAjaxList", //ajax调用的类名
|
|
ajaxMethodName: "getKeywordsList", //ajax调用的方法名
|
|
callback: function(){ //可选项;选中后的回调函数,默认为 null,this 为定义的 Z.SearchAutoList 对象
|
|
alert("输入结果: " + this.value);
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
<span id="auto_wrap" class="z-show-ib">
|
|
<input id="auto_input2" class="z-input z-large z-w300" type="text"><button class="z-button z-mg-l-1" style="height:34px" type="submit">搜索</button>
|
|
</span>
|
|
</div>
|
|
<div class="z-relative-left z-w100p z-pd10">
|
|
<span class="z-text-prewrap z-pre"></span>
|
|
</div>
|
|
|
|
<div class="z-pd10 z-px16 z-lh200p">
|
|
1、前三个参数为必填项,缺一不可<br>
|
|
2、Ajax的回调结果为字符串型,字符的分隔符号由类方法决定<br>
|
|
3、splitType 为可选项,默认值为 “;”,字符的分隔符号不为 “;” 时需要定义<br>
|
|
4、callback 为可选项,表示选中后需要做的操作,默认值为 “null”,this 为定义的 Z.SearchAutoList 本身<br>
|
|
5、callback 函数中可用到的值:this.value 为输入框内容,this.responseText 为返回的搜索结果字符串
|
|
</div>
|
|
</section>
|
|
</div>
|
|
|
|
<!-- 右侧demo ZmUI代码 -->
|
|
${zhiqim_turorial_ZmUI_demo_start()}
|
|
<div class="z-bar-top">
|
|
<a href="#" class="z-left"><i class="z-font z-rem18 z-arrowhead-left"></i></a>
|
|
<div class="z-title">ZhiqimUI.mobile</div>
|
|
</div>
|
|
<div class="z-bar-bottom">
|
|
<a href="#" class="z-direction-column z-active"><i class="z-font z-apps"></i><span class="z-mg-t3">文案</span></a>
|
|
<a href="#" class="z-direction-column"><i class="z-font z-apps"></i><span class="z-mg-t3">文案</span></a>
|
|
<a href="#" class="z-direction-column"><i class="z-font z-apps"></i><span class="z-mg-t3">文案</span></a>
|
|
<a href="#" class="z-direction-column"><i class="z-font z-apps"></i><span class="z-mg-t3">文案</span></a>
|
|
</div>
|
|
<div class="z-container">
|
|
<div class="z-flexBox-list z-h100p"><div class="z-rem30 z-text-center">这里是内容</div></div>
|
|
</div>
|
|
${zhiqim_turorial_ZmUI_demo_end()}
|
|
|
|
<!-- content结束 -->
|
|
</div>
|
|
|
|
${zhiqim_com_chapter()}
|
|
<!-- 主体结束 -->
|
|
</div>
|
|
|
|
<!-- 容器结束 -->
|
|
</div>
|
|
|
|
${zhiqim_com_footer()}
|
|
|
|
<script>
|
|
+(function(F)
|
|
{
|
|
Z.SearchAutoList = Z.Class.newInstance();
|
|
Z.SearchAutoList.prototype =
|
|
{
|
|
defaults:
|
|
{
|
|
id: null, //输入框/输入框盒子ID
|
|
ajaxClassName: null, //Ajax调用的类名
|
|
ajaxMethodName: null, //Ajax调用的类方法
|
|
history: 1, //历史记录显示
|
|
listMax: 10, //结果列表显示高度
|
|
splitType: ";", //类方法返回的字符串结果中的分隔符
|
|
callback: null //选中后的回调函数
|
|
},
|
|
|
|
init: function()
|
|
{//构造函数
|
|
if (!this.id || !Z.D.has(this.id)){
|
|
Z.alert("指定[id]出错");
|
|
}
|
|
this.responseText = "";
|
|
this.$wrap = Z("#"+this.id);
|
|
this.$input = this.$wrap;
|
|
if (this.$wrap[0].tagName.toUpperCase() != "INPUT")
|
|
this.$input = this.$wrap.find("input[type=text]");
|
|
|
|
var width = this.$wrap.offsetWidth();
|
|
var height = this.$wrap.offsetHeight();
|
|
var fontSize = this.$input.css("fontSize");
|
|
this.pdLeft = this.$input.css("padding-left");
|
|
this.pdRight = this.$input.css("padding-right");
|
|
this.lHeight = this.$input.css("line-height");
|
|
this.mHeight = this.listMax * parseInt(this.lHeight) + "px";
|
|
|
|
this.$cover = Z.$cover(this.$wrap).css({display:"inline-block",position:"relative",width:width,height:height,fontSize:fontSize});
|
|
this.$list = Z('<div class="z-absolute z-w100p z-mg-t-1 z-bg-white z-text-left z-bd z-hide" style="left:0;top:100%;font-size:inherit;z-index:99;"></div>')
|
|
.appendTo(this.$cover);
|
|
|
|
//事件绑定
|
|
this.$input.on("focus",this.focus,this);
|
|
this.$input.on("input",this.input,this);
|
|
this.$input.keydown(this.doKeyDown,this);
|
|
Z(document).click(this.docClick,this);
|
|
},
|
|
|
|
execute: function()
|
|
{//执行为空即可,统一在初始化中处理
|
|
},
|
|
|
|
//获取焦点事件
|
|
focus: function(e)
|
|
{
|
|
this.value = this.$input.val();
|
|
if (this.value == "")
|
|
return this.doHistoryList();
|
|
if (this.$list.find('li').length == 0)
|
|
return;
|
|
this.$list.show();
|
|
if (this.beforeValue != this.value)
|
|
{//无修改时,获取焦点,不调用Ajax
|
|
this.doAjax();
|
|
this.beforeValue = this.value;
|
|
}
|
|
},
|
|
|
|
//input事件
|
|
input: function(e)
|
|
{
|
|
this.value = this.$input.val();
|
|
if (Z.V.isEmptyBlank(this.value))
|
|
return this.doHistoryList();
|
|
this.$list.show();
|
|
this.doAjax();
|
|
},
|
|
|
|
doAjax: function(e)
|
|
{
|
|
this.ajax = new Z.Ajax();
|
|
this.ajax.OBJ = this;
|
|
this.ajax.setClassName(this.ajaxClassName);
|
|
this.ajax.setMethodName(this.ajaxMethodName);
|
|
this.ajax.addParam(this.value);
|
|
this.ajax.setCallback(function(){
|
|
this.OBJ.doFilter.call(this.OBJ,this.responseText);
|
|
});
|
|
this.ajax.execute();
|
|
},
|
|
|
|
//筛选对象,生成列表
|
|
doFilter: function(e)
|
|
{
|
|
var responseText = e;
|
|
this.$list.html("");
|
|
var keyWordsArr = responseText.split(this.splitType);
|
|
var htmlStr = '<ul class="z-overflow-auto" style="max-height:' + this.mHeight + '">';
|
|
for (var i = 0;i < keyWordsArr.length;i++)
|
|
{
|
|
if (keyWordsArr[i].indexOf(this.value) > -1)
|
|
htmlStr += '<li style="padding: 0 ' + this.pdRight + ' 0 ' + this.pdLeft +'; line-height:'+ this.lHeight +'; cursor: default;">'
|
|
+ keyWordsArr[i] + "</li>";
|
|
}
|
|
htmlStr += "</ul>";
|
|
Z(htmlStr).appendTo(this.$list);
|
|
if (Z(htmlStr).html() == "")
|
|
return this.$list.hide();
|
|
|
|
//绑定事件
|
|
this.liSet = this.$list.find("li");
|
|
this.liSet.click(this.doSelect,this);
|
|
this.liSet.mouseenter(this.liMouseEnter,this);
|
|
this.liSet.mouseleave(this.liMouseLeave,this);
|
|
},
|
|
|
|
//鼠标选中
|
|
doSelect: function(e)
|
|
{
|
|
Z.E.forbidden(e);
|
|
var liVal = Z(Z.E.target(e)).html();
|
|
this.beforeValue = this.value;
|
|
this.value = liVal;
|
|
this.$input.val(liVal);
|
|
this.$list.hide();
|
|
this.doAjax();
|
|
//历史记录存储
|
|
this.saveHistory(e);
|
|
//选中后的回调
|
|
this.doCallback(e);
|
|
},
|
|
|
|
//空白处点击,隐藏列表
|
|
docClick: function(e)
|
|
{
|
|
var target = Z.E.target(e);
|
|
if (target == this.$input[0])
|
|
return;
|
|
this.$list.hide();
|
|
if (Z.V.isEmptyBlank(this.value))
|
|
return;
|
|
if (this.beforeValue != this.value)
|
|
{//解决多次调用Ajax的问题
|
|
this.doAjax();
|
|
this.beforeValue = this.value;
|
|
//历史记录存储
|
|
this.saveHistory(e);
|
|
}
|
|
},
|
|
|
|
//键盘 “上” “下” “回车”按键监听
|
|
doKeyDown: function(e)
|
|
{
|
|
var keyVal = Z.E.key(e);
|
|
if (keyVal == 38 || keyVal == 40 || keyVal == 13)
|
|
{//上:38,下:40,回车:13
|
|
Z.E.forbidden(e);
|
|
if (this.liSet)
|
|
{//有选择列表的搜索框
|
|
var liSetLength = this.liSet.length;
|
|
var liActive = this.$list.find(".z-bg-gray");
|
|
var liActiveIndex = -1;
|
|
var toIndex = null;
|
|
if (liActive.length != 0)
|
|
liActiveIndex = Z.EL.parentIndex(liActive[0]);
|
|
switch (keyVal)
|
|
{
|
|
case 38://上
|
|
toIndex = liActiveIndex - 1;
|
|
if (toIndex <= -1)
|
|
toIndex = liSetLength - 1;
|
|
break;
|
|
case 40://下
|
|
toIndex = liActiveIndex + 1;
|
|
if (toIndex == liSetLength)
|
|
toIndex = 0;
|
|
break;
|
|
case 13://回车选中
|
|
this.$input[0].blur();
|
|
this.$list.hide();
|
|
this.value = this.$input.val();
|
|
this.doAjax();
|
|
//历史记录存储
|
|
this.saveHistory(e);
|
|
//选中后的回调
|
|
this.doCallback(e);
|
|
return;
|
|
}
|
|
toIndex++;
|
|
this.liSet.removeClass("z-bg-gray");
|
|
var toLi = this.$list.find("li:nth-child(" + toIndex +")").addClass("z-bg-gray");
|
|
this.value = toLi.html();
|
|
this.$input.val(toLi.html());
|
|
}
|
|
else if (keyVal == 13)
|
|
{//直接在输入框回车搜索
|
|
this.value = this.$input.val();
|
|
this.doAjax();
|
|
//历史记录存储
|
|
this.saveHistory(e);
|
|
//选中后的回调
|
|
this.doCallback(e);
|
|
}
|
|
}
|
|
},
|
|
|
|
//选中后的回掉函数
|
|
doCallback: function(e)
|
|
{
|
|
if(!this.callback)
|
|
return;
|
|
this.callback(e);
|
|
},
|
|
|
|
//历史记录列表展示
|
|
doHistoryList: function(e)
|
|
{
|
|
if (!this.history) return;
|
|
this.$list.html("").hide();
|
|
if (localStorage.getItem(this.id))
|
|
{
|
|
var htmlStr = '<ul class="z-text-gray">';
|
|
var hisArr = localStorage.getItem(this.id).split(";");
|
|
for (var i = 0;i < hisArr.length;i++)
|
|
{
|
|
htmlStr += '<li style="padding:0 ' + this.pdRight + ' 0 ' + this.pdLeft +';line-height:'+ this.lHeight +';cursor:default;">'
|
|
+ hisArr[i] + "</li>";
|
|
}
|
|
htmlStr += "</ul>";
|
|
Z(htmlStr).appendTo(this.$list.show());
|
|
var hisBar = '<div class="z-bg-blue z-clearfix" style="padding:0 ' + this.pdRight + ' 0 ' + this.pdLeft +';line-height:'+ this.lHeight +';cursor:default;">'
|
|
+ '<span class="z-float-right z-pointer z-deleteBtn">清空历史</span>'
|
|
+ '</div>';
|
|
Z(hisBar).appendTo(this.$list.show());
|
|
//绑定事件
|
|
this.liSet = this.$list.find("li");
|
|
this.liSet.click(this.doSelect,this);
|
|
this.liSet.mouseenter(this.liMouseEnter,this);
|
|
this.liSet.mouseleave(this.liMouseLeave,this);
|
|
//绑定删除事件
|
|
var $delBtn = this.$list.find(".z-deleteBtn");
|
|
$delBtn.click(this.emptyHistory,this);
|
|
}
|
|
},
|
|
|
|
emptyHistory: function(e)
|
|
{
|
|
localStorage.removeItem(this.id);
|
|
},
|
|
|
|
//输入完成,存储历史记录
|
|
saveHistory: function(e)
|
|
{
|
|
if (!this.history) return;
|
|
if (!localStorage.getItem(this.id))
|
|
localStorage.setItem(this.id,"");
|
|
var hisStr = localStorage.getItem(this.id);
|
|
if (hisStr == "")
|
|
return localStorage.setItem(this.id,this.value);
|
|
//去重
|
|
var hisArr = hisStr.split(";");
|
|
hisArr.unshift(this.value);
|
|
var hisObj = {};
|
|
var resultArr = [];
|
|
for(var i = 0; i < hisArr.length; i++)
|
|
{
|
|
if(!hisObj[hisArr[i]])
|
|
{
|
|
resultArr.push(hisArr[i]);
|
|
hisObj[hisArr[i]] = 1;
|
|
}
|
|
}
|
|
//限制个数
|
|
if (resultArr.length > 10)
|
|
resultArr.length = 10;
|
|
hisStr = resultArr.join(";");
|
|
localStorage.setItem(this.id,hisStr);
|
|
},
|
|
|
|
//鼠标悬浮,背景颜色变化
|
|
liMouseEnter: function(e)
|
|
{
|
|
var $thisLi = Z(Z.E.target(e));
|
|
$thisLi.addClass("z-bg-gray");
|
|
},
|
|
|
|
liMouseLeave: function(e)
|
|
{
|
|
var $thisLi = Z(Z.E.target(e));
|
|
$thisLi.removeClass("z-bg-gray");
|
|
},
|
|
}
|
|
}
|
|
)(zhiqim)
|
|
</script>
|