18

我有带按钮的模式(保存)

<button type="button" class="btn btn-success btn-sm" data-dismiss="modal" onclick="do_save()">Save
    </button>

do_save()功能失败时如何防止关闭?(例如当某些数据无法验证时)

4

4 回答 4

35

不要使用data-dismiss="modal"and 让你的函数关闭(隐藏)你的模式:

<button type="button" class="btn btn-success btn-sm" onclick="do_save()">Save</button>

"

function do_save()
    {
        if(Math.floor(Math.random() * 2)==1)
        {
            console.log('success');
            $('#myModal').modal('hide');
            return;
        }   
        console.log('failure');
        return false;
    }   
于 2013-09-29T13:59:19.883 回答
7

因为无论如何你都在使用 jQuery,所以尽量不要在你的代码中嵌入 JavaScript/jQuery。

$('#buttonId').on( 'click', function () {
   // either call do_save or embed the contents of do_save in here
   var myDataIsValid = true; // change to call validator function
   if (myDataIsValid) {
     $('#myModal').modal('hide');
   }
   return true; // value depends on whether you want stopPropagation or not.
});

HTML:

<button id="buttonId" type="button" class="btn btn-success btn-sm">Save</button>

作为替代方案,您可以通过拦截“隐藏”事件并从中返回 false 来防止关闭。

于 2014-07-08T12:01:52.110 回答
7

如果您从按钮中捕获点击事件,如下所示:

     $('#buttonId').off('click').click(function(clickEvent){
        //enter code here
     });

你实际上可以防止关闭你的模态。为此,根据您的情况,您会发现这两个功能很有用:

     clickEvent.preventDefault();
     clickEvent.stopPropagation();

如果我正确理解了这个站点(德语) http://www.mediaevent.de/javascript/event-handler-default-verhindern.html,preventDefault () 会立即停止默认操作(例如跟随链接)。但是,事件本身仍将通过 DOM 传播,并且可以被各种事件侦听器“听到”,其中之一就是隐藏模式的事件侦听器。为此,需要第二个函数,它会停止事件在 DOM 中的传播。因此,隐藏的侦听器听不到它,并且窗口不会关闭(隐藏)。因此,我建议实现这样的功能:

     $('#buttonId').off('click').click(function(clickEvent){
        //enter code here
      var myDataIsValid = true;
      // check if Data is valid => myDataIsValid = true or false
      if(myDataIsValid){
       //do Stuff
      }else{
       clickEvent.preventDefault();
       clickEvent.stopPropagation();
       //do other Stuff
      }
    });

在我的代码中,我只需要使用 stopPropagation(),因为我需要默认操作,因此您可以独立使用这两个函数。

注意:此解决方案仅使用 Firefox 浏览器进行了测试

于 2016-07-16T14:38:31.723 回答
3

如果您使用的是 bootstrap 4,这称为“静态背景”,可以通过添加data-backdrop="static"属性来实现

<div class="modal fade" id="modalExample" data-backdrop="static">

src:Bootstrap 4 Modal - 静态背景

于 2020-02-17T21:18:26.340 回答