3

我正在尝试通过 Mac 上的菜单项在特定 DOMNode 上生成单击事件。我认为这很简单,但是,我似乎遇到了障碍,不知道哪里出错了。

DOMDocument* domDocument=[webView mainFrameDocument];

DOMEvent* event = [domDocument createEvent:@"HTMLEvents"];
[event initEvent:@"click" canBubbleArg:YES cancelableArg:NO];

[[[domDocument getElementsByClassName:@"logout clickable"] item:0] dispatchEvent:event];    

DOMEvent 似乎缺少一些我期望看到的方法。我期待不得不像这样编码。

DOMEvent* event = [domDocument createEvent:@"MouseEvents"];
[event initMouseEvent:@"click" canBubbleArg:YES cancelableArg:NO];

但是,鼠标事件似乎不可用。我将不胜感激任何帮助。

4

1 回答 1

4

这种方法过去对我有用:

DOMElement *el = // find element somehow
DOMDocument *doc = [el ownerDocument];
DOMAbstractView *window = [doc defaultView];
DOMUIEvent *evt = (DOMUIEvent *)[doc createEvent:@"UIEvents"];
[evt initUIEvent:@"click" canBubble:YES cancelable:YES view:window detail:1];
[el dispatchEvent:evt];

我相信这是所有标准的 DOM2 事件模块 API。我想我是通过查看这篇MozDevcreateEvent文章中的 JavaScript 找到了这个解决方案。


还要注意-[DOMHTMLElement click]WebKit 的DOMHTMLElement.h中标记为的方法AVAILABLE_AFTER_WEBKIT_VERSION_5_1


最后,我偶尔不得不求助于一些更骇人听闻的东西来完全模拟用户“鼠标点击”以及通常伴随它的所有 DOM 事件。如果上面没有其他方法,我只会尝试这个(这很复杂,丑陋和脆弱):

WebView *webView = // get web view
DOMElement *el = // find element somehow
id relatedTarget = [(DOMHTMLDocument *)[el ownerDocument] body];

[el dispatchMouseEventType:@"mouseover" clickCount:0 ctrlKey:NO altKey:NO shiftKey:NO metaKey:NO button:0 relatedTarget:relatedTarget webView:webView];
[el dispatchMouseEventType:@"mousemove" clickCount:0 ctrlKey:NO altKey:NO shiftKey:NO metaKey:NO button:0 relatedTarget:nil webView:webView];
[el dispatchMouseEventType:@"mousedown" clickCount:1 ctrlKey:NO altKey:NO shiftKey:NO metaKey:NO button:0 relatedTarget:nil webView:webView];
[el dispatchMouseEventType:@"click" clickCount:1 ctrlKey:NO altKey:NO shiftKey:NO metaKey:NO button:0 relatedTarget:nil webView:webView];
[el dispatchMouseEventType:@"mouseup" clickCount:1 ctrlKey:NO altKey:NO shiftKey:NO metaKey:NO button:0 relatedTarget:nil webView:webView];
[el dispatchMouseEventType:@"mousemove" clickCount:0 ctrlKey:NO altKey:NO shiftKey:NO metaKey:NO button:0 relatedTarget:nil webView:webView];
[el dispatchMouseEventType:@"mouseout" clickCount:0 ctrlKey:NO altKey:NO shiftKey:NO metaKey:NO button:0 relatedTarget:relatedTarget webView:webView];

我在 Google Code 上的开源项目TDAppKit中有很多这样的代码。

于 2013-03-14T07:06:44.667 回答