iOS Safari内存泄漏导致应用程序无法使用

时间:2016-01-03 00:47:11

标签: javascript ios safari

我的网络应用程序中有一个“可编辑的表”。它是如何工作的,当你点击表格的td时,我读取了td的innerHTML并生成了一个输入字段,我将其注入到具有innerHTML值的td中。

当您模糊/聚焦输入字段时,我会销毁输入字段并设置新值的innerHTML,并发送AJAX请求以更新该字段。这适用于台式机和Android手机,但在iOS Safari上,编辑的值越多,速度就越慢。大约一会儿250次编辑,滚动将变得非常不稳定,最终页面将变得几乎无法使用。页面刷新无法解决问题,它要求您完全关闭网页并重新开始。

这让我相信Safari没有释放被破坏的输入字段的内存。

下面给出了相关的JavaScript代码,并在点击td:

时触发
_handleEditing: function($td) {
    var value = $td.find("span").html().replace(",", ""),
        ctrl = this;

    $td.unbind('click');

    // Clone the input control
    var $editControl = $('#input .edit-control').clone();

    if(this.isMobile) {
        $editControl.attr('type', 'number');
        $editControl.attr('step', '0.01');
    }

    // Inject editControl into td html and set appropriate values
    $td.html($editControl);
    $editControl.val(value);

    // Focus the edit control and set the selection range
    $editControl.focus();

    setTimeout(function() {
        $editControl.get(0).setSelectionRange(0, value.length);
    }, 0);

    firstKeydown = true;

    // Handle leaving the input field and returning to normal number
    $editControl.on('blur', function(){
        var newValue = $editControl.val();

        // If the newValue is empty, go back to the old value
        newValue = (newValue === '') ? value : newValue;

        var parsedNewValue = parseFloat(newValue).toFixed(2);

        // If the newValue is not actually a number, go back to the old value
        newValue = isFinite(parsedNewValue) ? parsedNewValue : value;

        $editControl.unbind().remove();
        $editControl = null;

        $td.html("<span>"+newValue+"</span>");

        // Queue this value update to server
        if(parseFloat(newValue) !== parseFloat(value)) {
            ctrl.handleValueChanged($td, value, newValue);
        }

        // Reinstate the click handler on the td
        $td.click(function(){
            ctrl._handleEditing($td);
        });
    });

    this._attachNavigationHandlers($editControl);

},

任何帮助都会受到极大的赞赏。 APPLE开发者请帮助

1 个答案:

答案 0 :(得分:1)

根据研究,我一直在为类似的问题做些工作(iOS上的性能逐渐下降,我发现了许多来源,表明这是iOS本身的问题。

  

iOS 9中的性能问题似乎与Safari中的错误有关。无论您使用的是Safari,UIWebView还是WKWebView ......每次选择文本输入字段时,您都会注意到性能的提升。我创建了一个包含100个文本输入的基本html页面......当我遍历输入几次时,应用程序最终会对手势无响应。 Webview / Webkit中唯一的解决方案(我知道)是重新启动应用程序。

参考: replace java method

截至目前,似乎没有解决方案。在我的情况下,我强制关闭用户注销时的应用程序。不幸的是,如果您想在App Store上使用自己的应用,则无法以编程方式退出应用。