Cocoa WebView Problems(window.open , innerhtml , scroll position)

Cocoa WebView Problems(window.open , innerhtml , scroll position),第1张

概述很多时候,我们都在忙于解决问题,而不善于对解决问题中所使用的知识进行总结梳理,以至于过几天就想不起来,那几天自己干了什么,学到了什么。 这个周末主要研究解决了WebView相关的几个问题: 1.如何捕获WebView中javascript的window.open事件,并通过系统默认的浏览器打开 我需要在webview的页面中通过window.open的方式打开一个链接,但是发现在webview中根

很多时候,我们都在忙于解决问题,而不善于对解决问题中所使用的知识进行总结梳理,以至于过几天就想不起来,那几天自己干了什么,学到了什么。


这个周末主要研究解决了WebVIEw相关的几个问题:

1.如何捕获WebVIEw中JavaScript的window.open事件,并通过系统默认的浏览器打开

我需要在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 }
2.WebVIEw的DOM以及INNERHTML的 *** 作

这个就比较简单了,直接贴代码,不过实现的方法可以有多种,你可以通过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的对象。
获取信息

NSScrollView  *scrollVIEw  ] frameVIEw ] documentVIEw ] enclosingScrollVIEw // get the current scroll position of the document vIEw
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)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1065640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存