我有一个JavaScript函数来提交表单。
我的函数的第一步是禁用它(以防止多次点击)并应用一个更好地说明它已被禁用的类。我还将文本更改为“请等待...”
下一步是验证我的表单。如果验证失败,撤销第一步中的更改,使按钮恢复到正常状态。
如果验证通过,则提交表单。
所有这些基本上是在同一个过程中发生的。
我发现在Safari中,该过程的第一个阶段(按钮样式)几乎被忽略了。经过进一步挖掘,我意识到它确实起作用,但UI在进程完成之前没有重绘。问题在于,进程的完成是重定向离开页面,因此用户永远无法看到“请等待...”
然后我探索了Safari为什么不重新绘制UI,并发现了许多解决方法,以下是其中的一个示例:
// Aims to trigger the redraw by 'resetting' it
elem.style.display='none';
elem.offsetHeight;
elem.style.display='';
我尝试的另一个方法是使用系统主要的 JavaScript 库 Prototype,通过在更新前/后故意隐藏和显示元素来实现:
elem.hide();
elem.addClassName('disabledBtn');
elem.disable();
elem.update('Please Wait');
elem.show();
另一种方法是创建一个“redraw”方法来强制重新绘制。
Element.addMethods({
redraw: function(element){
element = $(element);
var n = document.createTextNode(' ');
element.appendChild(n);
(function(){n.parentNode.removeChild(n)}).defer();
return element;
}
});
...
elem.addClassName('disabledBtn');
elem.disable();
elem.update('Please Wait');
elem.redraw();
这些方案都不可行。在完成过程中,直到用户重定向后,该进程才会更新UI。值得一提的是,这是一个相当复杂的表单,在提交期间需要几秒钟的处理时间,因此这是用户体验的噩梦。
有其他人遇到过这种情况吗?