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 相关文章推荐
javascript 一些用法小结
Sep 11 Javascript
js中parseInt函数浅谈
Jul 31 Javascript
上传图片js判断图片尺寸和格式兼容IE
Sep 01 Javascript
AngularJS中的过滤器filter用法完全解析
Apr 22 Javascript
D3.js实现雷达图的方法详解
Sep 22 Javascript
js Canvas绘制圆形时钟教程
Feb 06 Javascript
jQuery实现文档树效果
Feb 20 Javascript
angularJS之$http:与服务器交互示例
Mar 17 Javascript
AngularJS表单验证功能
Oct 19 Javascript
vue实现跳转接口push 转场动画示例
Nov 01 Javascript
vue3.0生命周期的示例代码
Sep 24 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 Vue.js
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的session cookie错误
2009/08/09 PHP
php格式文件打开的四种方法
2018/02/24 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
2018/09/16 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
JQuery之拖拽插件实现代码
2011/04/14 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
使用JS画图之点、线、面
2015/01/12 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
JS获取url参数、主域名的方法实例分析
2016/08/03 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
windows下安装python paramiko模块的代码
2013/02/10 Python
KMP算法精解及其Python版的代码示例
2016/06/01 Python
python 异常处理总结
2016/10/18 Python
python调用摄像头显示图像的实例
2018/08/03 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
详解Python IO编程
2020/07/24 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
Solaris操作系统的线程机制
2012/12/23 面试题
宿舍违规检讨书
2014/01/12 职场文书
正风肃纪剖析材料
2014/02/18 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
2016年清明节寄语
2015/12/04 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL