摘要:最近公司碰到一個需求,基于開發一個通用的帶建議的控件忙亂中寫出了一個通用結構和方法,跟大家分享一下,同時也算做自己的踩坑總結吧。如果不解綁,會導致你改變其中一個的值,其它都改變因為你初始化的時候,為每一個都綁定了事件。
最近公司碰到一個需求,基于jq 開發一個通用的 帶建議 的input 控件;
忙亂中寫出了一個通用結構和方法,跟大家分享一下,同時也算做自己的踩坑總結吧。
通用一個模板,不影響原有 input 所在結構;因為原來的表單中 已經有固定結構的 input 了; 所以不能改html結構;
大概的思路就是,定義一個option 包裹層;然后點擊需要帶建議的input的時候,去根據自定義屬性 suggest-url 拿到對應接口,取數據回來遍歷出選項。然后根據 這個input 的top,left 做絕對定位顯示出來。
//以下是固有的 form input 結構逐步分解 實現步驟 希望只調用一個函數實現功能單位 (默認)//隨意放一個包裹層
全局 有 suggest-input 類 的input 都實現option 功能;
function initEvent() { suggestInput(); })函數實現與解析 如下:
function suggestInput() { //在input focus 的時候做處理。 $(".suggest-input").focus(function () { //獲取相關 接口的值 var url = $(this).attr("suggest-url"); //緩存操作對象 var $input = $(this); var $suggest = $(".suggest-option"); var $ul = $suggest.find("ul"); //通過input 找到 option 應該顯示的top 和left var top = $input.offset().top + $input.outerHeight()+5; var left = $input.offset().left; var width = $input.outerWidth(); //如下是基于 url 的ajax請求,此處暫時用靜態數據 /*doAjaxPost(url,"",function (resp) { if(resp.status==1){ var dataObj = resp.data; $ul.html(""); dataObj.forEach(function (p1) { $ul.append("
效果如下:
遇到的坑整個代碼邏輯下來 其實并不難理解,但是有兩個需要注意到的地方;
每次為點擊li綁定事件的時候,應該先解除之前綁定的相同事件。$suggest.find("li").unbind("click").click(function (e) { })
如果不解綁,會導致你改變 其中一個 input 的值,其它input都改變; 因為你初始化的時候,為每一個li 都綁定了click 事件。
當表單出現滾動的時候,option 框沒有跟著 移動;$input.parents().each(function (i,o) { if($(o).css("overflow-y")=="auto"){ return $(o); } }).scroll(function () { $suggest.css({ top:$input.offset().top + $input.outerHeight()+5, }) });
解決辦法就是 檢查 發生滾動的box ;發生滾動的時候,重新計算一次 option 的 top;
不過如果手動綁定 scroll 監聽,會容易有兩個問題。一,可能發生滾動的 box 不是你監聽的box; 二,即使你知道發生滾動的div,如果直接寫死的話,發生結構變化時,代碼不夠通用。
因為我通過遍歷 input 的父子集,找到最近一個 overflow-y:auto 的父box;這就是發生滾動的父box。
然后綁定事件。
最后效果:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93963.html
摘要:前言最近比較熱門,但是成體系的文章并不多,前期避免不了踩坑我這篇文章主要介紹如何使用實現一個比較復雜的手勢交互,順便分享一下我在使用過程中遇到的一些小坑,減少大家入坑作者鏈接先睹為快本項目支持運行,效果如下對了,順便分享一下生成的小竅門,建 前言 Flutter最近比較熱門,但是Flutter成體系的文章并不多,前期避免不了踩坑;我這篇文章主要介紹如何使用Flutter實現一個比較復雜...
閱讀 2163·2021-11-12 10:36
閱讀 2156·2021-09-03 10:41
閱讀 2771·2021-08-19 10:57
閱讀 1242·2021-08-17 10:14
閱讀 1497·2019-08-30 15:53
閱讀 1218·2019-08-30 15:43
閱讀 981·2019-08-30 13:16
閱讀 2990·2019-08-29 16:56