web-dev-qa-db-fra.com

comment intercepter un clic de bouton dans UIWebview sur IOS?

J'ai un formulaire HTML qui contient certains champs que j'ouvre dans UIWebview. En cliquant sur un bouton particulier, je souhaite effectuer une action intégrée.

L'approche que j'utilise actuellement est en cliquant sur le bouton, je redirige la page vers une URL factice. Je détecte l'URL à l'aide de la méthode déléguée "shouldStartLoadWithRequest" et arrête la redirection. Je fais ensuite mon événement personnalisé (capturer une image et le télécharger), puis je continue. Cela semble être un bidule laid. Quoi qu'il en soit, je peux directement accrocher l'événement clic du bouton plutôt qu'une redirection de page?

UPDATE Il semble n'y avoir aucun moyen de configurer une méthode de délégation à déclencher lorsqu'une fonction JS est appelée par un clic de bouton. La seule façon de procéder consiste à utiliser la méthode de détection d’URL mentionnée ci-dessus. Ceci a été expliqué en détail par joern ci-dessous, je vais donc accepter sa réponse.

29
B K

Vous pouvez faire ce qui suit:

Dans votre HTML

<a class="yourButton" href="inapp://capture">Button Text</a>

Dans votre UIWebViewDelegate

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
   if ([request.URL.scheme isEqualToString:@"inapp"]) {
      if ([request.URL.Host isEqualToString:@"capture"]) {
         // do capture action
      }  
      return NO;
   }  
   return YES;
}

J'ai ajouté "capture" à l'URL de votre bouton afin que vous puissiez distinguer plusieurs boutons devant déclencher différentes actions (si vous le souhaitez):

55
joern

Ce code:

<a class="yourButton" href="inapp://capture">Restart</a>

ça ne marche pas pour moi. 

J'ai ajouté "inapp: // capture" dans mon code javascript pour la fonction événement

KeyboardInputManager.prototype.restart = function (event) {
  window.location.href = "inapp://capture";
  //other code
};

Aussi, j'utilise UIWebViewDelegate et ça marche pour iOS 8, 9.

3
Malder

Pour Swift 4.2

Code du bouton côté HTML:

<a class="catch-iOS" href="inapp://home">Продолжить покупки</a>

Méthode UIWebViewDelegate:

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
    if request.url?.scheme == "inapp" {
        if request.url?.Host == "home" {
            // do something
        }
    }
    return true
}
0
akonoplev