在WebView中生成单击事件

时间:2013-03-13 00:24:54

标签: objective-c dom webkit dom-events

我正在尝试通过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];

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

1 个答案:

答案 0 :(得分: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 Events模块API。我想通过查看MozDev createEvent article上的JavaScript找到了这个解决方案。


另请注意WebKit的 DOMHTMLElement.h 中的-[DOMHTMLElement click]方法,该方法标记为AVAILABLE_AFTER_WEBKIT_VERSION_5_1


最后,我偶尔不得不求助于一些hackier来完全模拟用户“鼠标点击”以及通常伴随它的所有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];

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