【问题标题】:Programmatically focus on next input field in mobile safari以编程方式关注移动 Safari 中的下一个输入字段
【发布时间】:2013-09-14 17:00:54
【问题描述】:

我有几个输入字段,就像填字游戏一样:

每个方块都有自己的输入字段。原因之一是有时可以预先填充一个正方形。现在,在桌面浏览器上,只要输入一个字符,光标就会跳转到下一个输入字段。使用类似的东西效果很好:

$(this).next('input').focus();

但是移动 safari(我们在 ios 上测试)的问题是我不知道如何以编程方式自动“跳转”到下一个输入字段。用户可以通过“下一步”按钮执行此操作,但有没有办法自动执行此操作?

我知道focus() 触发器在 ios 上有一些限制,但我也看到了一些使用合​​成点击等的解决方法。

【问题讨论】:

  • 运气好可以让它工作吗?

标签: javascript jquery ios focus mobile-safari


【解决方案1】:

我找到了一个可能对您有用的解决方法。

Apparently IOS/Safari 仅在触摸事件处理程序中“接受”焦点。我触发了一个触摸事件并在其中插入了.focus()。我用 Safari 在我的 iPhone3S 和 iPhone5S 上试过这个,它可以工作:

var focused = $('input:first'); //this is just to have a starting point

$('button').on('click', function () { // trigger touch on element to set focus
    focused.next('input').trigger('touchstart'); // trigger touchstart
});

$('input').on('touchstart', function () {
    $(this).focus();   // inside this function the focus works
    focused = $(this); // to point to currently focused
});

演示here
(在演示中按下一步按钮)

【讨论】:

  • 这是有效的,因为您的开始事件是点击(鼠标事件)。如果您尝试使用其他事件作为开始事件(鼠标事件除外),它将不起作用。此链接可能会有所帮助:quora.com/…
  • @darkyndy “开始”点击事件是真实的还是被触发是否可以?
  • @Wytze - 据我所知,这很重要,必须是真实事件(用户交互)
  • 非常聪明——不幸的是,这对我的情况不起作用——我想在键盘输入(例如,n 或 N 或 ENTER)上导航。见jsfiddle.net/EbU6a/202
  • 我不敢相信这有 20 票赞成,为什么还要创建 touchevents 之类的东西呢?只需将焦点放在 onClick 内就可以了,问题是没有人在他们的代码中有点击事件
【解决方案2】:

在不关闭键盘的情况下以编程方式移动到移动浏览器中的下一个输入字段似乎是不可能的。 (这是一个糟糕的设计,但这是我们必须使用的。)然而,一个聪明的技巧是用 Javascript 交换输入元素的位置、值和属性,这样看起来你正在移动到下一个字段,而实际上你仍然专注于同一个元素。下面是交换idname 和值的jQuery 插件的代码。您可以根据需要对其进行调整以交换其他属性。还要确保修复所有已注册的事件处理程序。

$.fn.fakeFocusNextInput = function() {
    var sel = this;
    var nextel = sel.next();
    var nextval = nextel.val();
    var nextid = nextel.attr('id');
    var nextname = nextel.attr('name');
    nextel.val(sel.val());
    nextel.attr('id', sel.attr('id'));
    nextel.attr('name', sel.attr('name'));
    sel.val(nextval);
    sel.attr('id', nextid);
    sel.attr('name', nextname);
    // Need to remove nextel and not sel to retain focus on sel
    nextel.remove();
    sel.before(nextel);
    // Could also return 'this' depending on how you you want the
    // plug-in to work
    return nextel;
};

在这里演示:http://jsfiddle.net/EbU6a/194/

【讨论】:

  • 聪明。如果您使用nextel.detach(); 而不是nextel.remove();,这些字段也可以重复使用。 (remove() 也移除了绑定的监听器)
  • 如果输入之间有元素,这将不起作用。见jsfiddle.net/EbU6a/743
  • @RubenSandwich 是的,这个示例代码做了一些假设,但是它可以通过更新.next().before()来适应任何位置的元素,以删除下一个表单元素并重新插入它需要去任何地方。
【解决方案3】:

UIWebview 有属性keyboardDisplayRequiresUserAction

当此属性设置为 true 时,用户必须明确点击 Web 视图中的元素以显示该元素的键盘(或其他相关输入视图)。当设置为false 时,元素上的焦点事件会导致输入视图自动显示并与该元素关联。

