【jQuery技巧分享】深度解析與實戰:如何自定義擴展$.val()方法實現更多功能
引言
在Web前端開發中,jQuery作為一款流行的JavaScript庫,以其簡潔易用的API設計深受開發者喜愛。其內置的`$.val()`方法主要用于獲取或設置表單元素的值,但有時候我們可能需要擴展其功能以滿足特定業務需求。本文將帶你深入探討如何自定義擴展jQuery的`$.val()`方法,使其擁有更多的實用功能。
##
javascript
// 獲取元素的值
var inputVal=$('#myInput').val();
// 設置元素的值
$('#myInput').val('New Value');
然而,原生的`$.val()`方法在處理復雜場景時可能會顯得力不從心,例如處理多選框、復選框組的值,或者進行更復雜的邏輯判斷等。
##
在實際項目中,我們可能會遇到如下需求:
1. 對于多選框或復選框,一次性獲取所有選中項的值。
2. 根據特定規則對輸入值進行格式化處理后再設置到元素上。
3. 在獲取或設置值的同時觸發自定義的回調函數。
為了滿足這些需求,我們可以考慮通過擴展`$.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,即獲取相關資料
掃碼關注公眾號領取資源
?
*請認真填寫需求信息,我們會在24小時內與您取得聯系。