鸟食轩
Microsoft .NET[C#] MVP 2003
随笔 - 332, 文章 - 870, 评论 - 5722, 引用 - 356
用createEventObject来模拟事件参数
原来在程序中模拟事件触发的时候,我写过一篇文章叫"
在什么时候才会用到fireEvent方法呢?
"。文章中说了我们怎么样来使用模拟事件的详细方法和步骤,不过当时忽略了fireEvent的一个Optional的参数
oEventObject,
它是做什么的呢?
由于一次对事件的更精确的触发控制,才知道了为什么会需要createEventObject这个方法。原来觉得可以fireEvent,对于控制事件触发已经非常的方便和强大了,可是一次BT的控制,发现居然还必须自己控制事件参数event的值。我们知道当事件触发时,正常的window.event对象的众多属性基本都是readonly的。而使用fireEvent触发事件后,event对象的很多属性都是默认值(或空值),那么我们怎么修改它成为我们期望的值呢?这时createEventObject方法就派上用场了。
调用document对象的createEventObject方法,我们会得到一个event的对象实例。这个是当然了,不过这个我们创建的event实例的属性大都是可写的,这样一来我们就完全可以定制一个具有我们希望属性参数的event对象。在使用它来作为fireEvent方法的参数,事件触发后的控制就完完全全的在我们自己的掌握之中了
。看下面这个我整理并简化后,使用createEventObject方法配合fireEvent的事例:
<
div
id
="divEvent"
oncontextmenu
="return false;"
style
="border: dotted 1px blue;
width: 170px; height: 100px; padding: 10px"
onmousedown
="ShowContextMenu(this)"
>
</
div
>
Right click the above rectangle.
<
script
>
function
ShowContextMenu(elmt)
{
var
evt
=
elmt.document.parentWindow.event;
if
( evt.button
==
2
)
{
var
popup
=
window.createPopup();
var
menuHTML
=
"
<div style='width:100%;height:100%;border: solid 1px red'>Context Menu</div>
"
;
popup.document.body.innerHTML
=
menuHTML;
popup.show(evt.offsetX, evt.offsetY,
100
,
24
, elmt);
}
divEvent.innerText
=
'
"
onmousedown
"
event fired
in
this
divsion element.';
}
</
script
>
<
script
Language
="javascript"
>
function
RunEvent()
{
//
divEvent.onmousedown();
divEvent.fireEvent('onmousedown');
}
function
FireEvent()
{
var
evt
=
document.createEventObject();
evt.button
=
2
;
evt.type
=
'onmousedown';
var
rect
=
divEvent.getBoundingClientRect();
evt.offsetX
=
(rect.right
+
rect.left)
/
2
;
evt.offsetY
=
(rect.bottom
-
rect.top)
/
2
;
divEvent.fireEvent('onmousedown', evt);
}
</
script
>
<
br
/>
<
br
/>
<
button
onclick
="RunEvent()"
>
Run Event
</
button
>
<
button
onclick
="FireEvent()"
>
Fire Event
</
button
>
<
br
/>
<
br
/>
<
button
onclick
="document.location.href=document.location.href"
>
Refresh
</
button
>
当我们在蓝色的区域内点击鼠标右键时,通过调用ShowContextMenu方法,会出现一个context menu。并且ShowContextMenu的逻辑依赖于event对象的属性值,当我么使用"Run Event"这个按钮时,由于event对象里是默认值,ShowContextMenu方法不能正确的执行。使用FireEvent方法,我们通过createEventObject调用,创建一个event对象,并赋与适当的属性值,我们就可以完全使用代码模拟出鼠标或键盘所触发的事件动作。
当然,fireEvent和createEventObject方法都是IE实现的DOM提供的独家方法
。
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted on 2005-06-06 21:53
birdshome
阅读(4988)
评论(6)
编辑
收藏
评论
737956
#1楼
回复
引用
divEvent加上position:relative/absolute都有问题,该怎么办?
2005-06-07 09:28
|
Derek
#2楼
[
楼主
]
回复
引用
查看
@Derek
为什么要给divEvent加上position:relative/absolute?! 出的什么问题呀?
2005-06-07 09:39
|
birdshome
#3楼
回复
引用
如果将这样的定制右键菜单用在页面上,divEvent很可能需要定位,如果给divEvent加上了style="position:absolute"或relative来定位的话,弹出菜单的位置就不对了?我的环境:2000sp4+ie6.01(6.0.2800.1106),你试试看?
2005-06-08 08:17
|
Derek
#4楼
回复
引用
@Derek
谢谢你的回府,不过这个示例是我为了说明createEventObject方法的用法和用途而杜撰的,没有考虑别的问题,因为我不可能把我使用createEventObject的整个方案搬上来讲我用到了createEventObject,觉得它挺好的。那我就没法讲了:}
2005-06-08 11:20
|
birdshome
#5楼
回复
引用
好用好用,谢谢。
我原来尝试用
VARIANT var;
var.vt = VT_DISPATCH;
pElemFrame->get_onmousedown(&var);
CComPtr<IDispatch> mousedown = var.pdispVal;
HRESULT hrtest = mousedown->Invoke(0, IID_NULL, 0, DISPATCH_METHOD, 0, 0, 0, 0);
出现INVALID_ARG,不知道为什么?
自己估计是DISPID的问题。
现在用你的方法解决了
CComPtr<IHTMLDocument4> pDoc4;
hr = pDoc3->QueryInterface(IID_IHTMLDocument4,(void**)&pDoc4);
if(hr==S_OK)
{
CComPtr<IHTMLEventObj> pEvent;
pDoc4->createEventObject(NULL, &pEvent);
CComQIPtr<IHTMLEventObj2, &IHTMLEventObj2> pEvent2(pEvent);
CComBSTR eventName = "onmousedown";
pEvent2->put_type(eventName);
pEvent2->put_button(2);
long x1, y1, x2, y2;
pElemFrame->get_offsetLeft(&x1);
pElemFrame->get_offsetTop(&y1);
pElemFrame->get_offsetWidth(&x2);
pElemFrame->get_offsetHeight(&y2);
pEvent2->put_offsetX(x1+(x2>>1));
pEvent2->put_offsetY(y1+(y2>>1));
CComQIPtr<IHTMLElement3, &IID_IHTMLElement3> pElemFrame3(pElemFrame);
VARIANT_BOOL result;
CComVariant vEvent = pEvent;
pElemFrame3->fireEvent(eventName, &vEvent, &result);
}
2006-09-13 18:35
|
不夜之侯[匿名][未注册用户]
#6楼
回复
引用
你有什么方法可以解决Firefox下的fireEvent问题么。
2007-05-07 15:31
|
imt[未注册用户]
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
最想要的Entity Framework功能
·
专访Jeffrey Richter:Windows 8是微软的重中之重
·
《福布斯》:谷歌进军硬件产品 难撼动苹果地位
·
美国空军拟最多购买1.8万台iPad 2
·
分析称专利之争让谷歌苹果两败俱伤
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
导航
博客园
首页
新随笔
联系
订阅
管理
公告
Invert
原创
技术文章和心得,
转载
必须注明来源
"博客园"
!
贴子以"现状"提供,且没有任何担保,同时也没有授予任何权利。
昵称:
birdshome
园龄:
7年10个月
荣誉:
推荐博客
粉丝:
73
关注:
3
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
Nokia 6300
(2)
fan
(1)
qq
(1)
腾讯
(1)
输入法
(1)
隐私
(1)
随笔分类
(337)
.NET的私有工具类(2)
(rss)
.NET技术开发相关(34)
(rss)
Asp.net控件开发(14)
(rss)
Debug中的滑铁卢(9)
(rss)
Enjoy Computer :)(27)
(rss)
Jscript&Dhtml开发(162)
(rss)
技术区里的非技术(49)
(rss)
开发中遇到的虫子(14)
(rss)
其它编程相关内容(16)
(rss)
商务智能(BI)开发(10)
(rss)
文章分类
(147)
北京的幸福生活(29)
(rss)
不得不转载(19)
(rss)
乖乖的文章(6)
(rss)
那时还没有blog(4)
(rss)
那是相当八卦(10)
(rss)
手机短信息(1)
(rss)
我们的文章(40)
(rss)
珍贵照片的背景(4)
(rss)
重庆的幸福生活(34)
(rss)
相册
2005 Kick Off @ 涞滩
2006 Kick Off @ 钓鱼城
2006 Offsite @ 四面山
2006 Wedding @ 昆明
2007 Marriage @ 哈尔滨
2007 Offsite @ Thailand
2007 Offsite @ 海南云天
2007 Training @ Seattle
2007 Travelling @ 云南
2008 Travelling @ 天津
乱七八糟的收集
Ex-Colleagues
Jason Lei's Space
.Net Life
(rss)
Jasper
(rss)
Michelles Space
xingd.net
(rss)
玻璃缸
(rss)
短鲷生活
海阔天空
录一室
(rss)
完美的泡菜
(rss)
怡红公子
(rss)
竹叶尖的BLOG
常用链接
Engadget 中文版
PDFCHM eBooks
SitePoint Forums
The Code Project
安利上海直销店
哈尔滨工业大学
哈工大紫丁香
海归论坛
(rss)
沙坪坝区中医院
兄弟情深
没有可乐的日子
葡萄树下不乘凉
(rss)
斯普特尼克
猪头小队长
(rss)
积分与排名
积分 - 3145044
排名 - 6
最新评论
阅读排行榜
推荐排行榜