当前位置:  开发笔记 > 编程语言 > 正文

嵌入式Webkit - 脚本回调如何?

如何解决《嵌入式Webkit-脚本回调如何?》经验,为你挑选了1个好方法。

在Windows上,当"Shell.Explorer"ActiveX控件嵌入到应用程序中时,可以在实现IDispatch的对象上注册"外部"处理程序,以便网页上的脚本可以调用托管应用程序.


现在,我转向Mac开发,并认为我可以从我的Cocoa应用程序中嵌入的WebKit中获得类似的功能.但是,似乎没有任何工具允许脚本回调到托管应用程序.

一条建议是挂钩window.alert并获取脚本以将格式化的消息字符串作为警报字符串传递.我也想知道是否可以使用NPPVpluginScriptableNPObject将WebKit定向到应用程序托管的NPAPI插件.

我错过了什么吗?托管WebView并允许脚本与主机交互真的很难吗?



1> Rob Keniger..:

您需要实现各种WebScripting协议方法.这是一个基本的例子:

@interface WebController : NSObject
{
    IBOutlet WebView* webView;
}

@end

@implementation WebController

//this returns a nice name for the method in the JavaScript environment
+(NSString*)webScriptNameForSelector:(SEL)sel
{
    if(sel == @selector(logJavaScriptString:))
        return @"log";
    return nil;
}

//this allows JavaScript to call the -logJavaScriptString: method
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel
{
    if(sel == @selector(logJavaScriptString:))
        return NO;
    return YES;
}

//called when the nib objects are available, so do initial setup
- (void)awakeFromNib
{
    //set this class as the web view's frame load delegate 
    //we will then be notified when the scripting environment 
    //becomes available in the page
    [webView setFrameLoadDelegate:self];

    //load a file called 'page.html' from the app bundle into the WebView
    NSString* pagePath = [[NSBundle mainBundle] pathForResource:@"page" ofType:@"html"];
    NSURL* pageURL = [NSURL fileURLWithPath:pagePath];
    [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:pageURL]];
}


//this is a simple log command
- (void)logJavaScriptString:(NSString*) logText
{
    NSLog(@"JavaScript: %@",logText);
}

//this is called as soon as the script environment is ready in the webview
- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame
{
    //add the controller to the script environment
    //the "Cocoa" object will now be available to JavaScript
    [windowScriptObject setValue:self forKey:@"Cocoa"];
}

@end

在控制器中实现此代码后,您现在可以Cocoa.log('foo');从JavaScript环境调用,并将调用该logJavaScriptString:方法.


意识到!!!![windowScriptObject setValue:self forKey:@"Cocoa"]; 保持强大的引用,给定的代码(传递self)将创建一个保留周期(只是解决了这个问题)
推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有