2011-02-04 2 views
2

этот раз я хочу знать, как определить, какая кнопка мыши в UIWebView .....Как использовать javascript в uiwebview, чтобы получить нажатую кнопку id?

appDelegate.mystring = [[NSMutableString string]init]; 
    NSString *[email protected]"<label><input type=\"submit\" name=\"button\" id=\"1\" value=\"Delete\" /></label>"; 

    for (int i=0; i<appDelegate.lyricsData.count; i++) { 
    NSString *b= @"<br>"; 
    NSString *st1=[[appDelegate.lyricsData objectAtIndex:i] objectForKey:@"user_name"]; 
    appDelegate.mystring=[appDelegate.mystring stringByAppendingString:st1]; 
    appDelegate.mystring=[appDelegate.mystring stringByAppendingString:b]; 
    NSString *st2=[[appDelegate.lyricsData objectAtIndex:i] objectForKey:@"added_date"]; 
    appDelegate.mystring=[appDelegate.mystring stringByAppendingString:st2]; 
    appDelegate.mystring=[appDelegate.mystring stringByAppendingString:b]; 
    NSString *st3=[[appDelegate.lyricsData objectAtIndex:i] objectForKey:@"verse"]; 

    appDelegate.mystring=[appDelegate.mystring stringByAppendingString:st3]; 
    appDelegate.mystring=[appDelegate.mystring stringByAppendingString:buttonstring]; 
    appDelegate.mystring=[appDelegate.mystring stringByAppendingString:b]; 
    appDelegate.mystring=[appDelegate.mystring stringByAppendingString:b]; 



    btn_back1_en.tag = i; 
    NSLog(@"%d",btn_back1_en.tag); 
    [btn_back1_en addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside]; 
    [buttonArray insertObject:btn_back1_en atIndex:i]; 
    [btn_back1_en release];  



    } 
    NSLog(@"My string %@",appDelegate.mystring); 

    UIWebView *mywebview = [[UIWebView alloc] initWithFrame:CGRectMake(0,70, 320, 240)]; 
    mywebview.backgroundColor=[UIColor clearColor]; 
    mywebview.opaque=NO; 
    mywebview.dataDetectorTypes= UIDataDetectorTypeNone; 



// working 
    NSString *htmlTempString = [NSString stringWithFormat:@"<html><head><meta name=\"viewport\" content=\"width=200; initial-scale=1.0; maximum-scale=0; user-scalable=0;\" /> </head>   <style> *{padding:0px;margin:0px;}.wrap{width:320px;background:#000000;color:#FFFFFF;font-family:'Myriad Pro',Arial, Helvetica, sans-serif; font-size:12px;}.head{ padding:15px 20px;background:url(images/bg.png) repeat-x bottom #383838;display:block; border:1px } .head-left{ float:left; width:54px;}.head-right{float:left; width:224px; clear:right; padding:0px 0px 8px 0px;} h1{ padding:0px; font-size:16px; color:#fff;} h2{ padding:0px; font-size:14px; color:#3a89d3;}small{ font-size:11px; color:#77c900; padding:0px;font-weight:normal;} b{ padding:0px;font-size:16px; color:#fff; }.comments{ background:url(images/bot-line.png) no-repeat bottom left; padding:10px 0px;}.comments h1{ padding:0px;font-size:16px; color:#fff; display:inline}.comments h2{ padding:0px;font-size:14px; color:#3a89d3; display:inline; margin:0px;}.comments small{ font-size:11px; color:#77c900; padding:0px; margin:0px 0px 0px 5px; font-weight:normal; display:inline;} .comments b{ padding:0px; margin:0px 0px 5px 5px; font-size:16px; color:#fff; display:inline} .status{padding:15px 20px;background:url(images/bg.png) repeat-x bottom #383838;display:block; margin:4px 0px; } </style> <body> <div class=\"wrap\"> <div class=\"head\"> <div class=\"head-left\"><img src=\"%@\" width=\"54\" height=\"54\" /></div> <div class=\"head-right\"> <h1>%@</h1> <h2>%@</h2> <small>on %@</small> </div> <br clear=\"all\" /> </div> <div class=\"status\"><b>%@</b><div class=\"comments\"><h2>%@ </h2></div><br clear=\"all\" /> </div></div> </body></html>",  
           appDelegate.profilepic,appDelegate.textfield,appDelegate.username,appDelegate.added_date,appDelegate.mytextview,appDelegate.mystring]; 




    [mywebview loadHTMLString:htmlTempString baseURL:nil]; 
    mywebview.delegate=self; 

