Programmgesteuertes Anzeigen der Softtastatur auf dem iPhone in einer PhoneGap-Anwendung?

Ich habe lange gesucht und bis jetzt bin ich nicht auf eine gestoßenfunktionierende Lösung für PhoneGap / Cordova-Anwendungen, die programmgesteuert Softkeyboards anzeigen.

Szenario:

Wir haben eine PhoneGap-Anwendung - eine in jQuery Mobile erstellte Website -, die dem Benutzer zu einem bestimmten Zeitpunkt einen Dialog anzeigt. Dieser Dialog ist auch eine Webseite und hat ein einziges EINGABE-Textfeld, in das der Benutzer einen Code eingeben sollte.

Problem:

Wenn der Code-Dialog angezeigt wird, wird dieEingabefeld wird mit JavaScript fokussiert. Aufgrund von Einschränkungen im internen Browser des iPhones wird die Soft-Tastatur jedoch erst angezeigt, wenn der Benutzer tatsächlich auf das Eingabetextfeld klickt.

Was wir versucht haben:

ein ... Erstellenverstecktes Textfeld und machen eserster Rückmelderdas tatsächliche machenwebview ein ersthelfer Sobald die Eingabe über JavaScript den Fokus erhältmitsendActionsForControlEvents um zu versuchen, Touch-Ereignisse in die Webansicht zu übertragen (obwohl ich es begrüßen würde, wenn jemand einen funktionierenden Code für eine PhoneGap-Anwendung hätte, da ich kein Fachmann für iOS-Codierung bin)

Irgendwelche Ideen?

BEARBEITEN: Die in dieser Frage erwähnte Einschränkung gilt füreingebaute Browser nur ... wenn Sie auf Opera abzielen, werden Sie mit dem folgenden Code erfolgreich sein:

var e = jQuery.Event("keydown", { keyCode: 37 });
$('#element').focus().trigger(e);

EDIT2: Dies ist ein endgültiger funktionierender PhoneGap-Code, der in einem Plugin verwendet werden kann:

keyboardhelper.h

//
//  keyboardHelper.h
//  soft keyboard displaying plugin for PhoneGap
//
//  Copyright 2012 Martin Ambrus.
//

#import <Foundation/Foundation.h>
#ifdef CORDOVA_FRAMEWORK
#import <Cordova/CDVPlugin.h>
#else
#import "CDVPlugin.h"
#endif

@interface keyboardHelper : CDVPlugin {
    NSString *callbackID;
}

@property (nonatomic, copy) NSString *callbackID;

- (void)showKeyboard:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;

@end

keyboardhelper.m

//
//  keyboardHelper.m
//  soft keyboard displaying plugin for PhoneGap
//
//  Copyright 2012 Martin Ambrus.
//

#import "keyboardHelper.h"
#import "AppDelegate.h"

@implementation keyboardHelper
@synthesize callbackID;

-(void)showKeyboard:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options {
    self.callbackID = [arguments pop];

    //Get text field coordinate from webview. - You should do this after the webview gets loaded
    //myCustomDiv is a div in the html that contains the textField.
    int textFieldContainerHeightOutput = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetHeight;"] intValue];

    int textFieldContainerWidthOutput = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView  stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetWidth;"] intValue];

    int textFieldContainerYOffset = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView  stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetTop;"] intValue];

    int textFieldContainerXOffset = [[((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView  stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"myCustomDiv\").offsetLeft;"] intValue];

    UITextField *myTextField = [[UITextField alloc] initWithFrame: CGRectMake(textFieldContainerXOffset, textFieldContainerYOffset, textFieldContainerWidthOutput, textFieldContainerHeightOutput)];

    [((AppDelegate *)[[UIApplication sharedApplication] delegate]).viewController.webView addSubview:myTextField];
    myTextField.delegate = self;

    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: @"ok"];

    [self writeJavascript:[pluginResult toSuccessCallbackString:self.callbackID]];
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
//here you create your request to the server
return NO;
}

-(BOOL)textFieldDidEndEditing:(UITextField *)textField
{
//here you create your request to the server
return NO;
}

@end

Javascript

var keyboardHelper = {
    showKeyboard: function(types, success, fail) {
        return Cordova.exec(success, fail, "keyboardHelper", "showKeyboard", types);
    }
};

Antworten auf die Frage(7)

Ihre Antwort auf die Frage