`

JavaScript模拟用户单击事件

阅读更多
公司项目想要实现一种功能:
单击一个按钮或超链接,然后会出现其他的超链接,这时要让其中的一个超链接被单击,以显示一个初始页面。(公司页面使用了frameset)

很显然,之后的超链接单击事件需要通过JavaScript来触发。

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

实例如下:
效果图
IE:

FireFox:


<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>

注意:需要此处需要先绑定一个click处理函数,然后再触发click事件

总结:

网上有一些JavaScript模拟用户单击事件的文章,但是都不全面,总会有这样那样的问题。虽然,我在此列举了众多的方法,觉得基本的问题都应该解决了,然而还是有可能有人遇到新的问题。如果遇到什么问题,可以跟我一起探讨……
  • 大小: 31.8 KB
  • 大小: 37.4 KB
2
0
分享到:
评论
4 楼 h521999 2010-04-29  
对于 window.open方法的话,现在大多数浏览器都会拦截的,所以说也不是最好的办法。
对于此问题,同样期待更好的解决方案
3 楼 polaris1119 2010-01-04  
今天又特意试了一下定义了base的情况,没有什么问题。不知道你遇到的是什么问题
2 楼 polaris1119 2010-01-03  
对于定义过base,我没有试,不过,我觉得应该不会有问题。而对于"_blank",并没有你说的那种情况,我用fireFox测试,它是在新标签中打开的,而且没有block提示。不知你用什么浏览器测的?
1 楼 thysky 2010-01-02  
最后 那个用window.open的方法也只能是委曲求全的方法。
如果在文档前方定义过base的话,还是有点问题,另外对于"_blank",点击链接会在新标签页中打开,而模拟会从窗口打开,而且首先提供block提示.很是麻烦。

相关推荐

    JavaScript 模拟用户单击事件

    JavaScript 模拟用户单击事件是一项常见的前端开发技术,它主要应用于自动化测试或者在某些特殊情况下需要触发元素的默认行为。在本例中,开发者尝试使用 jQuery 的 `click()` 方法来模拟点击事件,但发现这种方法...

    javascript触发模拟鼠标点击事件

    有时我们需要在JavaScript中模拟用户的行为,比如模拟鼠标点击事件。这样可以无需用户直接交互即可触发事件处理函数。本文详细介绍了如何使用JavaScript来触发模拟的鼠标点击事件,并提供了IE浏览器和其他现代浏览器...

    模拟用户单击事件demo

    这个“模拟用户单击事件demo”可能是一个示例项目,展示了如何在不同页面之间传递参数,并根据接收到的参数来触发特定的点击事件。以下是这个话题的详细解释: 1. **页面跳转与URL参数传递**: - 当我们在网页上...

    layui问题之模拟select点击事件的实例讲解

    通过本文的讲解,我们了解了如何利用layui的select组件和JavaScript来模拟select的点击事件。我们查看了layui的官方文档和源码,从中提取了触发事件的原理,并通过具体的代码实例来演示了整个过程。希望本文的讲解能...

    JavaScript模拟select

    ### JavaScript模拟select控件知识点详解 #### 一、引言 在前端开发中,有时我们需要对浏览器原生的`&lt;select&gt;`元素进行定制化处理,比如实现更丰富的样式或者增加额外的功能。本篇将深入探讨如何使用纯JavaScript...

    javascript模拟windowsxp关机效果代码

    1. **事件监听**:JavaScript通过addEventListener或attachEvent方法监听用户的点击事件,当用户点击特定按钮时,触发关机动画。 2. **CSS操作**:JavaScript可以改变HTML元素的样式,如修改背景色、透明度等,以...

    javascript模拟页面弹出框

    总结来说,JavaScript模拟页面弹出框是一种常见的Web开发技巧,利用`iframe`的特性可以实现高度定制化的弹出交互体验。通过学习“testPopuBox”这个示例,开发者可以深入理解这一技术,并将其应用于自己的项目中,...

    httpunit Java模拟JS点击事件

    在这个场景下,我们讨论的是如何利用HttpUnit来模拟JavaScript点击事件。 HttpUnit是一个轻量级的Java库,它设计的目标是简化Web应用的非图形化测试。通过使用HttpUnit,我们可以避免启动真实的浏览器,而是通过API...

    javaScript简单模拟计算器

    总的来说,创建一个JavaScript模拟计算器是一个很好的学习项目,可以帮助理解DOM操作、事件处理、变量状态维护以及简单的数学运算。通过这个过程,开发者可以提升JavaScript基础,为更复杂的前端项目打下基础。

    一个javascript模拟的 虚拟键盘,效果非常棒!

    标题中的"一个javascript模拟的虚拟键盘"指的就是这样一个用JavaScript编写的程序,它能够在网页上创建一个可交互的键盘界面,用户可以点击按钮输入文本,而无需物理键盘。这样的虚拟键盘通常包括各种按键布局,如...

    软键盘(JavaScript模拟软键盘输入密码)

    5. **模拟输入**:在点击事件的处理函数内,使用`event.target.innerText`获取点击按钮的字符,然后更新密码输入框的值。可以使用`element.value += character`来添加字符。 6. **处理特殊功能**:考虑添加退格键...

    Javascript模拟的DOS窗口

    ### Javascript模拟的DOS窗口知识点解析 #### 一、项目概述 在本项目中,开发者通过JavaScript技术实现了一个模拟DOS操作系统的窗口界面。该窗口不仅具有基本的文本输入输出功能,还支持用户与界面之间的交互操作,...

    javascript模拟键盘

    JavaScript模拟键盘是一种技术,它允许在网页上创建一个虚拟键盘,用户可以通过点击屏幕上的按键来输入文本,替代物理键盘的功能。这种技术尤其适用于触摸屏设备,例如平板电脑和智能手机,以及那些对安全性有较高...

    JS简单模拟触发按钮点击功能的方法

    总结来说,JavaScript模拟触发事件主要利用了事件对象和事件处理机制,通过`click()`和`dispatchEvent()`等方法实现。通过理解和掌握这些机制,开发者可以在各种不同的场景下灵活运用,提高开发效率和交互体验。同时...

    javascript 模拟投币实验程序 维吾尔语

    在开发这样的程序时,JavaScript的事件监听器是必不可少的,它们会捕获用户的点击或其他交互,然后执行相应的函数。例如,当用户点击“投币”按钮时,一个对应的`click`事件处理器会被触发,处理投币逻辑。此外,...

    JavaScript代码模拟鼠标自动点击事件示例

    总结来说,JavaScript模拟鼠标自动点击事件是通过`click()`方法和事件处理机制实现的。结合CSS样式和HTML布局,可以创建出富有交互性的动态效果。这种技术在网页游戏、自动化测试、交互设计等多个领域都有广泛应用。...

    Javascript模拟的DOS窗

    从给定的信息中,我们可以抽取出一个非常有趣的项目——使用JavaScript模拟DOS窗口。这个项目的目的是在现代浏览器环境中重现经典的DOS(磁盘操作系统)界面和交互体验,它不仅能够激发怀旧情感,还能作为学习...

    Javascript 模拟点击事件(点击链接与html点击) 兼容IE/Firefox

    JavaScript模拟点击事件是一种常见的编程需求,特别是在自动化测试、交互式用户界面或者处理浏览器兼容性问题时。在JavaScript中,模拟点击事件通常是通过调用元素的`click()`方法来实现的。然而,不同的浏览器可能...

    HTML5 虚拟键盘模拟的键盘事件.rar

    在HTML5模拟的键盘页面中,当用户在实体键盘上按下键时,对应的虚拟键盘按钮会通过动画效果(如显示圆点)来响应这个事件,这通常是通过JavaScript事件监听器实现的。例如,我们可以添加一个事件监听器到页面的`...

Global site tag (gtag.js) - Google Analytics