2010-12-07 4 views
5

(sous la direction de donner une meilleure description de la réponse que j'ai donné)Obtenir un WebView d'agir exactement comme Safari

J'ai créé un navigateur très simple dans InterfaceBuilder constitué d'une barre de navigation et un WebView.

Tout fonctionne bien sauf lorsque j'essaie de tabuler entre les champs de saisie est le webview, le focus va à la barre de navigation. Je suppose que je dois faire quelque chose avec la chaîne du répondeur, mais je n'ai pas été capable de comprendre quoi.

Un conseil?

Merci, Kelly

+0

Un certain nombre de choses doivent être ajoutées ici. Pour la plupart des sites Web, l'initialFirstResponder de la fenêtre sur le webview a résolu mon problème. Cependant, j'avais toujours des problèmes étranges en utilisant mon framework javascript (cappuccino). D'après ce que je peux dire, la plupart des navigateurs Web envoient un événement dom 'keydown' avec un keyCode de 9 et un charCode de 0 lorsque vous appuyez sur la touche de tabulation.Le webview envoie un événement dom de keydown qui a keyCode et charCode mis à 9, qui confondait le cadre. Si je trouve comment résoudre ce problème, je reviendrai. –

Répondre

12

Il n'y a probablement personne d'autre dans le monde qui se soucie de cela, mais je vais y répondre au cas où quelqu'un a besoin de ce à un moment donné.

Comme je l'ai mentionné dans les commentaires, j'utilise le framework cappuccino et j'avais 3 problèmes différents.

Laissez-moi vous donner la configuration ici. Je créais une application de cacao avec un WebView incorporé et chargeant une page avec une application de cappuccino dedans. Au premier tabulation entre les champs ne fonctionne pas tout à fait pour n'importe quelle forme sur n'importe quelle page Web.

  1. Comme je l'ai dit dans les commentaires, si vous utilisez IB, vous pouvez définir les fenêtres de la initialFirstResponder 'être le WebView, et au moins les formes fonctionnent correctement « normales ». Cappuccino n'a toujours pas.
  2. Deuxième était le problème où keyCode et charCode dans l'événement dom était différent de WebView dans le cacao à Safari. Il se trouve qu'il y a quelque chose qui s'appelle le mode 'keyboard quirks'. Si vous cherchez _needsKeyboardEventDisambiguationQuirks dans la WebView ObjC classe source vous verrez qu'il fait une exception pour le safari, l'éteindre. Il est censé le désactiver pour les anciennes versions de WebKit, mais ce n'est pas le cas. voir webkit bug 32694 Pour résoudre ce problème, j'ai dû faire deux choses différentes. a) remplacer _needsKeyboardEventDisambiguationQuirks pour qu'il renvoie NO b) si le WebView est déjà instancié lorsque vous remplacez cette méthode, vous devrez également appeler le [[webviewinstance preferences] _postPreferencesChangesNotification] pour le faire fonctionner. Votre WebView envoie alors les événements DOM comme Safari. Enfin, cappuccino examinait la chaîne de l'agent utilisateur pour déterminer comment gérer certains éléments. Il vérifiait WebKit et Safari. J'ai criblé la chaîne d'agent utilisateur safari et l'ai définie en tant que chaîne d'agent utilisateur personnalisée pour le WebView.

    [mywebviewinstance setCustomUserAgent: @"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"] 
    

Enfin, tout a fonctionné comme il l'a fait en safari.

Espérons que cela aide quelqu'un!

Questions connexes