【问题标题】:iOS - Workaround for manually focusing on an input/textareaiOS - 手动关注输入/文本区域的解决方法
【发布时间】:2015-08-25 11:08:03
【问题描述】:

因此,我看到了很多关于 iOS 问题的主题,重点是 input/textarea 元素。 (参见herehere)iOS 似乎不会让您手动关注其中一个元素,并要求它是真正的点击/单击才能关注该元素。

我尝试过模拟点击、触发点击、直接执行 click() ......各种事情。

这是我目前正在尝试实施的解决方法:

$scope.gotoElement = function(eID) {
    // call $anchorScroll()
    $scope.smoothScrollTo(eID).then(function() {
        clickElement('#textarea');
    });          
}

function clickElement(e) {
  $(e).on('touchstart', function() {
    //$(e).val('touchstart');
    $(e).focus();
  });

  $(e).trigger('touchstart');
}

您不必担心滚动功能,我知道这很有效,并且我已经对其进行了足够的测试。注释掉的 $(e).val('touchstart') 可以毫无问题地更改 textarea 的文本,但 .focus() 在 iOS 上不起作用。我已经在 Android 设备上对此进行了测试,它工作正常,但在 iOS 上它只是没有调出键盘。有时它会开始调出键盘半秒钟然后又消失。

我已经查看了上面提到的其他线程,但我似乎无法弄清楚如何为此编写解决方法。

有什么想法吗?

【问题讨论】:

  • 您是否尝试过触发 click() 而不是 focus()?我应该在任何设备上工作都没有问题。 $(this).next('input').click();
  • @EmanueleParisio 是的,我尝试使用 .click() 代替。
  • 我们可以找到解决这个问题的方法,但我可能会问,您为什么要以编程方式关注某些输入而不是设置值?
  • 这个问题最初是因为position: fixed 的iOS 错误导致输入框失去定位。我正在使用的一种解决方法是,如果有人点击输入框,页面将滚动到页面底部,然后将注意力集中在输入框上,从而调出键盘。这是一个很好的解决方法,因为它仍然适用于 cmets 列表。

标签: javascript jquery ios


【解决方案1】:

我也骚扰过类似的问题。 我的问题通过一个简单的 css 属性解决,即-webkit-user-select:none 我删除了这个,一切正常。 试试这个。

【讨论】:

  • 你会用什么代替它?我没有手动使用过这个属性,那你会把-webkit-user-select设置成什么?
  • -webkit-user-select 属性在 ios 设备中出现问题。这会导致文本框出现意外行为,例如无法正确获取焦点,有时您无法在文本框中看到类型字符,然后忘记是否在您的 css 中。
  • 是的,我知道该属性本身,但正如我所说,我没有在 CSS 中的任何地方更改此属性。我以为你的意思是将其更改为 text 或类似的东西会解决它。
  • 好的,你没看错。尝试像 input[type=text],textarea{-webkit-user-select:text} 进行更改。如果它修复了,那么好的,否则对不起:(
  • 对我不起作用。可以将文本聚焦在外面并且键盘仍然存在
【解决方案2】:

在您的UIWebView 上,将keyboardDisplayRequiresUserAction 设置为NO

【讨论】:

【解决方案3】:

我使用 iPad Air [iOS 7.0.4]、iPad Mini [iOS 7.1] 和 jQuery [1.11.3] 进行测试。

.focus 事件在输入和文本区域字段中都非常适合我。

我正在粘贴下面我测试过的代码。如果我遗漏了什么,请告诉我。

是否适用于以前的 iOS / jQuery 版本?

我的 HTML,

<body>
    <!--<input id="in" type="text"/>-->
    <textarea id="in"></textarea>
    <button id="btn">Add Focus</button>
</body>

我的查询,

$('#btn').click(function(){
    $('#in').focus();
})

【讨论】:

  • 对不起,这不起作用,这几乎就是我上面写的。如果您查看我发布的相关问题,您可以查看更多示例。
  • @germainelol,是的,我看到了...对此感到抱歉...但是我可以知道您的 iOS 版本吗?
  • 我使用的是最新版本,但据我所知,这个错误已经存在了一段时间。
【解决方案4】:

keyboardDisplayRequiresUserAction = NO 的 WKWebView 版本来自thedyrt/cordova-plugin-wkwebview-engine

#import <objc/runtime.h>

- (void) viewDidLoad {
    ...

    SEL sel = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:userObject:");
    Class WKContentView = NSClassFromString(@"WKContentView");
    Method method = class_getInstanceMethod(WKContentView, sel);
    IMP originalImp = method_getImplementation(method);
    IMP imp = imp_implementationWithBlock(^void(id me, void* arg0, BOOL arg1, BOOL arg2, id arg3) {
        ((void (*)(id, SEL, void*, BOOL, BOOL, id))originalImp)(me, sel, arg0, TRUE, arg2, arg3);
    });
    method_setImplementation(method, imp);
}

【讨论】:

    【解决方案5】:

    这似乎只发生在 iOS12 上。 .Focus 在 iOS11&13 中运行良好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      相关资源
      最近更新 更多