https://developer.apple.com/documentation/uikit/uiwebview/1617967-keyboarddisplayrequiresuseractio

【讨论】:

  • 这正是我一直在寻找的我的 Cordova 应用程序!非常感谢
【解决方案4】:

我希望这就是你要找的-

$(document).ready(function() {
  $('input:first').focus(); //focus first input element

  $('input').on('keyup', function(e) {
    if(e.keyCode == 8) {  //check if backspace is pressed
      $(this).prev('input').focus(); 
      return;
    }
    if($(this).val().length >= 1) { //for e.g. you are entering pin
      if ($(this).hasClass("last")) {
        alert("done");
        return;
      }
      $(this).next('input').focus(); 
    }
  });

  $('input').on('focus', function() {
    if(!$(this).prev('input').val()){
      $(this).prev('input').focus();
    }
  });
});

在这里检查代码-

https://jsbin.com/soqubal/3/edit?html,output

【讨论】:

    【解决方案5】:

    在 ios 部分的配置文件中添加这一行

    preference name="KeyboardDisplayRequiresUserAction" value="false"

    【讨论】:

    • 你怎么知道 TO 正在开发一个混合应用程序?他用“javascript”、“jquery”、“iOS”和“mobile-safari”标记了他的问题。这根本不能回答这个问题。至少它是无关的。
    【解决方案6】:

    我在 safari ios 上遇到了同样的问题。在登录页面上,我在用户输入一个短信代码后以编程方式关注下一个输入字段。 我触发了对输入更改事件的自动关注。我通过添加延迟解决了这个问题。

    详情见下方代码

    <InputItem
        value={item}
        type='number'
        maxLength={1}
        ref={el => this[`focusInstRef${index}`] = el}
        onChange={(value) => {
            value&&index !== 5 && setTimeout(() => {this[`focusInstRef${index + 1}`].focus()}, 5);
            vAppStore.setSmsCodeArr(value, index);}
        }
    />

    【讨论】:

      【解决方案7】:
      <!DOCTYPE html>
      <html>
      <head>
          <style type="text/css">
           #hidebox {position:absolute; border: none; background:transparent;padding:1px;}
           #hidebox:focus{outline: 0;}
      
          </style>
      </head>
      
      <body>
      
      <input type="text" maxlength="1" onkeyup="keyUp(this)" onkeydown="keyDown(this)" size="2" id="hidebox" at="1">
      <input type="text" maxlength="1" size="2" id="mFirst" at="1" onfocus="onFocus(this)"><input type="text" maxlength="1" size="2" id="mSecond" at="2" onfocus="onFocus(this)"><input type="text" maxlength="1" size="2" id="mThird" at="3" onfocus="onFocus(this)"><input type="text" maxlength="1" size="2" id="mFourth" at="4" onfocus="onFocus(this)">
      </li>
      <script type="text/javascript">
      
      window.onload = function() {
           document.getElementById("mFirst").focus(); 
      }
      var array = ["mFirst","mSecond","mThird","mFourth"];
      function keyUp(e) {
        var curId = array[Number(e.getAttribute("at"))-1];
        var nextId = array[Number(e.getAttribute("at"))];
        var curval= e.value;
      var letters = /^[0-9a-zA-Z]+$/;
      if(e.value.match(letters)){
        document.getElementById(curId).value = curval;
        if(e.getAttribute("at") <= 3){
        var nextPos = document.getElementById(nextId).offsetLeft;
        e.setAttribute("at",Number(e.getAttribute("at"))+1);
        e.style.left = nextPos+"px";
        }
       e.value = ""
      }else {
       e.value = "";
      }
      } 
      function keyDown(e) {
          var curId = array[Number(e.getAttribute("at"))-1];
          document.getElementById(curId).value = "";
      } 
      
      function onFocus(e) {
        document.getElementById("hidebox").focus();
        document.getElementById("hidebox").setAttribute("at",Number(e.getAttribute("at")));
        document.getElementById("hidebox").style.left = e.offsetLeft+"px";
        document.getElementById("hidebox").style.top = e.offsetTop+"px";
      }
      
      </script>
      </body>
      </html>
      

      【讨论】:

        猜你喜欢
        • 2018-06-21
        • 2011-03-17
        • 1970-01-01
        • 2012-10-18
        • 2020-09-12
        • 2014-11-11
        • 2017-03-01
        • 2019-02-07
        • 1970-01-01
        相关资源
        最近更新 更多