2013-03-13 5 views
3

Mac의 메뉴 항목을 통해 특정 DOMNode에서 click 이벤트를 생성하려고합니다. 그러나 나는 이것이 간단 할 것이라고 생각했지만, 나는 길을 잃은 것처럼 보였고 어디서 잘못되었는지 확신하지 못했습니다.WebView에서 클릭 이벤트 생성

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

그러나 마우스 이벤트는 사용할 수없는 것 같습니다. 나는 어떤 도움을 주셔서 감사합니다.

+0

JS 스크립트로 전화 할 수 있습니다. – CodaFi

+0

Obj-C에서 모두 수행하는 것을 선호합니다. –

+0

@CodaFi JS를 사용하는 일부 경우에는이 질문과 같이 실제로 작동하지 않습니다. http://stackoverflow.com/questions/4347116/trigger-css-hover-with-js –

답변

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를 믿습니다. 나는이 해결책을이 MozDev createEvent article에있는 JavaScript를 보지 못하도록 발견했다고 생각한다.


또한 AVAILABLE_AFTER_WEBKIT_VERSION_5_1으로 표시된 웹킷의 DOMHTMLElement.h에서 -[DOMHTMLElement click] 방법을 참고.


마지막으로, 나는 때때로 완전히 사용자 "마우스 클릭"일반적으로 그것을 함께 모든 DOM 이벤트를 시뮬레이션 할 수 hackier 무언가에 의지해야했다. 난 단지 (이 복잡하고 추한 및 취성) 작품 위에 다른 사람이하면 아무것도 시도하지 않을 것이다 :

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이 코드를 많이 가지고있다.

+0

마지막 접근 방식이 좋습니다. 그렇다면이 사건에 대해 어떻게 객관적인 C 코드를 실행합니까? 예를 들어 사용자가 웹보기를 클릭하면 다른 창 컨트롤러를 열려고합니다. –

+0

다른 질문입니다. 적절한 질문을 새 질문 형태로 제시하십시오. 그리고 그것이 당신에게 유용했다면이 대답을 upvote. –