Bootstrap modal 可在 Firefox 中使用,但不能在 Chrome 中使用

Posted

技术标签:

【中文标题】Bootstrap modal 可在 Firefox 中使用,但不能在 Chrome 中使用【英文标题】:Bootstrap modal working with Firefox but not in Chrome 【发布时间】:2021-12-28 12:57:07 【问题描述】:

这是我的代码,它在按下一个按钮后关闭一个模式,然后立即打开另一个并执行解析功能:

$('#BtnUpCsv').on('click', function (e) 
      $('#csvModal').modal('hide');
      $('#pBarModal').modal('show');
      Papa.parse(document.getElementById('csvinput').files[0], ...

在 Firefox 中,它按预期工作,但在 Chrome 中,第一个模态不会在调用函数后立即关闭,并且解析开始,因为它比前两个函数具有一些奇怪的优先级。解析结束后,csvModal 关闭,pBarModal 出现。 我已经尝试添加setTimeout,但它与解析功能混淆。

知道为什么会这样吗?

编辑:整个函数

Papa.parse(document.getElementById('csvinput').files[0], 
        header: true,
        skipEmptyLines: true,
        complete: function(results) 
          pBarMax = results.data.length - 1;
          results.data.forEach(function (data) 
            const csvPcode = data.pcode;
            const csvAntiOx = data.AntiOx;
            const csvCalories = data.Calories;
            const csvCarbs = data.Carbs;
            const csvFats = data.Fats;
            const csvFibers = data.Fibers;
            const csvLipides = data.Lipides;
            const csvProteins = data.Proteins;
            const csvSat_fats = data.Sat_fats;
            const csvSodium = data.Sodium;
            const csvSugars = data.Sugars;

            //Update progress bar
            pBarPerc = ((iPbar/PbarMax) * 100).toFixed();
            $('#progressBar').text(+ pBarPerc + '%');
            $('#progressBar').attr('style','width:' + pBarPerc + '%');
            //console.log(pBarPerc);

            //Rpc requests
            $.ajax(
              type: 'POST',
              url: '../contents/cbk-data-process.php',
              async: false,
              data: 
                method: 'prod-variable-saveby-name',
                node: <?php echo $node ?>,
                pcode: csvPcode,
                objectname: 'AntiOx',
                value: csvAntiOx
              ,
              dataType: 'json'
             );

            $.ajax(
              type: 'POST',
              url: '../contents/cbk-data-process.php',
              async: false,
              data: 
                method: 'prod-variable-saveby-name',
                node: <?php echo $node ?>,
                pcode: csvPcode,
                objectname: 'Calories',
                value: csvCalories
              ,
              dataType: 'json'
             );

            $.ajax(
              type: 'POST',
              url: '../contents/cbk-data-process.php',
              async: false,
              data: 
                method: 'prod-variable-saveby-name',
                node: <?php echo $node ?>,
                pcode: csvPcode,
                objectname: 'Carbs',
                value: csvCarbs
              ,
              dataType: 'json'
             );

            $.ajax(
              type: 'POST',
              url: '../contents/cbk-data-process.php',
              async: false,
              data: 
                method: 'prod-variable-saveby-name',
                node: <?php echo $node ?>,
                pcode: csvPcode,
                objectname: 'Fats',
                value: csvFats
              ,
              dataType: 'json'
             );

            $.ajax(
              type: 'POST',
              url: '../contents/cbk-data-process.php',
              async: false,
              data: 
                method: 'prod-variable-saveby-name',
                node: <?php echo $node ?>,
                pcode: csvPcode,
                objectname: 'Fibers',
                value: csvFibers
              ,
              dataType: 'json'
             );

            $.ajax(
              type: 'POST',
              url: '../contents/cbk-data-process.php',
              async: false,
              data: 
                method: 'prod-variable-saveby-name',
                node: <?php echo $node ?>,
                pcode: csvPcode,
                objectname: 'Lipides',
                value: csvLipides
              ,
              dataType: 'json'
             );

            $.ajax(
              type: 'POST',
              url: '../contents/cbk-data-process.php',
              async: false,
              data: 
                method: 'prod-variable-saveby-name',
                node: <?php echo $node ?>,
                pcode: csvPcode,
                objectname: 'Proteins',
                value: csvProteins
              ,
              dataType: 'json'
             );

            $.ajax(
              type: 'POST',
              url: '../contents/cbk-data-process.php',
              async: false,
              data: 
                method: 'prod-variable-saveby-name',
                node: <?php echo $node ?>,
                pcode: csvPcode,
                objectname: 'Sat_fats',
                value: csvSat_fats
              ,
              dataType: 'json'
             );

            $.ajax(
              type: 'POST',
              url: '../contents/cbk-data-process.php',
              async: false,
              data: 
                method: 'prod-variable-saveby-name',
                node: <?php echo $node ?>,
                pcode: csvPcode,
                objectname: 'Sodium',
                value: csvSodium
              ,
              dataType: 'json'
             );

            $.ajax(
              type: 'POST',
              url: '../contents/cbk-data-process.php',
              async: false,
              data: 
                method: 'prod-variable-saveby-name',
                node: <?php echo $node ?>,
                pcode: csvPcode,
                objectname: 'Sugars',
                value: csvSugars
              ,
              dataType: 'json'
             );
            iPbar++;
           );
          //Reset progress bar on completition and modal when hidden
          let PbarResult = $('#pBarModalLabel').text('Completed, ' + results.data.length + ' records updated');
          pBarMax = 0;
          pBarPerc = 0;
          $('#tbl-pcodes').DataTable().ajax.reload();
          setTimeout(function() $('#pBarModal').modal('hide');, 2000);
          setTimeout(function() $('#pBarModalLabel').text('Processing... please wait');, 2500);
        
       );
     );

【问题讨论】:

我们需要查看更多代码才能理解问题。解析函数中是否有需要显示模态的内容? @Conman_123 不,模式已隐藏,但输入文件仍然存在并且可以通过函数获取。经过一些修改,我能够为解析器设置超时,第一个模式现在关闭,第二个出现。进度条有效,但在解析结束之前不会更新... 【参考方案1】:

好的,我想我现在明白你的问题了。这是我创建的一个 JSFiddle,用于重新创建问题,并展示解决方案的工作原理: https://jsfiddle.net/rn3y1qgd/7/

您的解析函数似乎比模态隐藏和显示“优先”是因为模态函数是异步的。基本上这意味着当你调用它们时,它不会开始更新 html(隐藏/显示模式),直到所有代码完成运行。这意味着它必须等待您的解析函数完成才能显示/隐藏模式。

解决方法是等待模态显示之前调用解析函数。在小提琴中,这是相关部分:

$("#testbtnSolution").click(function() 
    $("#exampleModal").modal('hide');   
    $("#exampleModal2").one('shown.bs.modal', function() 
      longExecutingFunction(2000);
      alert("processing done");
    ).modal('show');  
);

在这段代码中,我们注册了一个在shown.bs.modal 上运行的事件处理程序。模态显示完成后,它将运行您的处理函数。

【讨论】:

以上是关于Bootstrap modal 可在 Firefox 中使用,但不能在 Chrome 中使用的主要内容,如果未能解决你的问题,请参考以下文章

bootstrap中modal框数据不清空,怎么解决

Bootstrap:在 Modal 中打开另一个 Modal

js学习之--Bootstrap Modals(模态框)

bootstrap modal 模态框拖拽扩展

bootstrap 模态框 modal 插件在一个含有多个页面

Bootstrap 4 .modal('hide') 不工作