You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS Safari 14.1.2 表单内按钮点击后HTML更新偶发失效问题求助

问题根因

这个偶发失效是Safari内核的渲染调度和表单提交优先级差异导致的:Chrome会确保当前批次的DOM更新渲染完成后再执行表单提交逻辑,而Safari会优先处理表单提交动作,若提交触发的页面重载/跳转逻辑先于DOM渲染队列执行,就会把还没完成的按钮内容更新丢弃,因此出现偶发不生效的情况。

可落地的修复方案

  • 方案1:给表单提交加短延迟,预留Safari的DOM渲染时间
    调整JS代码如下,仅需加100ms以内的延迟即可覆盖绝大多数场景,不会影响用户体验:
$(document).on('click', "#btnFetch" ,function(){
    $('#btnFetch').html('<span class="spinner-border spinner-border-sm mr-2" role="status" aria-hidden="true"></span>Loading...').addClass('disabled');
    // 加50ms延迟再提交表单,给Safari留足渲染时间
    setTimeout(() => {
        $("#battery-form").submit();
    }, 50);
});
  • 方案2:使用requestAnimationFrame确保渲染完成后提交,比定时器更精准
    如果你不想用定时器,可以用浏览器原生的requestAnimationFrame API,等待两次帧回调确保渲染完成后再执行提交:
$(document).on('click', "#btnFetch" ,function(){
    const $btn = $('#btnFetch');
    $btn.html('<span class="spinner-border spinner-border-sm mr-2" role="status" aria-hidden="true"></span>Loading...').addClass('disabled');
    // 两次requestAnimationFrame确保DOM更新已渲染到页面
    requestAnimationFrame(() => {
        requestAnimationFrame(() => {
            $("#battery-form").submit();
        });
    });
});
  • 额外优化建议:给按钮同时添加原生disabled属性,避免用户重复点击,同时兼容Safari的状态识别,修改按钮更新逻辑如下:
$btn.html('加载中内容').addClass('disabled').prop('disabled', true);

内容的提问来源于stack exchange,提问作者Husar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:18:06