jQuery 绑定事件到动态创建的元素上的方法实例


Posted in Javascript onAugust 18, 2013

在进入主题之前,我们先来看一个前台页面经常用到的功能:点击页面输入框时自动选择其中文本。

很容易想到利用输入框的focus事件,当输入框获得焦点时,再调用jQuery的select()方法。

Okay,想法很简单,逻辑似乎也无错。具体我们来看一下现实到底能不能实现。

1.页面构造个表单,放上几个输入框。代码看起来是这样子的。

<form action="/" method="post">
        <table>
            <tr>
                <td>Name:</td>
                <td>
                    <input type="text" name="name" value=" " />
                </td>
            </tr>
            <tr>
                <td>Age:</td>
                <td>
                    <input type="number" name="age" value=" " />
                </td>
            </tr>
            <tr>
                <td>Tel.:</td>
                <td>
                    <input type="tel" name="tel" value=" " />
                </td>
            </tr>
            <tr>
                <td>E-mail:</td>
                <td>
                    <input type="email" name="email" value=" " />
                </td>
            </tr>
            <tr>
                <td>Birth:</td>
                <td>
                    <input type="datetime" name="birthday" value=" " />
                </td>
            </tr>
        </table>
    </form>

出来的界面在Chromium里差不多是这个样子的:
jQuery 绑定事件到动态创建的元素上的方法实例

2.然后开始写我们的JavaScript代码来实现单击选中框内的文本,根据之前的想法,实现起来差不多应该是下面这个样子:

<script type="text/javascript">
        $(function () {
            $("input").focus(function () {
                $(this).select();
            })
        })
  </script>

3.然后再去页面小试一下,看效果出来没有。尝试之后发现,差不多算是成功了一半。什么情况叫?如果此刻你也跟着写了代码,你会发现,间单击输入框时,框中文本会闪烁。再进一步才会发现,只有当鼠标按下不放,输入框内文本才是保持选中状态,是我们预期的。当松开时选择效果消失。无尽惆怅!
jQuery 绑定事件到动态创建的元素上的方法实例

而且这还只是仅仅在Chromium中的情况,在IE中更为奇葩,连一丁点选择的效果都没有绽放出来。直接把代码无视了。

jQuery 绑定事件到动态创建的元素上的方法实例

对于火狐,水壶(如果你还不知道它的存在的话:火狐近亲,Mozilla 官方承认的64位高效版本火狐变种版本)我已经无力去测了。

下面直接给出经过Google之后找到的能在全浏览器中工作的代码:

<script type="text/javascript">
        $(function () {
            $("input").focus(function () {
                var input = $(this);
                setTimeout(function () {
                    input.select();
                });
            })
        })
 </script>

而关于上面这段能够正常工作的代码,还有一点神奇之处。那就是我和大家可能都觉得
var input = $(this);
                setTimeout(function () {
                    input.select();
                });


                var input =$(this);
                setTimeout(function () {
                    $(this).select();
                });

这两种写法应该是完全一样的代码吧,所以后者也应该能够达到预期的效果才对。但事实上换成第二种后,效果不见了!根本无法让文本自动选中!!

这是一般人所无法理解的高度。

Okay,回归继续看我们的输入框现在怎么样了。现在只要输入框中有文本,随便点一下就自动选中且松开鼠标后不反弹。很好,要的就是这种效果。

 

下面,才是本文的真正主题,如何将特性,或者说事件处理器,绑定到动态创建的页面元素上。

接着上面这个功能讲。上面的代码也许解决了一个表单页面的需求,在且仅仅是在这个页面,输入框具备这种获得焦点后自动将文本选中的特性。或者说拥有我们代码中所绑定到输入框focus事件上的处理器,当然,这个处理器就是选择文本。

如果说上面的说法有点令人头晕找不到北,下面我将用平生最为直白的语言再次阐述同一观点:假如其他页面也有输入框,是不是每个页面都去写一段相同的代码来实现这样的效果。

