整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          jQuery技巧分享深度解析與實戰:如何自定義擴展$

          jQuery技巧分享深度解析與實戰:如何自定義擴展$.

          【jQuery技巧分享】深度解析與實戰:如何自定義擴展$.val()方法實現更多功能

          引言

          在Web前端開發中,jQuery作為一款流行的JavaScript庫,以其簡潔易用的API設計深受開發者喜愛。其內置的`$.val()`方法主要用于獲取或設置表單元素的值,但有時候我們可能需要擴展其功能以滿足特定業務需求。本文將帶你深入探討如何自定義擴展jQuery的`$.val()`方法,使其擁有更多的實用功能。

          ##

          一、$.val()方法基礎認知

          javascript
          // 獲取元素的值
          var inputVal=$('#myInput').val();
          
          // 設置元素的值
          $('#myInput').val('New Value');
          

          然而,原生的`$.val()`方法在處理復雜場景時可能會顯得力不從心,例如處理多選框、復選框組的值,或者進行更復雜的邏輯判斷等。

          ##

          二、自定義擴展$.val()方法的需求分析

          在實際項目中,我們可能會遇到如下需求:

          1. 對于多選框或復選框,一次性獲取所有選中項的值。

          2. 根據特定規則對輸入值進行格式化處理后再設置到元素上。

          3. 在獲取或設置值的同時觸發自定義的回調函數。

          為了滿足這些需求,我們可以考慮通過擴展`$.val()`方法來實現。

          ##

          三、自定義擴展$.val()方法的實現步驟

          ###

          步驟1:理解$.fn.val源碼及擴展原理

          javascript
          // 原始$.fn.val方法保存
          var _val=$.fn.val;
          
          // 重寫$.fn.val方法
          $.fn.val=function(value) {
              // 這里可以添加我們的自定義邏輯
          };
          

          ###

          步驟2:擴展$.val()以支持多選框和復選框組

          javascript
          $.fn.extend({
              val: function(value) {
                  var elem=this[0];
          
                  if (elem.tagName==='SELECT' && elem.multiple) {
                      // 處理多選框情況
                      if (value===undefined) {
                          return this.find(':selected').map(function() {
                              return $(this).val();
                          }).get();
                      } else {
                          // 需要傳入數組形式的值
                          this.find('option').prop('selected', false);
                          $.each(value, function(i, v) {
                              this.find('[value="'+v+'"]').prop('selected', true);
                          });
                          return this;
                      }
                  } else if (Array.isArray(this.length)) {
                      // 處理復選框組情況
                      // ...
                  }
          
                  // 調用原始$.fn.val方法
                  return _val.apply(this, arguments);
              }
          });
          

          ###

          步驟3:增加值的格式化處理與回調函數

          javascript
          $.fn.extend({
              val: function(value, formatFn, callback) {
                  var elem=this[0],
                      returnValue;
          
                  // 如果傳入了value并且有formatFn,則先格式化再設置值
                  if (value !==undefined && typeof formatFn==='function') {
                      value=formatFn.call(this, value);
                  }
          
                  // 設置值并觸發原始$.fn.val方法
                  returnValue=_val.call(this, value);
          
                  // 執行回調函數
                  if (typeof callback==='function') {
                      callback.call(this, value);
                  }
          
                  // 返回原始$.fn.val方法的返回值
                  return returnValue;
              }
          });
          

          ##

          四、實戰案例與應用示例

          javascript
          // 獲取多選框的所有選中值
          var selectedValues=$('select[multiple]').val();
          
          // 設置復選框組,并在操作完成后執行回調
          $('input[type="checkbox"]').val([true, false, true], function(value) {
              console.log('Checkbox values updated:', value);
          });
          
          // 格式化輸入框的值并在設置后執行回調
          $('#myInput').val('1234567890', function(val) {
              return val.replace(/\D/g, ''); // 只保留數字
          }, function(formattedValue) {
              console.log('Formatted input value:', formattedValue);
          });
          

          總結來說,通過對jQuery的`$.val()`方法進行合理擴展,我們可以定制出更加靈活且強大的功能,從而更好地服務于我們的實際開發工作。當然,在進行此類擴展時,我們也需要注意保持代碼的可讀性和維護性,確保擴展功能既高效又穩定。同時,不斷學習和完善自己的編程技能,方能在瞬息萬變的前端世界中游刃有余。

          、html()方法:如果想更改或者是設置 HTML 的內容,我們可以使用 html()方法,首先我們先使用這個方法獲取元素里面的內容 var html=$("p").html()。如果需要設置某元素的 HTML 代碼,那么我們就可以使用此方法加上一個參數。此方法只能應用于 XHTML 中,不能用于 xml。

          2、text()方法,去設置某個元素中的文本內容,代碼是 var text=$("p").text();如果想設置文本同樣需要給它傳一個參數。

          3、val()方法,可以用來設置和獲取元素的值,它不僅僅可以設置元素,同時也能獲取元素,另外,它能是下拉列表框,多選框,和單選框相應的選項被選中,在表單操作中會經常用到。

          ybatis之#和$

          我們今天講一個面試中經常會問的一個問題,就是#和$有什么作用,他們的區別是啥.

          在MyBatis中提供了兩種方式讀取參數的內容到SQL語句中,分別是

          #{參數名} :實體類對象或Map集合讀取內容.

          ${參數名} :實體類對象或Map集合讀取內容.

          他們的區別是什么呢,還是看代碼.

          第一步:我們寫的兩個接口.

          List selectJingHao(String name);
          List selectMeiYuan(String name);
          

          第二步:映射文件.

           <select id="selectJingHao" resultMap="studentMap">
           SELECT * from student where name=#{name}
           </select>//記住美元符號where條件后的拼接字段要加引號
           <select id="selectMeiYuan" resultMap="studentMap">
           select * from student where name='${name}'
           </select>
          

          第三步:測試.

           @Test
           public void selectJingHao() throws Exception {
           StudentMapper dao=session.getMapper(StudentMapper.class);
           List<Student> student=dao.selectJingHao("jiepi");
           student.stream().map(it -> it.toString()).forEach(System.out::println);
           }
          [DEBUG] Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4516af24]
          [DEBUG]==> Preparing: SELECT * from student where name=? 
          [DEBUG]==> Parameters: jiepi(String)
           @Test
           public void selectMeiYuan() throws Exception {
           StudentMapper dao=session.getMapper(StudentMapper.class);
           List<Student> student=dao.selectMeiYuan("jiepi");
           student.stream().map(it -> it.toString()).forEach(System.out::println);
           }
          [DEBUG] Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@530612ba]
          [DEBUG]==> Preparing: select * from student where name='jiepi' 
          [DEBUG]==> Parameters: 
          String string
          [DEBUG] <==Total: 1
          

          使用 #{} 格式的語法會導致 MyBatis 創建 PreparedStatement 參數占位符并

          安全地設置參數(就像使用 ? 一樣)。這樣做更安全,更迅速,通常也是首選做法,而使用${}格式語法,則就是字符串拼接,一般面試官問到這里就結束了,就怕有些自戀狂要問,那要${}有啥用.您不要慌,來看下面的代碼.

          第一步:接口

          List selectTable(String table);
          

          第二步 :映射文件

           <select id="selectTable" resultMap="studentMap">
           select * from ${value}
           </select>
          

          第三步:看結果

           @Test
           public void selectTable() throws Exception {
           StudentMapper dao=session.getMapper(StudentMapper.class);
           List<Student> student=dao.selectTable("student");
           student.stream().map(it -> it.toString()).forEach(System.out::println);
           }
          [DEBUG] Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2df32bf7]
          [DEBUG]==> Preparing: select * from student 
          [DEBUG]==> Parameters: 
          

          可以看出有時你就是想直接在 SQL 語句中插入一個不轉義的字符串.

          當 SQL 語句中的元數據(如表名或列名)是動態生成的時候,字符串替換將會非常有用。舉個例子,如果你想通過任何一列從表中 select 數據時,不要像下面這樣寫:

          @Select("select * from user where id=#{id}")
          User findById(@Param("id") long id);
          @Select("select * from user where name=#{name}")
          User findByName(@Param("name") String name);
          @Select("select * from user where email=#{email}")
          User findByEmail(@Param("email") String email); 
          

          可以只寫這樣一個方法:

          @Select("select * from user where ${column}=#{value}")
          User findByColumn(@Param("column") String column, @Param("value") String value);
          

          其中 ${column} 會被直接替換,而 #{value} 會被使用 ? 預處理。因此你就可以像下面這樣來達到上述功能:

          User userOfId1=userMapper.findByColumn("id", 1L);
          User userOfNameKid=userMapper.findByColumn("name", "kid");
          User userOfEmail=userMapper.findByColumn("email", "noone@nowhere.com");
          

          官網:

          用這種方式接受用戶的輸入,并將其用于語句中的參數是不安全的,會導致潛在的 SQL 注入攻擊,因此要么不允許用戶輸入這些字段,要么自行轉義并

          檢驗.自然這也就是#和$的區別.

          你都這樣回答了面試官不錄用你都難,歡迎持續關注.陸續介紹相關Mybatis知識點.

          希望對大家面試有多幫助,也希望大家持續關注轉載。關注公眾號獲取相關資料請回復:typescript,springcloud,springboot,nodejs,nginx,mq,javaweb,java并發實戰,java并發高級進階,實戰java并發,極客時間dubbo,kafka,java面試題,ES,zookeeper,java入門到精通,區塊鏈,java優質視頻,大數據,kotlin,瞬間之美,HTML與CSS,深入體驗java開發,web開發CSS系列,javaweb開發詳解,springmvc,java并發編程,spring源碼,python,go,redis,docker,即獲取相關資料


          掃碼關注公眾號領取資源


          ?


          主站蜘蛛池模板: 日韩成人一区ftp在线播放| 久久精品一区二区影院| 亲子乱av一区二区三区| 香蕉久久av一区二区三区| 蜜臀AV一区二区| 国语精品一区二区三区| 成人久久精品一区二区三区| 中文字幕一区二区免费| 色婷婷香蕉在线一区二区| 日本免费一区二区久久人人澡| 成人h动漫精品一区二区无码| 久久亚洲综合色一区二区三区| 国产精品亚洲一区二区在线观看 | 欧美亚洲精品一区二区| 国产综合精品一区二区三区| 国产免费私拍一区二区三区| 中文字幕av一区| 伊人无码精品久久一区二区| 亚洲乱码国产一区三区| 亚洲一区二区三区在线观看精品中文| 色狠狠色狠狠综合一区| 精品视频一区二区三区四区| 免费无码一区二区三区蜜桃| 国产一区二区三区日韩精品| 国产人妖视频一区二区破除| 亚洲AV香蕉一区区二区三区| 91成人爽a毛片一区二区| 中文字幕一区二区三匹| 精品一区高潮喷吹在线播放| 日本精品一区二区三区视频| 日本免费一区二区三区最新| 亚洲av区一区二区三| 国产日韩一区二区三区在线观看| 国产成人久久精品一区二区三区| 亚洲国产一区二区三区青草影视| 国产成人精品第一区二区| 精品免费国产一区二区三区| 国产剧情国产精品一区| 亚洲AV无码国产一区二区三区| 亚洲国产一区二区视频网站| 国产精品毛片VA一区二区三区|