真的就是亂寫用的筆記

在 Cocoa 裡頭,如果我們想要直接操作 WebView 裡頭的物件,而不僅只是滿足於讓 WebView 單單去 load NSURLRequest,大概有兩種主要的操作方式,一種是直接操作 DOM 物件,另外一種就是透過 WebScriptObject 操作。現在來講一下 WebScriptObject,其實前面那一篇講 JS Array 轉成 NSArray 也是這樣的東西。

老實說,蘋果文件裡頭對於 WebScriptObject 講得實在不清不楚。WebScriptObject 簡單講就是網頁裡頭的 Javascript 物件,在 Javascript 裡頭不管是 function 或是 array,基本上都是一個物件,除了最基本的字串與數字外,我們要在 Objc 與 JS 之間,都是傳遞 WebScriptObject。

真的要說起來有點麻煩,而且也是這兩天才比較搞懂裡頭是什麼東西。我們先來一個簡單的例子,假如我們的網頁裡頭,有這麼一個簡單的 JS:

function x(x) {
	return x + 1;
}
result = window.x(1);
alert(result);

我們在 ObjC 裡頭-假如我們現在有一個 ObjC controller 物件,這個物件有一個 WebView,是這個 controller 的成員變數,名稱叫做 webView,我們想要用 ObjC 直接產生像上面那樣的 JS 的話,就會是:

WebScriptObject *obj = [webView windowScriptObject];
NSString *s = @"function x(x) { return x + 1};";
[obj evaluateWebScript:s];
WebScriptObject *x = [obj valueForKey:@"x"];
NSLog(@"x:%@", x);
id result = [x callWebScriptMethod:@"call" withArguments:[NSArray arrayWithObjects:x, [NSNumber numberWithInt:1], nil]];
NSLog(@"result:%@", result);
1 year ago