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 Events モジュール API だと思います。このMozDev createEventarticleの 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];

私のオープンソース プロジェクトTDAppKit on Google Codeには、このコードがたくさんあります。

于 2013-03-14T07:06:44.667 に答える