純js代碼生成可搜索選擇下拉列表

来源:https://www.cnblogs.com/yangqianlong/archive/2018/01/10/8260673.html
-Advertisement-
Play Games

1、因為動態的css樓主寫不出來,因此需要引入layui中的css樣式:<link rel="stylesheet" href="${ctxStatic}/layui/css/layui.css">; 2、需要引入jquery-1.8.3.js版本的jquery 話不多說,代碼實現如下: ...


1、因為動態的css樓主寫不出來,因此需要引入layui中的css樣式:<link rel="stylesheet" href="${ctxStatic}/layui/css/layui.css">;

2、需要引入jquery-1.8.3.js版本的jquery

話不多說,代碼實現如下:

var selectData={};//下拉列表總數據
/**
* 下拉搜索,多選擇等
*/
$.fn.selectDataFun=function (json) {
selectData[$(this).attr("id")]={thisDom:null,initData:null,jsonData:null,htmlText:null,
isShow:true,selectElements:true,overStat:true,checkedElementIds:''};
thisSelectFun($(this)).thisDom=$(this);//設置索引為id,值為本身對象
thisSelectFun($(this)).initData=json;//初始數據為json
/* var isShow=true;//是否顯示
var selectElements;//選擇的選項
var overStat=true;//滑鼠經過的狀態
var checkedElementIds='';//選中項的id*/
//根據欄位生成html代碼
setFieldTypeFun($(this));
//請求後臺數據
getSelectDataFun($(this));
//生成下拉列表
thisSelectFun($(this)).htmlText = createSelectFun($(this));//htmlText為緩存的html代碼
//調用總方法
callMethodFun($(this));
}

//根據對象id值獲取對象數據
function thisSelectFun(thisD) {
if(thisD.attr("id")==''){
alert("id值為空");
return null;
}
return selectData[thisD.attr("id")]
}

//根據對象欄位生成html代碼
function setFieldTypeFun(thisD){
var thisId=thisD.attr("id");
var fields = selectData[thisId].initData;//以id獲取該對象的所有數據
//生成html代碼
var title=fields.title;
var inputId=fields.inputId;
var selectHtml='<div class="layui-form-select">'+'<div class="layui-select-title">'+
'<input type="hidden" id="'+inputId+'" name="'+inputId+'" />'+
'<span>'+title+':</span>'+'&nbsp;'+'<input id="'+thisD.attr("id")+'Search" value="" hiddenValue="" class="form-control input-sm" type="text">'+
'<i class="layui-edge"></i>'+'</div>'+'<dl class="layui-anim layui-anim-upbit" id="'+thisD.attr("id")+'dl" style=""></dl>'+
'</div>';
thisD.append(selectHtml);
}

//請求後臺數據
function getSelectDataFun(thisD) {
var fields = selectData[thisD.attr("id")].initData;//以id獲取該對象的所有數據
//判斷數據ajaxUrl中是否含有url欄位
if(fields.ajaxUrl.hasOwnProperty('url')){
//以請求路徑為url請求後臺數據,並賦值給jsonData
thisSelectFun(thisD).jsonData=ajaxFunss(fields.ajaxUrl);
}else {
if($.isEmptyObject(thisSelectFun(thisD).jsonData)){
thisSelectFun(thisD).jsonData={ code: 0, msg: "獲取成功", count: 0,data:new Array()};
}
}
}

//請求後臺數據
function ajaxFunss(json) {
json['async']=false;
json['dataType']='json';
json['type']='post';
var layerLoadIndex = layer.load(1); //換了種風格
var resultData=$.ajax(json);//發送請求
layer.close(layerLoadIndex);
if(resultData.status==200){//請求後臺數據成功
return resultData.responseJSON;
}else {
return null;
}
}

//生成下拉列表
function createSelectFun(thisD) {
var json=thisSelectFun(thisD).jsonData;
var html='';
for(var n in json){
html+='<dd lay-value="'+json[n].id+'" class="">'+json[n].name+'</dd>';
}
var id=thisD.attr("id")+'dl';
$("#"+id).append(html);
return html;
}

