3

I am trying to generate a click event on a particular DOMNode via a menu item on the Mac. I thought this would be pretty simple however, I have seemed to hit a roadblock and not sure where I went wrong.

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 seems to be lacking a few methods that I had expected to see. I was expecting to have to code like this.

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

However, mouse events don't seem to be available. I would appreciate any help.

Todd Ditchendorf
  • 11,217
  • 14
  • 69
  • 123
Joe Workman
  • 341
  • 1
  • 16

1 Answers1

4

This approach has worked for me in the past:

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];

I believe that is all standard DOM2 Events module APIs. I think I found this solution from looking at the JavaScript on this MozDev createEvent article.


Also note the -[DOMHTMLElement click] method in WebKit's DOMHTMLElement.h which is marked as AVAILABLE_AFTER_WEBKIT_VERSION_5_1.


Finally, I have occasionally had to resort to something hackier to fully simulate a user "mouse click" and all the DOM events that usually accompany it. I would only try this if nothing else above works (this is complex, ugly and brittle):

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];

I have a lot of this code in my open source project TDAppKit on Google Code.

Todd Ditchendorf
  • 11,217
  • 14
  • 69
  • 123
  • That last approach looks great. But how do you execute objective C code on these events ? For example, I want to open another window controller when the user clicks on a web view . – real 19 Mar 09 '14 at 20:10
  • That's a different question. Present your question in the form of a new question with the appropriate tags. And upvote this answer if it has been useful to you. – Todd Ditchendorf Mar 09 '14 at 20:45