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 相关文章推荐
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
Nov 30 Javascript
Js 刷新框架页的代码
Apr 13 Javascript
javascript 实用的文字链提示框效果
Jun 30 Javascript
深入分析js中的constructor和prototype
Apr 07 Javascript
在JS中如何调用JSP中的变量
Jan 22 Javascript
JQuery异步加载无限下拉框级联功能实现示例
Feb 19 Javascript
JQuery1.8 判断元素是否绑定事件的方法
Jul 10 Javascript
JavaScript ParseFloat()方法
Dec 18 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
Jul 23 Javascript
jquery 验证用户名是否重复代码实例
May 14 jQuery
Vue中computed及watch区别实例解析
Aug 01 Javascript
在antd中setFieldsValue和defaultVal的用法
Oct 29 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中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
jquery map方法使用示例
2014/04/23 Javascript
jQuery中parents()方法用法实例
2015/01/07 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
js实现验证码功能
2020/07/24 Javascript
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
python实现批量转换图片为黑白
2020/06/16 Python
python中怎么表示空值
2020/06/19 Python
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
停电调休通知
2015/04/16 职场文书
南京大屠杀观后感
2015/06/02 职场文书
《梅花魂》教学反思
2016/02/18 职场文书