//調用總方法
function callMethodFun(thisD) {
var iDom=thisD.find(".layui-edge").eq(0);//i元素,eq為等於的意思
var divDom = thisD.find(".layui-form-select").eq(0);//下拉列表所在的div
/* var isShow = thisSelectFun(thisD).isShow;//是否顯示
var selectElement = thisSelectFun(thisD).selectElements;//選中的選項
var overStat = thisSelectFun(thisD).overStat;//滑鼠經過和離開狀態
var checkedElementIds = thisSelectFun(thisD).checkedElementIds;//隱藏輸入框的value值*/

//小三角符號綁定點擊方法
iDom.click(function () {
if(thisSelectFun(thisD).isShow){
thisSelectFun(thisD).isShow=false;
divDom.addClass("layui-form-selected");//顯示下拉列表
}else {
thisSelectFun(thisD).isShow=true;
divDom.attr("class","layui-form-select");//隱藏下拉列表
}
});

//dl元素綁定點擊方法
var dlDom=thisD.find("dl").eq(0);
var searchId = thisD.attr("id")+'Search';//搜索框id
dlDom.on("click",'dd',function () {
if(thisSelectFun(thisD).initData.selectType) {
//多選
if (thisSelectFun(thisD).selectElements) {
thisSelectFun(thisD).selectElements = false;
$(this).addClass("layui-this");//設置勾選狀態
var text = $("#" + searchId).val();//輸入框的內容
var selectText = $(this).text() + ",";//選擇的選項
var checkedId = $(this).attr("lay-value") + ",";//獲取選項的id
if (text.indexOf(selectText) != -1) {//判斷輸入框中的內容是否包含有所選的選項
return;
}
thisSelectFun(thisD).checkedElementIds += checkedId;
$("#" + searchId).val(text + selectText);
} else {
thisSelectFun(thisD).selectElements = true;
$(this).attr("class", "");//清空勾選狀態
var val = $(this).text() + ",";//勾選的選項
var checkedId = $(this).attr("lay-value") + ',';//獲取選項的id
var text = $("#" + searchId).val().replace(val, "");//清除勾選的選項
$("#" + searchId).val(text);//設置
thisSelectFun(thisD).checkedElementIds = thisSelectFun(thisD).checkedElementIds.replace(checkedId, "");//清除勾選的選項
}
}else {
//單選
//獲取已經選中的選項,並清除
var ddDom=thisD.find(".layui-this").eq(0);
ddDom.attr("class","");//清除
$(this).addClass("layui-this");//設置勾選狀態
var selectText = $(this).text();//選擇的選項
var checkedId = $(this).attr("lay-value");//獲取選項的id
thisSelectFun(thisD).checkedElementIds = checkedId;
$("#" + searchId).val(selectText);
divDom.attr("class","layui-form-select");//隱藏下拉列表
}
var hiddenId=selectData[thisD.attr("id")].initData.inputId;//隱藏輸入框id
$("#"+hiddenId).val(thisSelectFun(thisD).checkedElementIds.substring(0,thisSelectFun(thisD).checkedElementIds.length-1));
})

//滑鼠經過時
dlDom.mouseover(function () {
thisSelectFun(thisD).overStat=false;
});
//滑鼠離開時
dlDom.mouseout(function () {
thisSelectFun(thisD).overStat=true;
});

//滑鼠鬆開時
$("body").mouseup(function () {
if(thisSelectFun(thisD).overStat==true){//並且overStat為true
divDom.attr("class","layui-form-select");//隱藏下拉列表
}
});

//搜索框鍵盤鬆開事件
var searchDom = thisD.find("#"+searchId).eq(0);//搜索框對象
searchDom.keyup(function () {
searchFunssss(thisD,searchId,divDom,dlDom);
});

}

//根據輸入內容搜索出匹配的選項
function searchFunssss(thisD,searchId,divDom,dlDom) {
var val=$("#"+searchId).val();//搜索框id
if(val.length>0){
var conText='';//符合條件的選項
var searchStats=false;//是否搜索到
var htmlText=thisSelectFun(thisD).htmlText;//緩存的html代碼
dlDom.children().each(function () {
var thisText=$(this).text();
var thisDom='<dd lay-value="'+$(this).attr("lay-value")+'" class="">'+thisText+'</dd>';
if(val==thisText){
conText+=thisDom;
htmlText=htmlText.replace(thisDom,"");
searchStats=true;
var searchId = thisD.attr("id")+'Search';//搜索框id
$("#"+searchId).val("");//清空搜索框
}
});
htmlText=conText+htmlText;
dlDom.children().remove();//刪除其子節點
dlDom.append(htmlText);
if(searchStats){
divDom.addClass("layui-form-selected");//顯示下拉列表
}
}
}


以上js代碼放在名稱為selectFun.js的js文件中

