`

javascript模拟(触发)鼠标事件

阅读更多
  感言:
  苦逼的程序员经常遇到种种奇怪的需求,经常要想些奇怪的方法来解决问题。

  场景:
  最近用一个插件来展示大量图片,该插件封装逻辑很复杂,文档几乎为零。要修改其代码几乎是不可能完成的任务。因此我想要手工触发一个鼠标点击事件,以此激活其内部处理代码,完成相应的操作,不修改插件的任何代码、不用阅读任何插件的代码。

  简单地触发鼠标事件很容易,如果用jQuery就更容易了: $("#container").trigger("click");

  但我需要模拟鼠标在容器的某个位置点击。仔细阅读javascript的文档,找到了激活特定位置鼠标点击事件的方法。经测试,我用的插件收到mouseDown、mouseUp两个事件、且位置没有发生变化时,就会执行我需要的操作。那么我的代码如下:

function simulateClick(){
	//点击位置为屏幕中间
	var sx= window.innerWidth/2,sy= window.innerHeight/2,cx= sx,cy=sy;
	var eventDown = document.createEvent("MouseEvents");
	eventDown.initMouseEvent("mousedown",true,true,window,0,
		sx,sy,cx,cy,false,false,false,false,0,null);
	var eventUp = document.createEvent("MouseEvents");
	eventUp.initMouseEvent("mouseup",true,true,window,0,
		sx,sy,cx,cy,false,false,false,false,0,null);
	$("#container")[0].dispatchEvent(eventDown);
	$("#container")[0].dispatchEvent(eventUp);
}


  后来又用这样方法解决了插件不支持触屏移动的问题。通过附加事件、跟踪输出,发现插件不能很好地响应touchstart、touchmove、touchend事件,其中touchmove事件直接无视,如果触屏后立即移动,那么不会触发mousedown、mousemove、mouseup事件,总之一句话,需要将touchstart/touchmove/touchend转化为mousedown/mousemove/mouseup事件。
  以上这种需要可以用自定义事件、然后触发的机制来解决。

            /**
             * event为jquery的事件。真正的事件为event.originalEvent
             * 使用新的方法处理。http://wallimn.itey.com
             */
            function touchEventToMouseEvent(event,eventType){
                if(!event.originalEvent || !event.originalEvent.targetTouches || event.originalEvent.targetTouches.length!=1)
                    return null;
                var te = event.originalEvent.targetTouches[0];
                var clientX = te.clientX,clientY=te.clientY,screenX=te.screenX,screenY=te.screenY;

                var simEvent = new MouseEvent(eventType,{clientX:clientX,clientY:clientY,screenX:screenX,screenY:screenY,button:0,buttons:0});
                return simEvent;
            }

    function findElm(){
        var elm = $(".pivot_layer[title]");
	elm.bind("touchmove",function(e){
	var simEvent = touchEventToMouseEvent(e,"mousemove");
	if(simEvent!=null){
	    $(this)[0].dispatchEvent(simEvent);
	}
	});
	elm.bind("touchstart",function(e){
	console.log("touchstart");
	var simEvent = touchEventToMouseEvent(e,"mousedown");
	if(simEvent!=null){
	    $(this)[0].dispatchEvent(simEvent);
	}
	});
	elm.bind("touchend",function(e){
	console.log("touchend");
	var simEvent = touchEventToMouseEvent(e,"mouseup");
	if(simEvent!=null){
	    $(this)[0].dispatchEvent(simEvent);
	}
	});
        }
    }
    $(function(){
        findElm();
    });



  注:initMouseEvent是个将要废弃的方法,推荐使用new MouseEvent()方法来代替。上述代码基于jQuery插件。

分享到:
评论

相关推荐

    javascript触发模拟鼠标点击事件

    通过本文提供的示例和详细说明,相信读者能更好地理解JavaScript中模拟触发鼠标点击事件的原理和实现方法,并在自己的项目中加以应用。需要注意的是,虽然模拟事件触发在很多情况下非常有用,但过度使用或不当使用...

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

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

    QTP模拟鼠标和键盘事件整理

    除了直接调用`MouseClick`外,还可以通过触发HTML元素的事件来间接实现模拟鼠标事件。这种方式尤其适用于触发页面上的特定JavaScript事件。例如,触发`oncontextmenu`事件以模拟右键点击: ```vb ' 获取目标元素 ...

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

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

    javascript文字跟随鼠标移动(彬)

    在JavaScript代码中,`event`对象包含了有关触发事件的信息,包括鼠标的位置(`event.clientX`和`event.clientY`)。通过这些坐标,我们可以更新文字元素的CSS属性,如`left`和`top`,让文字在页面上移动到鼠标附近...

    模拟用户操作Input元素,不会触发相应事件

    然而,有一个重要的规则需要理解,那就是:通过JavaScript模拟的用户操作,比如调用`click()`、`focus()`或`change()`等方法,不会像实际用户交互那样触发输入元素的事件。 例如,考虑一个简单的HTML表单,其中包含...

    JavaScript模拟鼠标右键菜单效果_.docx

    在本文中,我们将探讨如何使用JavaScript来模拟鼠标右键菜单的效果,这对于提升用户体验和增强网页功能具有重要意义。 首先,为了实现这个效果,我们需要创建一个HTML结构,包括一个隐藏的`<ul>`元素作为我们的右键...

    JavaScript 模拟用户单击事件

    但在非 IE 浏览器,如 Firefox,需要使用 `document.createEvent()` 创建一个新的鼠标事件,然后通过 `initEvent()` 初始化事件,最后用 `dispatchEvent()` 分发事件来触发。具体代码如下: ```javascript var evt ...

    userevent-1.0.tar_模拟键盘事件鼠标事件_PIP_

    在Python编程中,有时我们需要对自动化测试、游戏控制或者用户界面交互进行编程,这时就需要用到模拟键盘和鼠标事件的功能。"userevent-1.0.tar" 是一个专门为此目的设计的Python库,它允许开发者通过简单的API来...

    asp.net 模拟鼠标

    在Web应用开发中,有时我们需要模拟用户的鼠标行为,例如自动点击、移动或者触发某些事件,这在自动化测试、数据填充或者用户界面自动化中尤其有用。 首先,我们要理解ASP.NET的运行机制。ASP.NET是一个用于构建Web...

    touchtomouse.js:一个将触摸事件转换为鼠标事件JavaScript库

    6. **性能优化**:考虑到性能和用户体验,库可能会对连续的触摸事件进行合并或限制,避免频繁触发鼠标事件导致页面卡顿。 在实际应用中,开发者可以将"touchtomouse.js"库引入项目,通过简单的配置即可实现触屏设备...

    前端小工具 - js模拟键盘、鼠标事件给element form批量赋值

    通过结合以上方法,我们可以在无用户交互的情况下,使用JavaScript模拟键盘和鼠标事件,以及对Element UI或其他HTML表单元素进行批量赋值。这在自动化测试、数据填充或动态页面构建等场景中非常实用。记得在使用这些...

    JavaScript鼠标移动放大图片特效

    `mouseover`事件在鼠标进入元素范围时触发,`mouseout`事件则在鼠标离开元素时触发。此外,我们还需要监听`mousemove`事件来获取鼠标的当前位置,以便调整放大图片的位置。 2. **CSS样式控制**:在CSS中,我们可以...

    鼠标控制,鼠标模拟

    这通常涉及到对鼠标事件的深度理解以及对GUI控件的识别。例如,使用Python的`pyautogui`库,可以轻松地实现这些功能,通过指定坐标进行点击,甚至可以通过图像识别来自动执行操作。 在网页游戏中,鼠标控制和模拟...

    JavaScript鼠标特效大全.zip

    二、鼠标事件 1. 鼠标点击(click):当用户点击元素时触发,常用于执行特定功能或改变元素状态。 2. 鼠标进入(mouseover):当鼠标光标进入元素范围时触发,常用于显示提示信息或高亮元素。 3. 鼠标离开(mouseout...

    Javascript模拟的DOS窗

    在模拟的DOS窗口中,事件监听用于处理用户与虚拟命令行的交互,包括鼠标点击关闭、最大化和最小化按钮时触发的不同功能。例如,`CurrentCmdFocus(obj)` 和 `CurrentCmdBlur(obj)` 函数分别在元素获得和失去焦点时...

    Qt QWebview调用JS,实现QQ邮箱自动填写输入框,模拟鼠标点击网页按钮!!

    本篇文章将详细探讨如何利用Qt的QWebView组件与JavaScript交互,实现如标题所述的“QQ邮箱自动填写输入框以及模拟鼠标点击网页按钮”。 首先,QWebView是QtWebKit模块的一部分,它允许在Qt应用程序中嵌入一个Web...

Global site tag (gtag.js) - Google Analytics