JavaScript 模拟用户单击事件


Posted in Javascript onDecember 31, 2009

一开始,我想到了用jQuery的click()事件来触发超链接的单击事件(与trigger("click")一样的效果)。结果发现不如人意。

实例如下:
效果图
IE:
JavaScript 模拟用户单击事件

FireFox:
JavaScript 模拟用户单击事件 

<h3>请单击”Click Me"。测试提交按钮与超链接是否也被单击了。</h3> 
    <button id="btn">Click Me</button> 
    <form action="#"> 
        <input type="text" name="userName" value="徐新华-polaris" readonly/> 
        <input id="submit" type="submit" value="别点击此按钮提交" onclick="alert('触发了提交按钮的单击事件!');"/> 
    </form> 
    <a id="aLink" href="http://www.google.cn" onclick = "alert('触发了超链接的单击事件!');">代码触发超链接</a>

$(function() 
{ 
    $("#btn").click(function() 
    { 
        $("#submit").click(); 
        $("#aLink").click(); 
    }); 
});

当单击:Click Me按钮时,先后弹出提交按钮被单击、超链接被单击的对话框,这表明两者的单击事件都被触发了。然而,从地址栏中可以看到,提交按钮的单击事件触发后,执行了它的默认行为:提交表单;可是超链接的单击事件触发后,并没有链接到目标地址。(不要怀疑说是提交按钮的提交地址对超链接有影响,因为我去掉提交按钮,只留下超链接也不会链接到目标地址。)

也许jQuery中的click()方法对超链接的单击事件并没有使其执行浏览器的默认行为(即使你手动加入return true也没有用)。注意:tigger("click")与click()一样的。jQuery文档中说“这个函数也会导致浏览器同名的默认行为的执行”。同名的?不太明白,但是超链接的确不能执行它的默认行为。这是,只能想另外的方法——抛弃jQuery提供的事件。

回到JavaScript自己的事件——click。代码如下:

$(function() 
{ 
    $("#btn").click(function() 
    { 
        $("#submit").click(); 
        $("#aLink").get(0).click(); 
    }); 
});

在IE中一测试,通过了……有点兴奋。可是,在fireFox中却提示:click()不是一个function。说真的,IE浏览器提供的东西对开发人员来说很好,而fireFox却没有,比如之前说到的onpropertychange等。不过,我们必须的考虑IE之外的浏览器。在网上查资料,有不少人提到在fireFox中要用代码触发一个事件,需要如下处理:
var evt = document.createEvent("MouseEvents"); 
evt.initEvent("click", false, false);// 或用initMouseEvent(),不过需要更多参数 
$("#aLink").get(0).dispatchEvent(evt);

按以上方法来实现我想要的功能,代码如下:
$(function() 
{ 
    $("#btn").click(function() 
    { 
        $("#submit").click();         if($.browser.msie) 
        { 
            $("#aLink").get(0).click(); 
        } 
        else 
        { 
            var evt = document.createEvent("MouseEvents"); 
            evt.initEvent("click", false, false); 
            $("#aLink").get(0).dispatchEvent(evt); 
        } 
    }); 
});

这时,在IE中是完全正常的。然而,在fireFox中的情况与直接使用jQuery的click()事件一样,能触发单击事件,超链接却没有转到目标地址(注意:提交按钮用此方法也是能够提交的,我想jQuery的click()的实现大概是这样实现的吧)。哎,觉得还是IE好。呵呵。

如此一来,这种方法仍然不能解决FireFox中的问题。得继续寻找其他方法。

既然在fireFox中能够触发单击事件,却不能转到超链接的目标地址,那么,可以用js来实现跳转,即:使用location对象。代码如下:

$(function() 
{ 
    $("#btn").click(function() 
    { 
        $("#submit").click();         if($.browser.msie) 
        { 
            $("#aLink").get(0).click(); 
        } 
        else 
        { 
            // 绑定单击事件 
            $("#aLink").click(function() 
            { 
                document.location = $(this).attr("href");// window.location = $(this).attr("href");也可以,但是执行的时间不同 
            }); 
            // 触发单击事件 
            $("#aLink").click(); 
        } 
    }); 
});

这样就大功告成。有一个地方要说明一下:document.location与window.location。这两个都可以,然而他们的执行时间不同,window的执行时间较早。读者可以自己试试。

虽然实现了这个例子,然而,运用到项目中却出问题了,因为项目中使用了frameset(虽然现在很多人不建议使用frameset,但项目用了也没办法,得这样做)。因此需要指定链接的目标url在哪个frame中显示,然而,通过<a>中的target是无法实现的,因为<a>根本不会执行默认行为,需要通过js来实现。

我们知道,document代表当前的页面(当前执行元素所在页面)。如果我们能够找到当前超链接的url希望放入的frame,我们就可以找到它对象的document。当然找到超链接url希望放入的frame很容易,这是由你自己决定将其放到哪的。示例代码如下:

window.parent.frames['view'].document.location = $("#aLink").attr("href");

其中,'view'是超链接url希望放入的frame的name或id(最好是id和name命名一样)。建议IE中别用上面的方法,而用前面介绍的click()方法。

现在已经解决了所有的问题。可能还有人会有这种需求:就是在<a>中写上target,如<a target="_blank"></a>之类的。希望按target的要求触发超链接。当然,这是非IE浏览器有的问题。

实际上,下面我要介绍的方法是通用行的。可以替代window.parent.frames['view'].document.location。代码如下:

