js绑定带参数的事件以及手动触发事件

本文介绍如何在JavaScript环境下,通过`createEvent`、`initEvent`等方法来模拟鼠标事件,进而实现类似按键精灵的功能。具体介绍了如何触发鼠标点击、移动等事件,并提供了兼容不同浏览器版本的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

如果大家将一张网页看成一个form的话,大致上就成了一个web form的模型。在win form 下要想手动触发某一个对象的事件是很简单的,只要发送一条消息即可达成。(PostMessage) 但是网页并不是基于消息机制的,如果我们想在一张网页上写出一个类似于按键精灵的功能该如何实现呢?
为大家介绍js下的几个方法:


1. createEvent(eventType)
参数:eventType 共5种类型:

 

Events :包括所有的事件.
HTMLEvents:包括 'abort', 'blur', 'change', 'error', 'focus', 'load', 'reset', 'resize', 'scroll', 'select',
'submit', 'unload'. 事件

 

 

UIEevents :包括 'DOMActivate', 'DOMFocusIn', 'DOMFocusOut', 'keydown', 'keypress', 'keyup'.
间接包含 MouseEvents.

 

MouseEvents:包括 'click', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup'.

 

MutationEvents:包括 'DOMAttrModified', 'DOMNodeInserted', 'DOMNodeRemoved',

'DOMCharacterDataModified', 'DOMNodeInsertedIntoDocument', 

'DOMNodeRemovedFromDocument', 'DOMSubtreeModified'.

 

2. 在createEvent后必须初始化,为大家介绍5种对应的初始化方法
HTMLEvents 和 通用 Events:
initEvent( 'type', bubbles, cancelable )

 

UIEvents :
initUIEvent( 'type', bubbles, cancelable, windowObject, detail )

 

MouseEvents:

initMouseEvent( 'type', bubbles, cancelable, windowObject, detail, screenX, screenY, 

clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget )

 

MutationEvents :
initMutationEvent( 'type', bubbles, cancelable, relatedNode, prevValue, newValue,
attrName, attrChange )


3. 在初始化完成后就可以随时触发需要的事件了,为大家介绍targetObj.dispatchEvent(event)
使targetObj对象的event事件触发
需要注意的是在IE 5.5+版本上请用fireEvent方法,还是浏览兼容的考虑


4. 例子

//例子1 立即触发鼠标被按下事件
var fireOnThis = document.getElementById('someID');
var evObj = document.createEvent('MouseEvents');
evObj.initMouseEvent( 'click', true, true, window, 1, 12, 345, 7, 220, false, false, true, false, 0, null );
fireOnThis.dispatchEvent(evObj);
//例子2 考虑兼容性的一个鼠标移动事件
var fireOnThis = document.getElementById('someID');
if( document.createEvent ) 
{
var evObj = document.createEvent('MouseEvents');
evObj.initEvent( 'mousemove', true, false );
fireOnThis.dispatchEvent(evObj);
}
else if( document.createEventObject )
{
fireOnThis.fireEvent('onmousemove');
}

 

 

 

    例子2

 

 

1. html部分

<div>
    <div id="tab">
        <h2>标题一</h2>
        <h2>标题二</h2>
        <h2>标题三</h2>
        <h2>标题四</h2>
    </div>
    <dl id="tabcon">
        <dd>内容一</dd>
        <dd>内容二</dd>
        <dd>内容三</dd>
        <dd>内容四</dd>
    </dl>
</div>
  

 

 

 

2. js部分

 

