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

Javascript iOS Safari内存泄漏导致应用程序无法使用,javascript,ios,safari,Javascript,Ios,Safari,我的web应用程序中有一个“可编辑表”。它的工作原理是,当您单击表的td时,我读取td的innerHTML并生成一个输入字段,我将该字段的值注入到td中 当您模糊/聚焦输入字段时,我会破坏输入字段并设置新值的innerHTML,并发送一个AJAX请求来更新该字段。这在台式机和安卓手机上非常有效,但在iOS Safari上,编辑的值越多,速度就会越慢。在大约250次编辑后,滚动将变得非常不稳定,最终页面将几乎无法使用。页面刷新并不能解决此问题,它要求您完全关闭网页,然后重新启动 这让我相信Safa

我的web应用程序中有一个“可编辑表”。它的工作原理是,当您单击表的td时,我读取td的innerHTML并生成一个输入字段,我将该字段的值注入到td中

当您模糊/聚焦输入字段时,我会破坏输入字段并设置新值的innerHTML,并发送一个AJAX请求来更新该字段。这在台式机和安卓手机上非常有效,但在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);

},
\u handleEditing:函数($td){
var value=$td.find(“span”).html().replace(“,”,”),
ctrl=这个;
$td.unbind('click');
//克隆输入控件
var$editControl=$('#input.editControl').clone();
如果(此.isMobile){
$editControl.attr('type','number');
$editControl.attr('step','0.01');
}
//将editControl注入td html并设置适当的值
$td.html($editControl);
$editControl.val(值);
//聚焦编辑控件并设置选择范围
$editControl.focus();
setTimeout(函数(){
$editControl.get(0).setSelectionRange(0,value.length);
}, 0);
firstKeydown=true;
//句柄离开输入字段并返回到正常数字
$editControl.on('blur',function(){
var newValue=$editControl.val();
//如果newValue为空,则返回到旧值
newValue=(newValue=='')?值:newValue;
var parsedNewValue=parseFloat(newValue).toFixed(2);
//如果新值实际上不是一个数字,则返回到旧值
newValue=isFinite(parsedNewValue)?parsedNewValue:value;
$editControl.unbind().remove();
$editControl=null;
$td.html(“+newValue+”);
//将此值更新排队到服务器
if(parseFloat(newValue)!==parseFloat(value)){
ctrl.handleValueChanged($td,value,newValue);
}
//恢复td上的单击处理程序
$td.单击(函数(){
ctrl._handleEditing($td);
});
});
此._attachNavigationHandlers($editControl);
},
任何帮助都将不胜感激。
苹果开发者请帮助

基于我为类似问题所做的研究(iOS上的性能逐渐下降,我遇到了许多来源表明这是iOS本身的问题)

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

参考:


到目前为止,似乎还没有解决方案。在我的情况下,我会在用户注销时强制关闭应用程序。不幸的是,如果你想在应用商店中使用你的应用程序,你不能以编程方式退出你的应用程序。

虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并为用户提供链接参考。如果链接页面发生更改,则仅链接的答案可能无效。