調用如下:
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/webpage/include/taglib.jsp"%>
<html>
<head>
<title>test</title>
<meta name="decorator" content="default"/>
<link rel="stylesheet" href="${ctxStatic}/layui/css/layui.css">
<script src="${ctxStatic}/selectFun.js" charset="utf-8"></script>
<script type="text/javascript">
$(document).ready(function() {

$("#busgateDiv").selectDataFun({
ajaxUrl:{url:'${ctx}/goods/goods/getStat',where:{}},//請求後臺數據的路徑
selectType:true,//true多選,false單選
title:'商品狀態',//欄位中文名稱
inputId:'busgate'//實體類欄位
});

$("#sortDiv").selectDataFun({
ajaxUrl:{url:'${ctx}/goods/goods/getSortname',where:{}},
selectType:true,
title:'商品大類',
inputId:'sort'
});
});

</script>
</head>
<body class="gray-bg">
<div class="row">
<div class="col-sm-12">
<form:form id="searchForm" modelAttribute="goods" action="${ctx}/goods/goods/dataListFun" method="post" class="form-inline">
<div class="form-group">
<span>商品名稱:</span>
<form:input path="name" htmlEscape="false" maxlength="80" class=" form-control input-sm"/>
<span>商品代碼:</span>
<form:input path="code" htmlEscape="false" maxlength="80" class=" form-control input-sm"/>
<span>商品條碼:</span>
<form:input path="code2" htmlEscape="false" maxlength="30" class=" form-control input-sm"/>
</div>
<br/><br/>
<div class="form-group">
<div class="layui-inline" id="sortDiv">
</div>
<div class="layui-inline" id="busgateDiv">
</div
</div>
</form:form>
<br/>
</div>
</div>

</body>
</html>



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天研究了一下在Xcode中創建多個工程,達到模塊化的目的的同時,實現多個相似項目的協同開發,最主要的是可以實現多工程連編。項目的效果如下: 接下來創建一個這樣的項目,以及他們之間的通信 1.建一個文件夾MyProject(這是本人採用的文件夾) 2.在MyProject文件夾下創建一個工作空間My ...
  • 一. 背景 PS:相關知識:ListView與RecyclerView緩存機制原理大致相似,如下圖所示: 滑動過程中,離屏的ItemView即被回收至緩存,入屏的ItemView則會優先從緩存中獲取,只是ListView與RecyclerView的實現細節有差異.(這隻是緩存使用的其中一個場景,還有 ...
  • 之前一直做的是.NET開發用的是C#語言,近段時間由於做一個APP這才用上了java,在二維碼掃描整合到APP裡面遇到掃描二維碼之後沒有返回值,經過反覆的嘗試最後終於拿到了返回值,之後覺得很有必要記錄一下所以在這裡分享出來。 在網上下載Zxing開源包之後導入AndroidStudio 在Mainf ...
  • CSS3的過渡和轉換 1.過渡 什麼是過渡呢?過渡通俗的來說就是從一個樣式到另一個樣式的逐漸轉換改變的效果。 過渡的屬性: transition:是一個簡寫屬性,用於設置四個過渡屬性,所以說我們用的時候只寫這個屬性就行了。 transition-property:規定應用過渡效果的屬性(可以設置單個 ...
  • 1.使用 MongoDB模塊 進行操作 首先在工作目錄安裝 mongodb 模塊, 2.使用 Mongoose模塊 進行操作 2.1 創建文件db.js用來連接(其實這一步也有一點問題,不應該把資料庫連接寫到這裡) //創建文件 db.js // 在這之前你應該已經安裝了 mongoose || c ...
  • 有點晚了,不知不覺就到11點了,今天比昨天狀態更好些了,不過期末考試就快來了,夜深人靜的時候就想著或許自己應該成熟一點,而不是每天還在走神什麼之類的…… homework5終於是寫完了,一個簡單的日曆系統。。。 在寫的過程中,發現之前很多學的基礎都忘記了,所以也是在看過老師寫了一遍之後,自己才能把這 ...
  • 這段時間寫的一個項目,供給大家互相學習,有什麼疑問可以issues我。 ...
  • 上傳圖片有兩種方式: 1.fileReader 可以把圖片解析成base64碼的格式,簡單粗暴 2.canvas 可以重新繪製一張圖片,可以先把獲取得到的圖片的blob放進canvas裡面,再生成寬高和透明度的圖片,然後轉成相應的類型傳到後臺,目前支持png和jpeg格式。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...