我正在尝试使用PhoneGap开发一些iPhone应用程序。 PhoneGap基本上包装了一个UIWebView - 它运行良好。问题是我的应用程序有几个输入字段只接受数字输入。我真的需要强制数字小键盘而不是接受默认的标准键盘,然后强制用户切换到每个字段上的数字。有谁知道这是否可能?怎么样?
澄清: 我知道Apple目前不提供任何API来实现这一点。我想知道创建一个从UIWebView继承的自定义类是否有帮助,或者创建自定义键盘是否会开辟一些可能性?
2009年11月6日更新 - 如下所述,Apple最近更新了safari功能,以便再次支持。所以接受的答案被改变以反映出来。
<html>
<input type='tel'/>
<input type='number'/>
<input type='email'/>
<input />
</html>
答案 0 :(得分:72)
看起来Mobile Safari支持电子邮件,号码,搜索, tel ,和 url 。这些将切换显示的键盘。请参阅the type attribute。
例如,你可以这样做:
<input type="number" />
当输入框有焦点时,会显示数字键盘(好像用户有完整的键盘并点击“123”按钮。
如果您真的只想要数字,可以指定:
<input type="tel" />
然后用户将获得电话号码拨号键盘。
我知道这适用于Mobile Safari - 我只假设它适用于UIWebView。
答案 1 :(得分:28)
我发现更好的解决方案是在为移动和桌面浏览器设计表单时使用<input type="text" pattern="[0-9]*">
。
答案 2 :(得分:4)
来自Apple's documentation(关于UIWebView的说明):
您无法在输入元素中指定键盘类型。 Web视图显示基于默认键盘的自定义键盘,但包含一些用于在表单元素之间导航的附加控件。
答案 3 :(得分:4)
,这个功能还是不存在的,不知道为什么苹果只是删除这个方便的功能,真的很心烦对现在这个工作的权利:(
答案 4 :(得分:3)
以下是与iOS(4.0及更高版本)Web视图兼容的所有类型的列表:
http://conecode.com/news/2011/12/mobile-safari-uiwebview-input-types/
答案 5 :(得分:2)
这在iPhone OS的第一次迭代中是可能的 - Safari会给数字键盘形成名称中带有“zip”或“phone”的字段 - 但它在iPhone OS 2.0中消失了。
PhoneGap暂时没有API函数来覆盖它。它可能是他们正在努力的东西,它绝对是一个漂亮的功能。
答案 6 :(得分:1)
您需要在Dashcode项目的HTML部分进行更改:
type="text"
更改为type="number"
。完成。
答案 7 :(得分:1)
iOS Mobile Safari还支持:
<input type="password" />
答案 8 :(得分:1)
答案 9 :(得分:0)
iOs有一个数字键盘UIKeyboardTypeNumbersAndPunctuation
,但无法从HTML调用(https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html)
因为在“tel”键盘上缺少标点符号,你必须自己创建。由于ios8自定义键盘可用。或者,如果您只需要标点符号,则可以在数字键盘上添加一个按钮(How to add a 'Done' button to numpad keyboard in iOS),当您使用type="number" pattern="[0-9]*"
指定输入字段时,该按键会弹出。
这样做:objective-c代码。
-(void)keyboardWillHide:(NSNotification *)note
{
[self.donekeyBoardBtn removeFromSuperview];
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat: @"document.activeElement.blur()"]];
}
- (void)keyboardWillShow:(NSNotification *)note
{
[UIView setAnimationsEnabled:NO];
// create custom button
//UIKeyboardTypeNumberPadin
//type="number" pattern="[0-9]*"
UIButton *extryB= [UIButton buttonWithType:UIButtonTypeRoundedRect];
extryB.frame = CGRectMake(0, self.view.frame.size.height+150, 100, 50);
extryB.backgroundColor = [UIColor colorWithRed:204.0f/255.0f
green:210.0f/255.0f
blue:217.0f/255.0f
alpha:1.0f];
extryB.adjustsImageWhenHighlighted = NO;
extryB.titleLabel.font = [UIFont systemFontOfSize:14.0];
[extryB setTitle:@"," forState:UIControlStateNormal];
[extryB setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[extryB addTarget:self action:@selector(extryBpressed) forControlEvents:UIControlEventTouchUpInside];
self.donekeyBoardBtn = extryB;
// locate keyboard view
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView* keyboard;
for(int i=0; i<[tempWindow.subviews count]; i++)
{
keyboard = [tempWindow.subviews objectAtIndex:i];
// keyboard view found; add the custom button to it
if([[keyboard description] hasPrefix:@"<UIInputSetContainerView"] == YES)
{
for(int i = 0 ; i < [keyboard.subviews count] ; i++)
{
UIView* hostkeyboard = [keyboard.subviews objectAtIndex:i];
if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES)
{
UIButton* donebtn = (UIButton*)[hostkeyboard viewWithTag:67123];
if (donebtn == nil){
//to avoid adding again and again as per my requirement (previous and next button on keyboard)
if([[self printKeyboardType] isEqualToString: @"UIKeyboardTypePhonePad"]){
[keyboard addSubview:extryB];
}
}
}
}
}
//[keyboard addSubview:extryB];
}
[UIView setAnimationsEnabled:YES];
// animate
[UIView animateWithDuration:0.5 animations:^{
extryB.frame = CGRectMake(0, self.view.frame.size.height-50, 100, 50);
}];
}
-(NSString*)printKeyboardType
{
NSString* strKeyboardType = @"";
switch (self.textDocumentProxy.keyboardType) {
case UIKeyboardTypeAlphabet:
strKeyboardType = @"UIKeyboardTypeAlphabet";
break;
case UIKeyboardTypeDecimalPad:
strKeyboardType = @"UIKeyboardTypeAlphabet";
break;
case UIKeyboardTypeDefault:
strKeyboardType = @"UIKeyboardTypeDefault";
break;
case UIKeyboardTypeEmailAddress:
strKeyboardType = @"UIKeyboardTypeEmailAddress";
break;
case UIKeyboardTypeTwitter:
strKeyboardType = @"UIKeyboardTypeTwitter";
break;
case UIKeyboardTypeNamePhonePad:
strKeyboardType = @"UIKeyboardTypeNamePhonePad";
break;
case UIKeyboardTypeNumberPad:
strKeyboardType = @"UIKeyboardTypeNumberPad";
break;
case UIKeyboardTypeNumbersAndPunctuation:
strKeyboardType = @"UIKeyboardTypeNumbersAndPunctuation";
break;
case UIKeyboardTypePhonePad:
strKeyboardType = @"UIKeyboardTypePhonePad";
break;
case UIKeyboardTypeURL:
strKeyboardType = @"UIKeyboardTypeURL";
break;
case UIKeyboardTypeWebSearch:
strKeyboardType = @"UIKeyboardTypeWebSearch";
break;
default:
strKeyboardType = @"UNKNOWN";
break;
}
NSLog(@"self.textDocumentProxy.keyboardType=%@", strKeyboardType);
return strKeyboardType;
}
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
- (void)extryBpressed{
//simulates a "." press
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat: @"simulateKeyPress('.');"]];
}
然后你应该在你的JS代码中添加一个可以在应用程序范围内访问的方法。
simulateKeyPress: function(k) {
var press = jQuery.Event("keypress");
press.which = k;
// place the id of your most outer html tag here
$("#body").trigger(press);
// just needed because my active element has a child element where the value should be placed in
var id = document.activeElement.id.indexOf("-");
if(id != -1){
var currentTf = sap.ui.getCore().byId(document.activeElement.id.split("-")[0]);
//append the value and set it (my textfield has a method setValue())
var currentTfValue = currentTf.getValue();
currentTf.setValue(currentTfValue + k);
}
},