web-dev-qa-db-fra.com

iOS - Solution de contournement pour se concentrer manuellement sur une entrée / zone de texte

J'ai donc vu beaucoup de discussions sur le problème iOS avec la focalisation sur un élément d'entrée/zone de texte. (Voir ici et ici ) Il semble qu'iOS ne vous permette pas de vous concentrer manuellement sur l'un de ces éléments, et exige qu'il soit un véritable tap/click pour se concentrer sur le élément.

J'ai essayé de simuler un clic, de déclencher un clic, de faire simplement click () tout de suite ... toutes sortes de choses.

Voici ma solution de contournement actuelle que j'essaie de mettre en œuvre:

$scope.gotoElement = function(eID) {
    // call $anchorScroll()
    $scope.smoothScrollTo(eID).then(function() {
        clickElement('#textarea');
    });          
}

function clickElement(e) {
  $(e).on('touchstart', function() {
    //$(e).val('touchstart');
    $(e).focus();
  });

  $(e).trigger('touchstart');
}

Vous n'avez pas à vous soucier de la fonction de défilement, je sais que cela fonctionne et je l'ai suffisamment testé. Le $(e).val('touchstart') commenté fonctionne sans problème pour modifier le texte de la zone de texte, mais le .focus() ne fonctionne pas sur iOS. J'ai testé cela sur un appareil Android et cela fonctionne bien, mais sur iOS, il ne fait tout simplement pas apparaître le clavier. Parfois, il commencera à faire apparaître le clavier pendant une demi-seconde et puis disparaître à nouveau.

J'ai regardé d'autres fils comme je l'ai mentionné ci-dessus, et je n'arrive pas à comprendre comment écrire une solution de contournement pour cela.

Des idées?

42
germainelol

J'ai également harcelé ce même problème. mon problème résolu par une simple propriété css qui est -webkit-user-select:none J'ai supprimé cela et tout fonctionne bien. essayez ceci.

13
Yogesh Jagdale

Sur votre UIWebView, définissez keyboardDisplayRequiresUserAction sur NO.

12
Peyman

J'ai utilisé iPad Air [iOS 7.0.4], iPad Mini [iOS 7.1] et jQuery [1.11.3] pour mon test.

L'événement .focus a parfaitement fonctionné pour moi à la fois dans les champs de saisie et de texte.

Je colle le code ci-dessous avec lequel j'ai testé. Veuillez me faire savoir si je manque quelque chose.

Est-ce pour une version précédente d'iOS/jQuery?

Mon HTML,

<body>
    <!--<input id="in" type="text"/>-->
    <textarea id="in"></textarea>
    <button id="btn">Add Focus</button>
</body>

Ma requête,

$('#btn').click(function(){
    $('#in').focus();
})
2
Suman Barick

Version WKWebView de keyboardDisplayRequiresUserAction = NO de thedyrt/cordova-plugin-wkwebview-engine :

#import <objc/runtime.h>

- (void) viewDidLoad {
    ...

    SEL sel = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:userObject:");
    Class WKContentView = NSClassFromString(@"WKContentView");
    Method method = class_getInstanceMethod(WKContentView, sel);
    IMP originalImp = method_getImplementation(method);
    IMP imp = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, id arg3) {
        ((void (*)(id, SEL, void*, BOOL, BOOL, id))originalImp)(me, sel, arg0, TRUE, arg2, arg3);
    });
    method_setImplementation(method, imp);
}
0
bendytree