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 相关文章推荐
在网页中控制wmplayer播放器
Jul 01 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
Jul 15 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
Oct 11 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
Dec 05 Javascript
JavaScript多并发问题如何处理
Oct 28 Javascript
Bootstrap每天必学之基础排版
Nov 20 Javascript
网页挂马方式整理及详细介绍
Nov 03 Javascript
Vue2实现组件props双向绑定
Dec 02 Javascript
echarts3 使用总结(绘制各种图表,地图)
Jan 05 Javascript
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
JS随机排序数组实现方法分析
Oct 11 Javascript
微信小程序地图绘制线段并且测量(实例代码)
Jan 02 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
一段php加密解密的代码
2007/07/16 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
Javascript 对象的解释
2008/11/24 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
jquery实现带单选按钮的表格行选中时高亮显示
2013/08/01 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
javascript获取当前的时间戳的方法汇总
2015/07/26 Javascript
jquery实现具有嵌套功能的选项卡
2016/02/12 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
讲解Python中if语句的嵌套用法
2015/05/14 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
高一英语教学反思
2014/01/22 职场文书
大专生找工作自荐书
2014/06/10 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年调度员工作总结
2015/04/30 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
导游词幽默开场白
2019/06/26 职场文书
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