在 Mac Webview 中 Objective-c 与 JS 交互

http://blog.eqoe.cn/posts/mac-webview-js-oc.html


本文为您图文演示如何在 OC 中注册或运行 JS 函数,以实现网页与程序的交互。

1. 首先我们创建一个 XCode 项目;

2. 添加WebView 到ViewController中,

3. 在ViewController.h中申明webview成员变量,并建立关联。

@interface ViewController : NSViewController
{
	IBOutlet WebView* webView;
}

4. 在ViewController.mm中进行实现

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
	[super viewDidLoad];

	// Do any additional setup after loading the view.
}

- (void)setRepresentedObject:(id)representedObject {
	[super setRepresentedObject:representedObject];

	// Update the view, if already loaded.
}

+(NSString*)webScriptNameForSelector:(SEL)sel
{
	if(sel == @selector(Writelog:)) //JS对应的本地函数
		return @"log"; // 要注册的JS函数名
	else if(sel == @selector(alert:))
		return @"alert";
	return nil;
}

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel
{
	if(sel == @selector(Writelog:))//JS对应的本地函数
		return NO;
	else if(sel == @selector(alert:))
		return NO;
	return YES; //返回 YES 表示函数被排除,不会在网页上注册
}

- (void)awakeFromNib //当 WebContoller 加载完成后执行的动作
{
	[webView setFrameLoadDelegate:self];
	
	[[webView mainFrame] loadHTMLString:@"<button οnclick=\"window.external.alert('This is an alert!!');\">Alert</button> <button οnclick=\"window.external.log('lllllaaaa');\">Log</button>" baseURL:nil];
	//网页内容,两个按钮 一个弹出消息框,一个在控制台 Log
	
	// webView.mainFrameURL = @"http://someurl"; 加载网页
}

- (void)Writelog:(NSString*) txt
{
	NSLog(@"Log:%@",txt);
}

- (void)alert:(NSString*) txt
{
	NSAlert *alert = [[NSAlert alloc] init];
	[alert setAlertStyle:NSInformationalAlertStyle];
	[alert setMessageText:@"来自网页的消息"];
	[alert setInformativeText:txt];
	[alert runModal];
}

- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame //网页加载完成后发生的动作
{
	[windowScriptObject setValue:self forKeyPath:@"window.external"]; // 注册一个 window.external 的 Javascript 类
}



@end

5. 添加库 依赖,WebKit.framework



6. 代码说明

(A)

- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame //网页加载完成后发生的动作
{
    [windowScriptObject setValue:self forKeyPath:@"window.external"]; // 注册一个 window.external 的 Javascript 类
}

"window.external"为Javascript的类,函数有:“window.external.alert()” 和 “window.external.log()”,所以需要在下面B,和C中说明;

(B) js函数名和本地函数进行映射;

+(NSString*)webScriptNameForSelector:(SEL)sel
{
	if(sel == @selector(Writelog:)) //JS对应的本地函数
		return @"log"; // 要注册的JS函数名
	else if(sel == @selector(alert:))
		return @"alert";
	return nil;
}

(C)  将本地函数,注册到网页中;

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel
{
	if(sel == @selector(Writelog:))//JS对应的本地函数
		return NO;
	else if(sel == @selector(alert:))
		return NO;
	return YES; //返回 YES 表示函数被排除,不会在网页上注册
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值