或者说同样是在当前页面,当用户填完相应资料后,我们再动态生成一些输入框,而这些后来生成的输入框如何也拥有获得焦点选中文本的功能。

为了演示,我们检测如果用户输入了Name,我们再在下面创建一个输入框可以输入昵称。可以预见得到,这个后来通过JavaScript代码插入到DOM中的输入框其中不会有其他输入框一样的效果的。因为我们使文本自动被选中的代码是在页面加载时执行的,而页面加载时这个后来插入的输入框还不存在呢。

下面是新加的对name输入框监听的代码:

$("input[name='name']").change(function () {
                $("tr").first().append(' <tr>' +
                                          '<td>Nick name:</td>'+
                                           '<td>'+
                                                '<input type="text" name="nickname" value=" " />'+
                                           '</td>'+
                                        '</tr>')
            })

下面到页面去测试一下,在Name中随便输入点什么吧。并且测试生成的输入框是不能将文本自动选中的。

jQuery 绑定事件到动态创建的元素上的方法实例

下面给出使动态创建的元素得到之前绑定的事件处理器的方法:

$("body").on('focus', "input", function () {
                var input = $(this);
                setTimeout(function () {
                    input.select();
                });
            });

这个方法未免有点取巧,但也是我觉得目前为止所知道的比较好的办法。因为jQuery1.9之前其实是有个live()函数专门来做这样类似的工作的,它可以将事件处理器绑定到未来未还未被创建的元素身上,但后来随着jQuery版本的升级,不提倡用这个live()方法了。既然不提倡了,自然有它的理由我也就不细究了,就像之前我细究了一下jQuery为什么废除了检测浏览器相关的函数一样。

如果我们将上面的方法写到网站的母版页当中,那么就不必在每个有输入框的页面都写相同的代码来实现了,同时对于后来动态创建的元素也都应用上了效果。

上面关于输入框的例子只是为了演示,当然不局限于这个例子,这样处理动态创建元素的需求还是很常见的,至少我在项目中都遇到过几次了,在不同的情形下。比如在呈现给权限不够的用户的页面中,有些按扭需要禁用,但用户是可以点击添加来增加一行,而每行都会有删除修改按扭,这时候可以将disable应用到一个表格中新增加的行中的按扭上。

行到水穷处,坐看云起时

Javascript 相关文章推荐
Ajax 数据请求的简单分析
Apr 05 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
Apr 15 Javascript
一个简单的瀑布流效果(主体形式自写)
May 27 Javascript
Bootstrap Table的使用总结
Oct 08 Javascript
javaScript嗅探执行神器-sniffer.js
Feb 14 Javascript
JavaScript登录记住密码操作(超简单代码)
Mar 22 Javascript
JS一个简单的注册页面实例
Sep 05 Javascript
vue+iview+less 实现换肤功能
Aug 17 Javascript
JavaScript闭包与作用域链实例分析
Jan 21 Javascript
详解vue使用插槽分发内容slot的用法
Mar 28 Javascript
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 Javascript
八种Vue组件间通讯方式合集(推荐)
Aug 18 Javascript
jQuery焦点图切换特效插件封装实例
Aug 18 #Javascript
JavaScript生成GUID的多种算法小结
Aug 18 #Javascript
实测jquery data()如何存值
Aug 18 #Javascript
js兼容的placeholder属性详解
Aug 18 #Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
Aug 18 #Javascript
jquery验证表单中的单选与多选实例
Aug 18 #Javascript
JS+CSS实现一个气泡提示框
Aug 18 #Javascript
You might like
星际中的相关伤害
2020/03/04 星际争霸
php中计算未知长度的字符串哪个字符出现的次数最多的代码
2012/08/14 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
php简单实现数组分页的方法
2016/04/30 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
2016/12/07 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
vue中英文切换实例代码
2020/01/21 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
支部组织生活会方案
2014/06/10 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
部分武汉产收音机展览
2022/04/07 无线电