【问题标题】:Jquery - How to disable the entire pageJquery - 如何禁用整个页面
【发布时间】:2012-03-14 01:34:03
【问题描述】:

我有这个 ajax 事件

function save_response_with_ajax(t){
  var form = $('#edit_'+t);
  var div = $('#loading_'+t);
  $.ajax({
    url: form.attr("action"), 
    type: "POST",    
    data: form.serialize(), 
    cache: false,
    beforeSend: function(){
      form.hide();
      div.show();
    },
    complete: function(){
      div.hide();
      form.show();
    },
    success: function (result) {
    }       
  });
}

一切正常,但我想添加(如果可能的话)在之前/完成 ajax 事件之前将整个页面(内容/正文)变为灰色的能力,就像它是一个模态(就像这个 @ 987654321@ 但没有对话框)

有没有办法做到这一点?

提前致谢

哈维尔 Q。

【问题讨论】:

    标签: javascript css jquery-ui jquery


    【解决方案1】:

    这样做的一种方法是使用覆盖整个页面的覆盖元素。如果覆盖元素具有半透明的背景颜色,它将使页面完全变灰:http://jsfiddle.net/SQdP8/1/

    给它一个高z-index,使它位于所有其他元素之上。这样,它就可以正确渲染,并捕获所有事件(并且不会传递它们)。

    #overlay {
        background-color: rgba(0, 0, 0, 0.8);
        z-index: 999;
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        display: none;
    }​
    

    【讨论】:

    • 它工作正常...但是如果ajax事件没有完成...我可以点击那个背景,我想我必须编辑我的问题并询问是否有办法避免用户点击其他他们等待的地方......谢谢:)
    • @JavierQQ23:好吧,我把它放在小提琴中,这样你就可以再试一次(小提琴不做 ajax,它只是显示覆盖)。只是不要包含.click 部分。
    • rgba() 在任何 IE rgba(),还需要一个默认值
    • background-color: black; opacity: 0.8; 也可以工作。对于 IE,它将完全是黑色的。
    • 位置应该固定在这里,因为如果你进一步滚动,灰色覆盖会停留在页面顶部。
    【解决方案2】:

    你可以试试

     $("body").append('<div id="overlay" style="background-color:grey;position:absolute;top:0;left:0;height:100%;width:100%;z-index:999"></div>');
    

    然后就用

    $("#overlay").remove();

    摆脱它。

    又快又脏。

    【讨论】:

    • 你缺少右引号,我更正了,否则append 在最新的 jQuery 中不起作用
    • 我相信 .remove() 只适用于类选择器。
    【解决方案3】:

    尝试在“beforeSend”函数中添加叠加层:

    $("body").prepend("<div class=\"overlay\"></div>");
    
    $(".overlay").css({
        "position": "absolute", 
        "width": $(document).width(), 
        "height": $(document).height(),
        "z-index": 99999, 
    }).fadeTo(0, 0.8);
    

    【讨论】:

      【解决方案4】:

      这是我正在使用的完整解决方案:

      以下是部分:

      1. 用于叠加的 CSS。 “固定”用于覆盖整个页面内容,而不仅仅是屏幕高度和宽度。您可以使用背景颜色或 gif

      2. 附加到 jQuery Ajax 调用的“beforeSend”事件。按需创建叠加层并显示它。

      3. 请求完成后,它会从 DOM 中移除覆盖层

      CSS:

      .request-overlay {
          z-index: 9999;
          position: fixed; /*Important to cover the screen in case of scolling content*/
          left: 0;
          top: 0;
          width: 100%;
          height: 100%;
          display: block;
          text-align: center;
          background: rgba(200,200,200,0.5) url('../../Images/submit-ajax-loader.gif') no-repeat center; /*.gif file or just div with message etc. however you like*/
      }
      

      JavaScript:

      $.ajax({
                      url: '/*your url*/',
                      beforeSend: function () {
                          $('body').append('<div id="requestOverlay" class="request-overlay"></div>'); /*Create overlay on demand*/
                          $("#requestOverlay").show();/*Show overlay*/
                      },
                      success: function (data) {
                          /*actions on success*/
                      },
                      error: function (jqXhr, textStatus, errorThrown) {
                          /*actions on error*/
                      complete: function () {
                          $("#requestOverlay").remove();/*Remove overlay*/
                      }
                  });
      

      【讨论】:

        【解决方案5】:

        使用 jQuery ajaxStart() 将 Div 附加到您的文档中。使用某种形式的半透明文档将其设置为文档的大小。然后在ajaxStop() 上删除它。

        【讨论】:

          【解决方案6】:
          var modal = $('<div>')
            .dialog({ modal: true });
          
          modal.dialog('widget').hide();
          
          setTimeout(function() { modal.dialog('close'); }, 2000); // to close it
          

          这是一个演示:http://jsbin.com/avoyut/3/edit#javascript,html,live

          别忘了致电modal.dialog('close'); 结束这一切!

          通过这种方式,您可以获得实际对话框模式代码、调整大小、禁用等的好处。

          希望这有助于 -ck

          【讨论】:

          • 我这样做了: beforeSend: function(){ $('
            ') .dialog({ modal: true }) .dialog('widget') .hide(); },但似乎什么也没发生(它会阻塞但灰色背景不起作用)
          • 你有 jQuery UI css 吗?该css是否有与之关联的叠加层?
          • 现在它可以正常工作了,但是在函数的开头我声明了 var modal = .....hide();在 beforeSend: function(){ modal }, complete: function() { modal.dialog('close'); }, 那是对的吗?还是我说错了?谢谢
          • 抱歉,如果您查看已编辑的代码,它演示了需要做什么,问题是 .dialog('widget') 更改了可链接的返回
          【解决方案7】:

          您可能还希望向用户提供一些正在发生的事情的指示,而不仅仅是空白/灰色屏幕。我会建议某种加载 gif,例如,参见 this

          【讨论】:

          • 实际上有一个 gif (div.show()) 并且它阻止了表单的单选按钮,但是我希望用户在 ajax 事件开始时避免单击其他链接
          【解决方案8】:

          今天我正在寻找一种适用于所有 IE 浏览器的解决方案。我拿了@pimvdb@Ash Clarke 的代码以及他提到background-color: black; opacity: 0.8; may also work. For IE it will just be completely black. 的评论并得出以下解决方案:

          $("#first-div").prepend("<div class=\"overlay-example\"></div>");
          
          var height1 = $("#first-div").height();
          var width1 = $("#first-div").width();
          
          $(".overlay-example").css({
              "background-color": "black",
              "z-index": "9999999",
              "position": "absolute",
              "width": width1,
              "height": height1,
              "display": "none"
          }).fadeTo(0, 0.0001);
          

          在IE8、IE9以上测试。无法检查 IE7。万一你发现它错了,我很乐意更新我的解决方案。 (它也会帮助我更新我的解决方案:))

          谢谢@pimvdb@Ash Clarke

          Demo

          【讨论】:

            猜你喜欢
            相关资源
            最近更新 更多
            热门标签