<script type="text/javascript" defer="defer">
var tab = document.getElementById("tab").getElementsByTagName("h2");
function swap(n) {
    return function() {
        for(var i=0; i<tab.length; i++) {
            document.getElementById("tabcon" + i).style.display = "none";
            document.getElementById("tab" + i).className = "";
        }
        document.getElementById("tabcon" + n).style.display = "block";
        document.getElementById("tab" + n).className = "focus";
    }
}
for(var i=0; i<tab.length; i++) {
    tab[i].setAttribute("id", "tab" + i);
    if(window.addEventListener) {
        tab[i].addEventListener("mouseover", swap(i), false);
    } else if(window.attachEvent) {
        tab[i].attachEvent("onmouseover", swap(i));
    }
}
var tabcon = document.getElementById("tabcon").getElementsByTagName("dd");
for(i=0; i<tabcon.length; i++) {
    tabcon[i].setAttribute("id", "tabcon" + i);
}
if(document.createEvent) {
    var evObj = document.createEvent('MouseEvents');
    evObj.initEvent( 'mouseover', true, false);
    tab[0].dispatchEvent(evObj);
} else if( document.createEventObject) {
    tab[0].fireEvent('onmouseover');
}
</script>
 

 

 

### 如何手动触发 Layui 文件上传 `filete` 事件 为了实现手动触发 Layui 文件上传组件的特定事件,如 `filete` 事件,可以利用 JavaScript 或 jQuery 来模拟用户的交互行为。下面提供了一种方法来展示如何通过编程方式触发展示文件上传对话框的行为。 需要注意的是,在实际应用中,Layui 的文件上传模块并没有直接定义名为 `filete` 的标准事件;可能是表述上的误差或者是自定义事件的一部分。对于标准的操作流程以及常见事件处理,请参照官方文档说明[^3]。 #### 方法一:使用原生 JavaScript 触发点击事件 如果目标是触发文件选择器弹出,则可以通过获取对应的 DOM 元素并调用 `.click()` 方法来间接达到效果: ```javascript // 假设这是由 Layui 渲染出来的隐藏 input[type=file] 的 ID document.getElementById('layui-upload-file').click(); ``` 此代码片段假设存在一个具有指定ID的选择文件按钮,并且该按钮是由 Layui 插件动态创建用于执行文件选取动作的 `<input type="file">` HTML 元素。 #### 方法二:绑定触发自定义事件 (针对可能存在的非标准事件) 如果是想要触发某个特殊的、非默认的事件(比如所谓的 `filete`),则需要先确认这个事件确实被开发者注册到了相应的对象上。之后就可以按照如下方式进行测试性的触发: ```javascript var event = new Event('filete'); // 创建一个新的 'filete' 事件实例 element.dispatchEvent(event); // 向 element 发送我们刚刚创建好的事件 ``` 这里的 `element` 应当是指向那个绑定了监听函数的对象或节点。这一步骤适用于那些已经设置好相应处理器的情况。 #### 示例代码 考虑到上述情况,这里给出一段综合性的例子,它不仅包含了打开文件选择窗口的功能,还展示了怎样去尝试发送一个假定为 `filete` 的事件给 Layui 控制结构内的适当部分: ```html <!-- 引入必要的资源 --> <link rel="stylesheet" href="//unpkg.com/layui/dist/css/layui.css"> <script src="//unpkg.com/layui/dist/layui.js"></script> <button id="manualTriggerBtn" class="layui-btn">手动触发</button> <div id="uploadDemoView"></div> <script> layui.use(['upload'], function(){ var upload = layui.upload; // 初始化上传控件 upload.render({ elem: '#uploadDemoView' ,url: '/your/upload/path' ,done: function(res){ console.log(res); } }); document.getElementById('manualTriggerBtn').addEventListener('click', function() { // 手动触发文件选择框显示 document.querySelector('#uploadDemoView .layui-upload-button').click(); // 尝试触发 filete 自定义事件 let customEvent = new CustomEvent('filete'); document.querySelector('#uploadDemoView').dispatchEvent(customEvent); alert("已尝试触发 filete 事件"); }); }); </script> ``` 这段脚本首先加载了所需的 CSS 和 JS 文件,接着初始化了一个简单的文件上传区域 (`#uploadDemoView`) 并为其配置了一些基本参数。最后定义了一个按钮 (`#manualTriggerBtn`) 当按下时会做两件事:一是让浏览器显示出文件挑选界面供用户选择要上传的内容;二是发出一个叫做 `filete` 的事件通知给关联的目标元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值