window.open($(this).attr("href"),$(this).attr("target"));

如果没有定义target属性,默认会当成'_blank'处理,这与用户单击超链接的效果不一样。这种方式是跨浏览器的,所以,只需要要用这种方式即可。这时,回到用jQuery+原始JavaScirpt来实现,这时最终、个人认为最好的方法。完整最终代码如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<title>JavaScript模拟用户单击事件——徐新华 polaris</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
<meta http-equiv="description" content="this is my page"> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <!-- 引入jQuery --> 
    <script type="text/javascript" src="scripts/jQuery/jquery-1.3.2.js"></script> 
    <script type="text/javascript"> 
        /** 
        * 模拟用户单击事件 处理超链接的问题 
        * @author xuxinhua 
        */ 
        $(function() 
        { 
            $("#btn").click(function() 
            { 
                $("#submit").click(); 
                // 绑定单击事件 
                $("#aLink").click(function() 
                { 
                    window.open($(this).attr("href"),$(this).attr("target")); 
                }); 
                // 触发单击事件(会执行所有绑定的单击事件处理函数) 
                $("#aLink").click(); 
            }); 
        }); 
    </script> 
</head> 
<body> 
    <h3>请单击”Click Me"。测试提交按钮与超链接是否也被单击了。</h3> 
    <button id="btn">Click Me</button> 
    <form action="#"> 
        <input type="text" name="userName" value="徐新华-polaris" readonly/> 
        <input id="submit" type="submit" value="别点击此按钮提交" onclick="alert('触发了提交按钮的单击事件!');"/> 
    </form> 
    <a id="aLink" href="http://www.google.cn" target="_self" onclick = "alert('触发了超链接的单击事件!');">代码触发超链接</a> 
</body> 
</html>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<title>JavaScript模拟用户单击事件——徐新华 polaris</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
<meta http-equiv="description" content="this is my page"> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <!-- 引入jQuery --> 
    <script type="text/javascript" src="scripts/jQuery/jquery-1.3.2.js"></script> 
    <script type="text/javascript"><!-- 
        /** 
        * 模拟用户单击事件 处理超链接的问题 
        * @author xuxinhua 
        */ 
        $(function() 
        { 
            $("#btn").click(function() 
            { 
                $("#submit").click(); 
                // 绑定单击事件 
                $("#aLink").click(function() 
                { 
                    window.open($(this).attr("href"),$(this).attr("target")); 
                }); 
                // 触发单击事件(会执行所有绑定的单击事件处理函数) 
                $("#aLink").click(); 
            }); 
        }); 
// --></script> 
</head> 
<body> 
    <h3>请单击”Click Me"。测试提交按钮与超链接是否也被单击了。</h3> 
    <button id="btn">Click Me</button> 
    <form action="#"> 
        <input type="text" name="userName" value="徐新华-polaris" readonly/> 
        <input id="submit" type="submit" value="别点击此按钮提交" onclick="alert('触发了提交按钮的单击事件!');"/> 
    </form> 
    <a id="aLink" href="http://www.google.cn" target="_self" onclick = "alert('触发了超链接的单击事件!');">代码触发超链接</a> 
</body> 
</html>

注意:需要此处需要先绑定一个click处理函数,然后再触发click事件
总结:
网上有一些JavaScript模拟用户单击事件的文章,但是都不全面,总会有这样那样的问题。虽然,我在此列举了众多的方法,觉得基本的问题都应该解决了,然而还是有可能有人遇到新的问题。如果遇到什么问题,可以跟我一起探讨……
Javascript 相关文章推荐
用js来解决ajax读取页面乱码
Nov 28 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
Apr 02 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
Mar 04 Javascript
jQuery插件MixItUp实现动画过滤和排序
Apr 12 Javascript
学习Bootstrap组件之下拉菜单
Jul 28 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 Javascript
JQuery.validationEngine表单验证插件(推荐)
Dec 10 Javascript
Bootstrap模态框插件使用详解
May 11 Javascript
探究react-native 源码的图片缓存问题
Aug 24 Javascript
详解Puppeteer前端自动化测试实践
Feb 21 Javascript
JS原生瀑布流效果实现
Apr 26 Javascript
(开源)微信小程序+mqtt,esp8266温湿度读取
Apr 02 Javascript
js监听表单value的修改同步问题,跨浏览器支持
Dec 31 #Javascript
js跟随滚动条滚动浮动代码
Dec 31 #Javascript
Javascript的匿名函数小结
Dec 31 #Javascript
JavaScript 对Cookie 操作的封装小结
Dec 31 #Javascript
Javascript的闭包
Dec 31 #Javascript
javascript Onunload与Onbeforeunload使用小结
Dec 31 #Javascript
JavaScript 常用函数
Dec 30 #Javascript
You might like
php基础知识:控制结构
2006/12/13 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
php经典算法集锦
2015/11/14 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
jQuery延迟加载图片插件Lazy Load使用指南
2015/03/25 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
python实现关键词提取的示例讲解
2018/04/28 Python
在python中安装basemap的教程
2018/09/20 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
Django 实现图片上传和下载功能
2020/12/31 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
动态密码技术
2012/10/18 面试题
软件测试笔试题
2012/10/25 面试题
JAVA程序员自荐书
2014/01/30 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
Java如何实现树的同构?
2021/06/22 Java/Android
Tomcat配置访问日志和线程数
2022/05/06 Servers