/// Кнопка Код

- (IBAction)buttonClick:(id)sender{ 
    NSLog(@"button %@",[sender tag]); 
} 

ответ

0

Единственный метод, который я знаю, реализовав webView:shouldStartLoadWithRequest:navigationType метод протокола UIWebViewDelegate. Требуемые шаги заключаются в следующем:

1) Создайте новый класс подклассами из NSObject с именем, например MyWebViewDelegate. Вы можете реализовать только этот метод:

-(BOOL)webView:(UIWebView*)webView 
     sholdStartLoadWithRequest:(NSURLRequest *)request 
     navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSLog(@"%@", [[request URL] relativePath]); 
} 

2) Создать экземпляр делегата в свой код и установить его в качестве делегата от UIWebView до загрузки страницы:

MyWebViewDelegate *mydelegate = [[MyWebViewDelegate alloc] init]; 
mywebview.delegate = mydelegate; 

3), а затем попытаться отладки. Попробуйте установить точку останова внутри метода ..sholdStoadLoadWithRequest: .. и убедитесь, что приложение остановлено в этой точке останова. Возможно, вам удалось сделать небольшую редизайн вашей HTML-страницы для этого. После этого попытайтесь различить разные кнопки по значению параметра request.

2

Внутри вашего использования HTML кода этот фрагмент:

<html> 
<head> 

    <script> 

     function iOSNativeBridge(){ 

      this.sendRawMessageToiOS = function(message){ 
//    alert(message); 
       console.log("Message string to iOS: [" + message+ "]"); 
       var iframe = document.createElement("IFRAME"); 
       iframe.setAttribute("src", "jscall://" + message); 
       document.documentElement.appendChild(iframe); 
       iframe.parentNode.removeChild(iframe); 
       iframe = null; 
      }; 

     } 

     bridge = new iOSNativeBridge(); 


    </script> 


</head> 

<body> 

    <a href="javascript:bridge.sendRawMessageToiOS('your message');">link</a> 
    <input type="button" value="button val" name="button" id="1" onClick="javascript:bridge.sendRawMessageToiOS('your message');"> 

</body> 


</html> 

на родной стороне, в методе делегата UIWebView в:

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

    NSString *jsCallPrefix = @"jscall://"; 
    NSString *fullURLRequested = request.URL.absoluteString; 

    BOOL isJavaScriptCall = ([fullURLRequested hasPrefix:jsCallPrefix]); 

    if (isJavaScriptCall) { 
     NSString *messageConveyed = [fullURLRequested substringFromIndex:jsCallPrefix.length]; 
     NSLog(@"Your message was: %@", messageConveyed); 
     return NO; 
    } 

    return YES; 

} 

Что касается кода на веб стороне - я не жонглировать этот динамически созданный iframe без причины. На первый взгляд было бы достаточно просто изменить местоположение на странице веб-просмотра (call document.location.href = "jscall: // message"). Хуже всего то, что на самом деле выглядит отлично. К сожалению, если вы используете этот ярлык, таймеры JS сильно перепутаны. Поэтому мой совет - использовать этот маленький, странно выглядящие, но работает без каких-либо побочных эффектов «sendRawMessageToiOS» как есть :)

Немного более глубокое описание того, что происходит в коде выше: В веб-код, когда я хочу подтолкнуть некоторые данные к моей стороне приложения, я вызываю sendRawMessageToiOS (dataInStringToSend). Он создает iframe, добавляет его в дерево DOM и устанавливает его местоположение как «jscall: //» + dataInStringToSend Затем, как и ожидалось, делегат uiwebview спрашивает, готов ли я начать запрос к загрузить контент с данного адреса. Я проверяю, является ли это фактическим адресом (и возвращает ДА) или только этот маскарад со специальным префиксом «jscall: //». Если это специальный вызов, я читаю данные, переданные с ним, и отвечаю НЕТ (потому что веб-просмотр не должен запускать какой-либо реальный запрос).