整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

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,即获取相关资料


扫码关注公众号领取资源


?