uni-app 如何打开页面默认弹出软键盘,同时兼容iOS和Android

发布于 1周前 作者 zlyuanteng 来自 Uni-App

uni-app 如何打开页面默认弹出软键盘,同时兼容iOS和Android

解决方案

看了论坛中N篇关于“打开页面默认弹出软键盘”的回答,看都看花眼了,每次都要在错综复杂的关系中,去找出真正的“凶手”。在这里,我还是把这个坑填一下,我将完整的答案优化整理了下,同时兼容iOSAndroid

注:input不需要添加autofocus属性。

28 回复

// 示例1
open_soft_keyboard({
input: “#username”
});
// 示例2
open_soft_keyboard({
input: ‘input[value=""]’
});

/**

  • 默认打开软键盘

  • @param options{

  • input: ‘#nickname’ // 容器节点

  • }

  • @author 蔡繁荣

  • @version 1.0.3 build 20151226
    */
    function open_soft_keyboard(options){
    if(plus.os.name == ‘iOS’){
    setTimeout(function(){
    var wv_current = plus.webview.currentWebview().nativeInstanceObject();
    wv_current.plusCallMethod({“setKeyboardDisplayRequiresUserAction”:false});
    document.querySelector(options[‘input’]).focus();
    }, 330);
    }else{
    // 因为安卓autofocus只有4.0版本以上才支持,所以这里使用native.js来强制弹出
    setTimeout(function(){
    // 在执行的时候需要让当前webview获取焦点
    var wv_current = plus.android.currentWebview();
    plus.android.importClass(wv_current);
    wv_current.requestFocus();

         var Context = plus.android.importClass("android.content.Context");  
         var InputMethodManager = plus.android.importClass("android.view.inputmethod.InputMethodManager");  
         var main = plus.android.runtimeMainActivity();  
         var imm = main.getSystemService(Context.INPUT_METHOD_SERVICE);  
         imm.toggleSoftInput(0,InputMethodManager.SHOW_FORCED);  
         document.querySelector(options['input']).focus();  
     }, 330);  
    

    }
    }


正好需要,感谢~

不顶不是人!

赞一个,回来试试!

好厉害。小白我请问一下高手, // 示例1 open_soft_keyboard({ input: “#username” });
这个参数#username 是input的id名称吗?每次在打开页面的时候初始化一次这个function open_soft_keyboard(options){}方法吗?

是的,具体你可以看下源代码,document.querySelector(options[‘input’]).focus();

感谢分享! 有个问题问下: input type属性是search的时候 软键盘回车按钮不是 搜索 单击input后才能显示 回车为搜索 系统为安卓5.0.1

不会吧,不过我觉得这其实不是问题,不影响

请问,这里的“plus.os.name=‘ios’”这块,plus是什么?这里写页面的时候需要加入什么js脚本吗?

plus 是5+环境,需要用hbuild真机运行或者用dcloud 的sdk 离线打包后才能有的.

回复 撒网要见鱼:非常谢谢您的回答!

好东西,顶一下!

安卓5.1,为何弹出的不是数字键盘呢

试试 <input type="number">

谢谢回复,type就是number类型的,ios会弹出数字键盘,安卓下自动弹出的却是字母键盘,输入法是讯飞。我试过注释掉自动弹出代码,手动定位到input框,弹出的是数字键盘。

大神,6s (plus)里面 输入法闪一下就没了,有时还看不出来弹,遇到过吗,,,,

我的也是,弹出闪一下就空白了

真是好东东···顶起 ·· 刚学习前端

好东西,真真需要

怎么使用?有没有完整的代码?感谢

plus什么意思?

安卓下有延迟 怎么解决啊 @蔡繁荣

你好,请问强制弹起后,怎么关闭

还是您这个方案靠谱 谢谢帮忙~

在uni-app中,默认情况下,软键盘的弹出是由用户输入行为触发的,例如点击输入框。要实现页面打开时默认弹出软键盘,并且兼容iOS和Android,可以利用页面的onReady生命周期函数结合refocus输入框的方法来实现。以下是一个具体的代码案例:

首先,确保你的页面中有一个输入框(<input><textarea>)。假设你的页面结构如下:

<template>
  <view>
    <input ref="autoFocusInput" type="text" v-model="inputValue" placeholder="请输入内容"/>
  </view>
</template>

<script>
export default {
  data() {
    return {
      inputValue: ''
    };
  },
  onReady() {
    this.focusInput();
  },
  methods: {
    focusInput() {
      // 延迟调用focus方法,确保DOM已渲染完毕
      setTimeout(() => {
        this.$refs.autoFocusInput.focus();
      }, 100); // 根据实际情况调整延迟时间
    }
  }
};
</script>

<style scoped>
/* 样式根据需要调整 */
</style>

在这个例子中,我们做了以下几点:

  1. 定义输入框:在模板中定义了一个<input>元素,并给它设置了ref="autoFocusInput",以便在JavaScript中引用。

  2. 数据绑定:使用v-model指令将输入框的值绑定到组件的inputValue数据属性上。

  3. 生命周期钩子:在onReady生命周期钩子中调用focusInput方法。onReady是uni-app提供的生命周期钩子,它会在页面首次渲染完成后被调用,此时页面的DOM已经准备好。

  4. 延迟调用focus方法:在focusInput方法中,使用setTimeout来延迟调用输入框的focus方法。这是为了确保DOM元素已经完全渲染并可用。延迟时间可能需要根据实际情况进行调整。

注意事项:

  • 在iOS设备上,软键盘的弹出行为可能受到系统策略的限制,某些情况下即使调用了focus方法也可能不会立即弹出软键盘。
  • 对于Android设备,通常调用focus方法后软键盘会正常弹出。
  • 如果遇到软键盘不弹出的问题,可以尝试调整setTimeout的延迟时间,或者检查是否有其他CSS或JavaScript代码影响了输入框的焦点行为。

通过上述方法,可以在uni-app中实现页面打开时默认弹出软键盘,并且尽量兼容iOS和Android设备。

回到顶部