8

我在 iPad 版 Safari 上遇到了一个无法修复的恼人错误。

建筑学:

  • 骨干 0.9.9
  • jQuery 1.7.2
  • jQuery手机1.3.1

用户代理:

  • iOS 5.1.1 (iPad)
  • Safari 5.1 移动版
  • 完整的用户代理字符串:Mozilla/5.0 (iPad; CUP OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3

我有同一个视图的 10 个实例,每个实例都有一个包含 textarea 元素的嵌套视图。由于某种原因,当您点击文本区域时,它随机不聚焦。我读到当您尝试触发不是来自点击/单击事件的焦点事件时,Safari 移动设备会出现问题,但这是直接点击,它仍然不能可靠地聚焦。这是视图的精简代码:

var ParentView = Backbone.View.extend({
    render: function() {
        this.$el.html("<div class='textarea-container'></div>");
        this.textareaView = new TextareaView({
            el: this.$el.find('.textarea-container')
        });
        this.textareaView.render();
    }
};
var TextareaView = Backbone.View.extend({
    events: {
        'tap .my-textarea': 'handleTextareaTap'
    },
    render: function() {
        this.$el.html('<textarea rows="4" cols="80" class='my-textarea'></textarea>');
    },
    handleTextareaTap: function(event) {
        console.log('TAPPED');
    }
};
var i = 0;
while ( i < 10 ) {
    var view = new ParentView();
    view.render();
    $(body).append(view.$el);
    i++;
}

点击事件处理程序 100% 的时间触发。控制台每次都正确显示“TAPPED”。但大多数时候,用户代理无法集中在文本区域中。我在 TextareaView 中添加了以下行,以准确查看 Safari 正在触发哪些事件以及按什么顺序触发:

var TextareaView = Backbone.View.extend({
    render: function() {
        this.$el.html('<textarea rows="4" cols="80" class='my-textarea'></textarea>');
        this.$el.find('.my-textarea').on('blur change click contextmenu copy cut dblclick focus focusin focusout hashchange keydown keypress keyup load mousedown mouseenter mouseleave mousemove mouseout mouseover mouseup mousewheel paste reset scroll select submit textinput unload wheel tap touch scrollstart scrollstop swipe swipeleft swiperight vclick vmousecancel vmousedown vmousemove vmouseout vmouseover vmouseup touchstart touchend touchmove touchcancel', function(event) {
            console.log(event.type);
        }
    },
};

这是文本区域正确聚焦时得到的事件顺序:touchstart、vmouseover、vmousedown、touchend、vmouseup、vclick、tap、vmouseout、mousemove、mousedown、focusin、focus、mouseup、click、focusout、blur

这是文本区域无法聚焦时得到的事件顺序:touchstart、vmouseover、vmousedown、touchend、vmouseup、vclick、tap、vmouseout、mousemove

由于某种原因,mousemove 之后的事件无法触发。我也尝试过手动触发这些事件,但是 textarea 元素仍然没有聚焦,也没有弹出键盘,例如:

var TextareaView = Backbone.View.extend({
    handleTextareaTap: function(event) {
        // This still doesn't work:
        this.$el.find('.my-textarea').trigger('focus');
        // Neither does waiting for the synthesized WebKit events to fire:
        var _this = this;
        setTimeout(function(){
           _this.$el.find('.my-textarea').trigger('focus');
        }, 1000);
    }
};

我倾注了Apple 的事件处理程序文档但无济于事,并且在 github 上的任何存储库中都找不到与此相关的任何错误报告。

另外两个我不明白的奇怪行为:

  1. textarea 的第一个实例始终正常工作
  2. 尽管调用了模糊事件,但文本区域仍聚焦

任何见解将不胜感激。

干杯,

4

1 回答 1

0

尝试在 .focus() 之后直接添加

.parent().appendTo($'form:first');

当一个页面被渲染时它存在于 DOM 中,如果你修改 DOM 中的一个元素,它可以在修改后移出 DOM,那么你就无法回到它。上面的代码将其移回 DOM。

修改后的元素移回后,手指越过您的文本区域焦点将起作用。

看看这个以更好地解释它。

jQuery模态表单对话框回发问题

..和..

$("#dialog").parent().appendTo($("form:first"));

于 2013-09-12T13:26:33.623 回答