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获取提交的字符串的字节数
Feb 09 Javascript
用Javascript数组处理多个字符串的连接问题
Aug 20 Javascript
基于jQuery的消息提示插件 DivAlert之旅(二)
Apr 01 Javascript
jQuery的学习步骤
Feb 23 Javascript
js使用正则实现ReplaceAll全部替换的方法
Aug 22 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
Mar 31 Javascript
jQuery网页选项卡插件rTabs用法实例分析
Aug 26 Javascript
如何使用jquery easyui创建标签组件
Nov 18 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
Vue Router去掉url中默认的锚点#
Aug 01 Javascript
如何在 ant 的table中实现图片的渲染操作
Oct 28 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中数据的批量导入(csv文件)
2006/10/09 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
JS限制上传图片大小不使用控件在本地实现
2012/12/19 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
微信小程序项目实践之主页tab选项实现
2018/07/18 Javascript
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Python中装饰器学习总结
2018/02/10 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
python挖矿算力测试程序详解
2019/07/03 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
科研课题实施方案
2014/03/18 职场文书
领导干部保密承诺书
2014/08/30 职场文书
大学生自荐书范文
2015/03/05 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
人民币使用说明书
2019/04/17 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
如何在Python中妥善使用进度条详解
2022/04/05 Python
Java实现带图形界面的聊天程序
2022/06/10 Java/Android
Django框架中视图的用法
2022/06/10 Python
canvas 中如何实现物体的框选
2022/08/05 Javascript