61

我正在尝试使用 PhoneGap 开发一些 iPhone 应用程序。PhoneGap 基本上包装了一个 UIWebView - 它运行良好。问题是我的应用程序有几个只接受数字输入的输入字段。我真的需要强制使用数字键盘而不是接受默认的标准键盘,然后强制用户切换到每个字段上的数字。有谁知道这是否可能?如何?

澄清:我知道苹果目前没有提供任何 API 来允许这样做。我想知道创建从 UIWebView 继承的自定义类是否会有所帮助,或者创建自定义键盘是否会带来一些可能性?

2009 年 11 月 6 日更新 - 如下所述,Apple 最近更新了 safari 功能,以便再次支持此功能。因此,接受的答案已更改以反映这一点。

 <html>
<input type='tel'/>
<input type='number'/>
<input type='email'/>
<input />
</html>
4

10 回答 10

73

看起来 Mobile Safari 支持emailnumbersearchtelurl的新 HTML5 输入类型属性。这些将切换显示的键盘。请参阅类型属性

例如,您可以这样做:

<input type="number" />

并且当输入框有焦点时,会显示数字键盘(就像用户拥有全键盘并点击“123”按钮一样。

如果你真的只想要数字,你可以指定:

<input type="tel" />

然后用户将获得电话号码拨号键盘。

我知道这适用于 Mobile Safari——我只假设它适用于 UIWebView。

于 2009-10-01T18:57:12.590 回答
29

我发现一个更好的解决方案是在<input type="text" pattern="[0-9]*">为移动和桌面浏览器设计表单时使用。

于 2013-04-22T23:42:54.147 回答
4

来自Apple 的文档(关于 UIWebView 的注释):

您不能在输入元素中指定键盘类型。Web 视图显示了一个基于默认键盘的自定义键盘,但包含一些用于在表单元素之间导航的附加控件。

于 2009-04-21T20:25:41.323 回答
4

检查了 iPhone OS 3.0,这个功能仍然不存在,不知道为什么 Apple 刚刚删除了这个方便的功能,现在真的很不高兴 :(

于 2009-06-21T17:38:21.107 回答
3

以下是与 iOS(4.0 及更高版本)网络视图兼容的每种类型的列表:

http://conecode.com/news/2011/12/mobile-safari-uiwebview-input-types/

于 2011-12-27T19:20:52.097 回答
2

这在 iPhone OS 的第一次迭代中是可能的——Safari 将提供数字键盘来形成名称中带有“zip”或“phone”的字段——但它在 iPhone OS 2.0 中消失了。

PhoneGap 目前没有 API 函数来覆盖它。这可能是他们正在研究的东西,它肯定是一个漂亮的功能。

于 2009-04-21T18:29:59.667 回答
1

您需要在 Dashcode 项目的 HTML 部分中进行更改:

  1. 在 Dashcode 中,在代码窗口中打开 index.html。
  2. 在您正在处理的视图的画布上,选择要设置为使用优化键盘的输入字段。
  3. 单击 index.html 以使其获得焦点。
  4. 从 Dashcode 菜单栏中选择编辑>查找。
  5. 在查找框中键入您为文本字段控件提供的确切名称。Find 将在 index.html 文件中找到控件。
  6. 将类型从 更改type="text"type="number"

完毕。

于 2010-10-13T04:04:07.937 回答
1

iOS 移动 Safari 还支持:

<input type="password" />
于 2012-01-11T07:53:03.263 回答
1

您还可以用于基于 iOS phonegap 的应用程序是:

input type="number" pattern="[0-9]*"

如下图所示。与 iOS 8.2 和 phonegap 3.5 及更高版本完美配合。

于 2015-07-27T06:38:25.200 回答
0

iOs 有一个数字键盘UIKeyboardTypeNumbersAndPunctuation,但这不能从 HTML 调用(https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

因为在“tel”键盘上缺少标点符号,所以您必须自己创建它。由于 ios8 自定义键盘可用。或者,如果您只需要标点符号,您可以向数字键盘添加一个按钮(如何在 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);
                }
            },
于 2015-06-29T15:11:50.387 回答