iOS中JavaScript和OC交互

OC調(diào)用JS

Objective-C語言調(diào)用JavaScript語言,是通過UIWebView的 - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;的方法來實現(xiàn)的。該方法向UIWebView傳遞一段需要執(zhí)行的JavaScript代碼最后獲取執(zhí)行結(jié)果。

需要注入的js代碼

static NSString * const kTouchJavaScriptString =

@"document.ontouchstart = function (event) {\
x = event.targetTouches[0].clientX;\
y = event.targetTouches[0].clientY;\
document.location = \"myweb:touch:start:\"+x+\":\"+y;};\
document.ontouchmove = function (event) {\
x = event.targetTouches[0].clientX;\
y = event.targetTouches[0].clientY;\
document.location = \"myweb:touch:move\"+x+\":\"+y;};\
document.ontouchcancel = function (event) {\
document.location = \"myweb:touch:cancel\";};\
document.ontouchend=function(event){\
document.location=\"myweb:touch:end\";};";
//
-(void)webViewDidFinishLoad:(UIWebView *)webView {
//執(zhí)行JS注入的函數(shù)
    [self.webView stringByEvaluatingJavaScriptFromString:kTouchJavaScriptString];
}

JS調(diào)用OC

JavaScript語言調(diào)用Objective-C語言票从,并沒有現(xiàn)成的API,但是有些方法可以達到相應(yīng)的效果屑迂。具體是利用UIWebView的特性:在UIWebView的內(nèi)發(fā)起的所有網(wǎng)絡(luò)請求竿音,都可以通過delegate函數(shù)得到通知。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    
    NSString *requestString = [[request URL] absoluteString];
   
    NSArray *components = [requestString componentsSeparatedByString:@":"];
    //處理JavaScript和Objective-C交互
    if ([components count] > 1 && [(NSString *)[components objectAtIndex:0]
                                   isEqualToString:@"myweb"]) {
        if([(NSString *)[components objectAtIndex:1] isEqualToString:@"touch"]) {
            if ([(NSString *)[components objectAtIndex:2] isEqualToString:@"start"]) {
                
                _gesState = GESTURE_STATE_START;
                NSLog(@"touch start!");
                
                float ptX = [[components objectAtIndex:3] floatValue];
                float ptY = [[components objectAtIndex:4] floatValue];
                NSLog(@"touch point (%f, %f)", ptX, ptY);
                
                NSString *js = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).tagName", ptX, ptY];
                NSString *tagName = [self.webView stringByEvaluatingJavaScriptFromString:js];
                _imgURL = nil;
                if ([tagName isEqualToString:@"IMG"]) {
                    _imgURL = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).src", ptX, ptY];
                }
                if (_imgURL) {
                    _timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(handleLongTouch) userInfo:nil repeats:NO];
                }
            }
            else if ([(NSString *)[components objectAtIndex:2] isEqualToString:@"move"]) {
                //**如果touch動作是滑動窄坦,則取消hanleLongTouch動作**//
                _gesState = GESTURE_STATE_MOVE;
                NSLog(@"you are move");
                
            } else if ([(NSString*)[components objectAtIndex:2]isEqualToString:@"end"]) {
                [_timer invalidate];
                _timer = nil;
                _gesState = GESTURE_STATE_END;
                NSLog(@"touch end");
            }
        }
        
        return NO;
    }
    return YES;
}

說明:

1唤反、同步和異步的問題

(1)Objective-C調(diào)用JavaScript代碼的時候是同步的

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

(2)JavaScript調(diào)用Objective-C代碼的時候是異步的

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

參考:
http://blog.devzeng.com/blog/ios-uiwebview-interaction-with-javascript.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸭津,隨后出現(xiàn)的幾起案子彤侍,更是在濱河造成了極大的恐慌,老刑警劉巖曙博,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拥刻,死亡現(xiàn)場離奇詭異,居然都是意外死亡父泳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門吴汪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惠窄,“玉大人,你說我怎么就攤上這事漾橙「巳冢” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵霜运,是天一觀的道長脾歇。 經(jīng)常有香客問我,道長淘捡,這世上最難降的妖魔是什么藕各? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮焦除,結(jié)果婚禮上激况,老公的妹妹穿的比我還像新娘。我一直安慰自己膘魄,他們只是感情好乌逐,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著创葡,像睡著了一般浙踢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灿渴,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天洛波,我揣著相機與錄音呐芥,去河邊找鬼。 笑死奋岁,一個胖子當著我的面吹牛思瘟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闻伶,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼滨攻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蓝翰?” 一聲冷哼從身側(cè)響起光绕,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畜份,沒想到半個月后诞帐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡爆雹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年停蕉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钙态。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡慧起,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出册倒,到底是詐尸還是另有隱情蚓挤,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布驻子,位于F島的核電站灿意,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏崇呵。R本人自食惡果不足惜缤剧,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望演熟。 院中可真熱鬧鞭执,春花似錦、人聲如沸芒粹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽化漆。三九已至估脆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間座云,已是汗流浹背疙赠。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工付材, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人圃阳。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓厌衔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捍岳。 傳聞我的和親對象是個殘疾皇子富寿,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容