2013-03-13 2 views
3

Я пытаюсь создать событие click на конкретном DOMNode через пункт меню на Mac. Я думал, что это будет довольно просто, но я, кажется, попал в блокпост и не знаю, где я ошибся.Создание события 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-Script – 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-интерфейсы модуля. Я думаю, что нашел это решение, посмотрев на JavaScript на этом MozDev createEvent article.


отметить также метод -[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.

+0

Этот последний подход выглядит великолепно. Но как вы выполняете объективный код C на этих событиях? Например, я хочу открыть другой оконный контроллер, когда пользователь нажимает на веб-представление. –

+0

Это другой вопрос. Представьте свой вопрос в виде нового вопроса с соответствующими тегами. И поддержите этот ответ, если он был вам полезен. –

Смежные вопросы