Windows XP 2001 年推出,微軟要繼續支援 Windows XP 到 2020 年,也就是長達 19 還是 20 年。在台灣,判一個無期徒刑都不用關這麼久。
Briefs 1.0 開放原始碼。不過老實說,我一直搞不太清楚這個東西可以有什麼實際的用途。
如之前所說。如果你有一段 Javascript 是這樣:
function x(x) {
return x + 1;
}
用 ObjeC controller 要 webView 產生上面那段 Javascript code,會是這樣:
WebScriptObject *obj = [webView windowScriptObject];
NSString *s = @"function x(x) { return x + 1};";
[obj evaluateWebScript:s];
非常想不開的話,你會寫成這樣:
#import <JavaScriptCore/JavaScript.h>
JSGlobalContextRef ctx = [[webView mainFrame] globalContext];
JSStringRef xName = JSStringCreateWithUTF8CString("x");
JSStringRef parameters0 = JSStringCreateWithUTF8CString("x");
JSStringRef parameters[1] = {parameters0};
JSStringRef body = JSStringCreateWithUTF8CString("return x + 1");
JSObjectRef x = JSObjectMakeFunction(ctx, xName, 1, parameters, body, NULL, 0, NULL);
JSStringRelease(xName);
JSStringRelease(parameters0);
JSStringRelease(body);
JSValueRef argument0 = JSValueMakeNumber(ctx, 1);
JSValueRef arguments[1] = {argument0};
JSValueRef result = JSObjectCallAsFunction(ctx, x, NULL, 1, arguments, NULL);
double r = JSValueToNumber(ctx, result, NULL);
NSLog(@"r:%f", r);
如果我們定義了一個叫做 x() 的 JS function,在 JS 裡頭要拿到他,有兩種不同的狀況:
所以 windowScriptObject 就會有兩種狀況,分別對應上面兩種狀況:
如果我們想要讓我們的 controller object 與 webView 裡頭的 Javascript 溝通,其中一個關鍵就是 WebView 的 -(id)windowScriptObject。我們這邊先講從 ObjC 送東西到網頁裡頭,或是從 ObjC抓網頁裡頭的東西,先不談怎麼從 JS 送東西到 ObjC。
簡單講,在 Javascript 裡頭,有一個物件叫做 window,而這個物件在 ObjC 中,就是 [webView windowScriptObject]。在 JS 裡頭,如果沒有特別定義,直接寫一個簡單的 function,這個 function 其實就會變成 window 的成員。回到前一篇的 JS code
function x(x) {
return x + 1;
}
其實意思就是:
window.x = function(x) {
return x + 1;
}
而其實這整段 function 都是一個物件,在 ObjC 中,我們如果想要拿 window.x ,就會拿到一個代表 window.x 的 WebScriptObject。而要拿 window.x,就是拿 windowScriptObject 的一個叫做 x 的屬性,所以我們這麼寫:
WebScriptObject *xobj = [[webView windowScriptObject] valueForKey:@"x"];
如果我們想要執行 x (也就是呼叫 x(),或 window.x()),有兩種方法,一種是要求 windowScriptObject 執行叫做 x 的 method,像是這麼寫:
result = [[webView windowScriptObject] callWebScriptMethod:@"x" withArguments:[NSArray arrayWithObjects:[NSNumber numberWithInt:1], nil]]; NSLog(@"result:%@", result);
這段 code 相當於在 JS 中呼叫 window.x(1),注意,數字要包裝成 NSNumber 傳過去。另外一種方法是,我們直接先去拿 window.x 這個 WebScriptObject,然後由這個物件執行自己(對,JS 的 function 本身就是物件,所以可以先用物件的方式拿,然後物件自己執行自己),我們可以用 apply 或是 call。在 JS 裡頭是這樣:
x.apply(x, [1]); x.call(x, 1);
ObjC 裡頭就會變成這樣:
id result = [x callWebScriptMethod:@"call" withArguments:[NSArray arrayWithObjects:x, [NSNumber numberWithInt:1], nil]]; id result = [x callWebScriptMethod:@"apply" withArguments:[NSArray arrayWithObjects:x, [NSArray arrayWithObject:[NSNumber numberWithInt:1]], nil]];
話說 Javascript 這個語言真是哭么的難懂。
在 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);
If you are working on a controller object which owns a WebView as its user interface, or a WebKit plug-in, you can use Javascript to call the methods of your controller object or plug-in. The Javascript-Objective C bridge can help you to convert the Javascript string to NSString, and convert Javascript number to NSNumber. However, if you pass a array from your Javascript code to your Objective C objects, the array will not be convert to NSArray, its class remains WebScriptObject.
If we want to obtain the content of a Javascript array, we have to use the interface of WebScriptObject. Suppose we have a Javascript array which contains various strings, we may try to get each element in the array by using the following code:
WebScriptObject *obj = (WebScriptObject *)JSArray;
NSUInteger count = [[obj valueForKey:@"length"] integerValue];
NSMutableArray *a = [NSMutableArray array];
for (NSUInteger i = 0; i < count; i++) {
NSString *item = [obj webScriptValueAtIndex:i];
if ([item isKindOfClass:[NSString class]]) {
[a addObject:item];
}
}
台灣詐騙集團技術世界第一,不但日韓警方來台取經,就連香港的詐騙集團,也派人來台灣向詐騙集團學技術!
六名被捕嫌犯當中,其中一名四十二歲的朱姓男子,由於口音特殊,在追問之下,才發現是港仔來台學技術,而朱姓男子來台期間,也和詐騙集團成員一樣,每週一到週六,都過著軍事化的管理生活,平常不得對外連絡,只有星期天才放風休假,包括每一線人員的分紅制度和教戰手則,朱姓男子也坦承,台灣的詐騙集團真的組織嚴密,令人大開眼界。
怎麼台灣詐騙集團的平時生活聽起來像富士康一樣;看來我應該不適合這個行業。
漢堡王推披薩堡 熱量高達2500卡 | 國際新聞 | 蘋果日報 | 20100823 | 昔日新聞 | 壹蘋果網絡
鄉親啊,這就是物質文明啊!