我的网络应用程序中有一个“可编辑的表”。它是如何工作的,当你点击表格的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开发者请帮助
答案 0 :(得分:1)
根据研究,我一直在为类似的问题做些工作(iOS上的性能逐渐下降,我发现了许多来源,表明这是iOS本身的问题。
iOS 9中的性能问题似乎与Safari中的错误有关。无论您使用的是Safari,UIWebView还是WKWebView ......每次选择文本输入字段时,您都会注意到性能的提升。我创建了一个包含100个文本输入的基本html页面......当我遍历输入几次时,应用程序最终会对手势无响应。 Webview / Webkit中唯一的解决方案(我知道)是重新启动应用程序。
截至目前,似乎没有解决方案。在我的情况下,我强制关闭用户注销时的应用程序。不幸的是,如果您想在App Store上使用自己的应用,则无法以编程方式退出应用。