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事件写法实现代码
Jan 07 Javascript
Javascript无阻塞加载具体方式
Jun 28 Javascript
js抽奖实现随机抽奖代码效果
Dec 02 Javascript
Javascript基础教程之函数对象和属性
Jan 18 Javascript
Bootstrap表格和栅格分页实例详解
May 20 Javascript
Move.js入门
Feb 08 Javascript
基于dataset的使用和图片延时加载的实现方法
Dec 11 Javascript
jQuery实现的电子时钟效果完整示例
Apr 28 jQuery
详解vue如何使用rules对表单字段进行校验
Oct 17 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
Apr 22 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
Jul 18 Javascript
详解VUE中的插值( Interpolation)语法
Oct 18 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模板类代码
2008/09/07 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
php之可变函数的实例详解
2017/09/13 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
js 日期转换成中文格式的函数
2009/07/07 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
jquery平滑滚动到顶部插件使用详解
2017/05/08 jQuery
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
浅谈Python数据类型之间的转换
2016/06/08 Python
python类中super()和__init__()的区别
2016/10/18 Python
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
结构和类有什么异同
2012/07/16 面试题
线程同步的方法
2016/11/23 面试题
材料加工硕士生求职信
2013/10/10 职场文书
机械电子工程毕业生自荐信
2013/11/23 职场文书
入党自我评价范文
2014/02/02 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
vue里使用create, mounted调用方法
2022/04/26 Vue.js