私は長い間検索してきましたが、現時点では、ソフト キーボードをプログラムで表示する PhoneGap / Cordova アプリケーションの実用的なソリューションは見つかりませんでした。
シナリオ:
PhoneGap アプリケーション (jQuery Mobile で作成された Web サイト) があり、ある時点でユーザーにダイアログを表示します。このダイアログも Web ページであり、ユーザーがコードを入力する 1 つの INPUT テキスト ボックスがあります。
問題:
コード ダイアログが表示されると、入力ボックスは JavaScript を使用してフォーカスされます。ただし、iPhone の内部ブラウザーに課せられた制限により、ユーザーが実際に入力テキスト ボックス内をクリックするまで、ソフト キーボードは表示されません。
私たちが試したこと:
- 非表示のテキスト ボックスを作成し、ファーストレスポンダにする
- 入力が JavaScript を介してフォーカスを受け取ると、実際のwebview をファーストレスポンダーにする
- sendActionsForControlEventsを使用してTouch イベントを webview に配信しようとします (ただし、私は iOS コーディングの専門家ではないため、PhoneGap アプリケーションの動作するコードを誰かが持っている場合は、共有していただければ幸いです)
何か案は?
編集:この質問で言及されている制限は、組み込みブラウザーのみを対象としています... Opera を目指している場合は、次のコードを使用することで成功します:
var e = jQuery.Event("keydown", { keyCode: 37 });
$('#element').focus().trigger(e);
EDIT2:これは、プラグインで使用できる最終的な PhoneGap コードです。
キーボードヘルパー.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
キーボードヘルパー.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);
}
};