很多时候,我们都在忙于解决问题,而不善于对解决问题中所使用的知识进行总结梳理,以至于过几天就想不起来,那几天自己干了什么,学到了什么。
我需要在webvIEw的页面中通过window.open的方式打开一个链接,但是发现在webvIEw中根本不起作用,通过Google发现,想要在Js中实现诸如alert窗口,window.open的动作,都得自己写方法来实现,比如alert窗口的话,你需要设置webvIEw的WebUIDelegate,然后在delegate中实现webVIEw:runJavaScriptAlertPanelWithMessage:initiatedByFrame:方法便可。
但是window.open找了很多地方都没有一个能行的。
首先有点是很肯定的,就是直接超连接的方式我们可以通过设置webvIEw的WebPolicyDelegate,然后在此delegate中实现webVIEw:decIDePolicyForNewWindowAction:request:newFramename:decisionListener:(针对在新窗口中打开链接的target=”_blank”的情况)或者webVIEw:decIDePolicyForNavigationAction:request:frame:decisionListener:(所有的普通链接的加载),实现这些方法,我们就可以控制打开链接的方式,因为我们可以在这里获取请求的url是什么,下面进行什么 *** 作就可以由我们自己来决定了。但是,Js中的window.open确实是不调用这些代理方法的。后来终于找到些眉头,我们再次回到WebUIDelegate,发现window.open后,会调用WebUIDelegate中的
- (WebVIEw *)webVIEw:(WebVIEw *)sender createWebVIEwWithRequest:(NSURLRequest *)request;
方法,不过这里接受的request为nil,所以这里无法获取请求的url信息,但是这里你需要返回一个webvIEw的指针,也就是说,在webvIEw中,window.open需要你准备一个新的webvIEw用来处理open的事情。于是就在这里新建一个webvIEw并返回,在返回之前设置好这个新的webvIEw的WebPolicyDelegate方法,然后通过它的
- (voID)webVIEw:(WebVIEw *)sender decIDePolicyForNavigationAction:(NSDictionary *)actioninformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(ID)Listener
在处理url。
下面是简单的代码片段
1 2 3 4 5 6 7 8 9 10 11 12 13 | - (WebVIEw * )webVIEw : )sender createWebVIEwWithRequest ( NSURLRequest )request { WebVIEw *_hIDdenWebVIEw = [ [WebVIEw alloc ] init ]; [_hIDdenWebVIEw setPolicyDelegate :self return _hIDdenWebVIEw; } ( voID )sender decIDePolicyForNavigationAction ( NSDictionary )actioninformation request )request frame (WebFrame )frame decisionListener (ID<WebPolicyDecisionListener> )Listener NSLog ( @ "%@",[actioninformation objectForKey :WebActionoriginalURLKey ] absoluteString ] ); [ NSWorkspace shareDWorkspace ] openURL [sender release } |
这个就比较简单了,直接贴代码,不过实现的方法可以有多种,你可以通过Js的方法,也可以通过Cocoa中的DOM对象的方式
DOMdocument *dom [webVIEw mainFrame ] DOMdocument DOMHTMLElement *myEle (DOMHTMLElement ) [dom getElementByID : "mydiv" [myEle setINNERHTML [ NSString stringWithFormat "blablabla" ]; 3.WebVIEw的Scroll position的保存及恢复的方案这个的解决方法也是有多种的,比如有Js的解决方法,基本思路就是通过Js来获取当前窗口的scroll position的信息
方案一:Js的方法比如
NSString *yOffsetString = [webVIEw stringByEvaluatingJavaScriptFromString "window.pageYOffset" ];可以获取y方向的便宜量的字符串格式的值,我们可以将这个值暂存下,到需要使用的时候在设置回去
:"scroll(0,%@);",yOffsetString ]; 方案二:NSScrollVIEw的方法
我们看到webvIEw的scrollbar,肯定可以想到webvIEw在某个地方内置了一个NSScrollVIEw的对象。
获取信息
NSRect scrollVIEwBounds [scrollVIEw contentVIEw ] bounds NSPoint *scrollposition =scrollVIEwBounds.origin;
设置为止
];[scrollVIEw documentVIEw ] scrollPoint :scrollposition ];
这样窗口显示的位置就是之前记住的位置了,是不是很简单呢。
碰到问题的时候多用用Google和stackoverflow.com
总结以上是内存溢出为你收集整理的Cocoa WebView Problems(window.open , innerhtml , scroll position)全部内容,希望文章能够帮你解决Cocoa WebView Problems(window.open , innerhtml , scroll position)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)