【问题标题】:disable browser scrolling while jQuery UI modal dialog is open在打开 jQuery UI 模式对话框时禁用浏览器滚动
【发布时间】:2019-09-13 23:24:41
【问题描述】:

是否可以在打开 jQuery UI 模式对话框时禁用浏览器中的滚动(仅适用于浏览器的滚动条)。

注意:我确实希望在对话框中启用滚动

【问题讨论】:

  • 那么您是如何使用正确答案在对话框中启用滚动的?
  • @Feanor atm 我正在为对话框 div 设置 css position:fixed,所以即使浏览器滚动对话框保持固定,并且在对话框内滚动使用默认 css(溢出:自动)
  • CSS 溢出的 JSBin 参考 jsbin.com/yicidecodu/1/edit?html,css,output

标签: jquery jquery-ui


【解决方案1】:
$(formObject).dialog({
 create: function(event, ui) {
  $("body").css({ overflow: 'hidden' })
 },
 beforeClose: function(event, ui) {
  $("body").css({ overflow: 'inherit' })
 }
});

或者正如我在下面的评论中提到的那样:

var dialogActiveClassName="dialog-active";
var dialogContainerSelector="body";

$(formObject).dialog({
 create: function(event, ui) {
   $(dialogContainerSelector).addClass(dialogActiveClassName);
 },
 beforeClose: function(event, ui) {
   $(dialogContainerSelector).removeClass(dialogActiveClassName);
 }
});

但老实说,您应该确保创建一个对话框将一个事件冒泡到您要监视所述事件的窗口对象,大致类似于这样的伪:

var dialogActiveClassName="dialog-active";
var dialogContainerSelector="body";
$(window).on("event:dialog-opened", function(){
    $(dialogContainerSelector).addClass(dialogActiveClassName);
});
$(window).on("event:dialog-closed", function(){
    $(dialogContainerSelector).removeClass(dialogActiveClassName);
});

【讨论】:

  • 这只会隐藏滚动条,不会阻止滚动
  • 也为我工作。如果您想稍后打开对话框(而不是在页面加载时),请将隐藏的滚动条绑定到“打开”事件而不是“创建”。
  • 起初,它在我的项目中使用 IE8 时不起作用。但是,我通过将上面的选择器更改为 $("html, body") 使其工作,因此样式将应用于 body 元素和 HTML 元素。出于某种原因,这使它开始为我工作!只是在这里提到这一点,以防其他人遇到这个问题......希望它会节省一些时间。我对这个整体解决方案的唯一问题是当 Y 轴滚动条消失时,它会产生轻微的水平屏幕抖动。 (当 jquery 对话框打开和关闭时)
  • 实际上处理此问题的“最佳实践”(tm) 方法是在您的对话框元素周围的任何容器对象上切换类名。
  • 我建议将防止滚动的功能放在open 事件而不是create 事件上。例如,如果您有一个显示模态对话框的按钮,如果您已经创建了对话框,即使它没有显示,主体也将无法滚动。
【解决方案2】:

我需要做同样的事情,只需在正文中添加一个类即可:

.stop-scrolling {
  height: 100%;
  overflow: hidden;
}

当你想重新启用滚动时,添加类然后删除,在 IE、FF、Safari 和 Chrome 中测试。

$('body').addClass('stop-scrolling')

【讨论】:

  • 这个真的应该是答案!
  • /golf clap.. ::single_nod::
  • 亲切!你可以装上对话框....open:function () { $('body').addClass('stop-scrolling');}, beforeClose:function (){$('body').removeClass('stop -scrolling');}.....
  • 最佳答案,很聪明:-)
  • 鼠标滚动没问题,但你仍然可以使用键盘按钮滚动。
【解决方案3】:

JS Bin reference for CSS overflow

只需添加

$('body').css('overflow','hidden');

显示模式的函数。

还有

$('body').css('overflow','scroll');

到你的关闭模式的函数。

【讨论】:

  • 我对一个简单的解决方案有足够的赞赏。谢谢!
  • 最佳解决方案!
  • 对于那些使用 primefaces 并希望在显示模态对话框时阻止网站正文滚动的人,只需将这两个放入 p:dialog 的 onHide 和 onShow 属性中,例如onHide="$('body').css('overflow','scroll');" onShow="$('body').css('overflow','hidden');"
【解决方案4】:

使用上面 JasCav (these functions) 的答案中引用的函数,这是我能想到的最好的方法来解决这个问题(我遇到了同样的问题):

dialogClass: 'dialog_fixed',
create: function(event, ui) {
    disable_scroll(); // disable while dialog is visible
    $('#dialog_form').hover(
        function() { enable_scroll(); }, // mouse over dialog
        function() { disable_scroll(); } // mouse not over dialog
    );
},
beforeClose: function(event, ui) {
    enable_scroll(); // re-enable when dialog is closed
},

css 是:

.dialog_fixed { position:fixed !important; }

它只是将对话框固定在页面上,也许我们不再需要了。

这允许鼠标在对话框上方时鼠标滚动,但在对话框外时不允许。不幸的是,当鼠标悬停在对话框上并且您滚动到对话框内内容的末尾时,它仍然会滚动主页(在 IE 中立即,在 Safari 和 Firefox 中经过短暂的延迟)。我很想知道如何解决这个问题。

我在 Safari 5.1.5、Firefox 12 和 IE 9 中对此进行了测试。

【讨论】:

    【解决方案5】:

    停止滚动调整对话框位置并在用户关闭对话框后返回他们正在查看的部分页面

    $('<div/>').dialog({
        open : function(event, ui) { 
            $('html').attr('data-scrollTop', $(document).scrollTop()).css('overflow', 'hidden');
            $(this).dialog('option','position',{ my: 'center', at: 'center', of: window });
        },
        close : function(event, ui) { 
            var scrollTop = $('html').css('overflow', 'auto').attr('data-scrollTop') || 0;
            if( scrollTop ) $('html').scrollTop( scrollTop ).attr('data-scrollTop','');
        }
    });
    

    【讨论】:

    • 当您希望在打开对话框时阻止页面滚动时,这是预期的功能。如果您在对话框打开时将鼠标悬停在某物上并希望保留悬停状态,最好的方法是使用样式的添加/删除类。
    【解决方案6】:

    您不能完全禁用滚动,但可以使用鼠标滚轮和通常执行滚动的按钮来停止滚动。

    查看this answer 以了解它是如何完成的。您可以在create event 上调用这些函数并在close 上恢复一切正常。

    【讨论】:

    • 这是一个不错的解决方案,但它也禁用了对话框中的滚动,但如果我正确理解了这个问题,我们希望滚动在对话框中起作用,而不是在其他任何地方。
    • @CraigNakamoto,我想你可以在那之后将 eventListener 附加到对话框中。所以滚动将在文档级别被禁用,但对话框仍然有一个滚动事件监听器。类似于$(document).('on', '.dialog', function(){ /*scroll code*/ });
    【解决方案7】:

    只是对上面由 hallodom 发布的答案的修改

    $('body, html').addClass('stop-scrolling')

    在我添加 html 之前,浏览器滚动未被禁用。

    .stop-scrolling {
      overflow: hidden;
    }
    

    通过移除 height: 100%,移除了顶顶效果。

    在 Chrome、Firefox 和 Safari 上测试。

    【讨论】:

      【解决方案8】:

      旧帖子,但我这样做的方式是:

      open: function(event, ui) {                
           $('html').css('overflow', 'hidden');
           $('.ui-widget-overlay').width($(".ui-widget-overlay").width() + 18);
           },
      close: function(event, ui) {
           $('html').css('overflow', 'hidden');
      }
      

      这似乎工作得很好

      【讨论】:

        【解决方案9】:

        找了好久。最后,下面的链接救了我。希望对其他人有所帮助。

        它使用一个容器作为主体。对话框中的滚动不会影响背景容器。

        http://coding.abel.nu/2013/02/prevent-page-behind-jquery-ui-dialog-from-scrolling/

        【讨论】:

          【解决方案10】:

          创建这个 css 类:

          .stop-scrolling {
              overflow:hidden;
              height: 100%;
              left: 0;
              -webkit-overflow-scrolling: touch;
              position: fixed;
              top: 0;
              width: 100%;
          }
          

          然后将其添加到您的对话框初始化中:

          $("#foo").dialog({
              open: function () {
                  $('body').addClass('stop-scrolling');
              },
              close: function () {
                  $('body').removeClass('stop-scrolling');
              },
              // other options
          });
          

          如果您已经在使用 open: 和 close: 来调用其他函数,只需在适当的位置添加 addClass 和 removeClass 行。

          【讨论】:

            【解决方案11】:
            $(settings.dialogContentselector).dialog({
                    autoOpen: false,
                    modal: true,
                    open: function( event, ui ) {
                        $("html").css({ overflow: 'hidden' });
                        $("body").css({ overflow: 'hidden' });
                    },
                    beforeClose: function( event, ui ) {
                        $("html").css({ overflow: 'auto' });
                        $("body").css({ overflow: 'auto' });
                    }
                });
            

            【讨论】:

              【解决方案12】:

              试试这个。它被http://jqueryui.com 自己使用

              html { overflow-y: scroll; }

              【讨论】:

                【解决方案13】:

                create: 事件使页面第一次加载时滚动条消失 我用open: 更改它,现在像魅力一样工作

                【讨论】:

                  【解决方案14】:

                  在弹出窗口关闭时避免正文跳到顶部的更好解决方案:

                  $(document).ready(function(){
                    var targetNodes         = $(".cg-popup");
                    var MutationObserver    = window.MutationObserver || window.WebKitMutationObserver;
                    var myObserver          = new MutationObserver (mutationHandler);
                    var obsConfig           = { attributes : true, attributeFilter : ['style'] };
                    // ADD A TARGET NODE TO THE OBESERVER. CAN ONLY ADD ONE NODE AT TIME
                    targetNodes.each ( function () {
                        myObserver.observe (this, obsConfig);
                    } );
                    function mutationHandler (mutationRecords) {
                      var activate_scroll = true;
                      $(".cg-popup").each(function( index ) {
                        if($(this).css("display") != "none"){
                          $('html, body').css({'overflow-y': 'hidden', 'height': '100%'});
                          activate_scroll = false;
                          return;
                        }
                      });
                      if(activate_scroll){
                        $('html, body').css({'overflow-y': 'auto', 'height': 'auto'});
                      }
                    }
                  });
                  

                  【讨论】:

                    【解决方案15】:

                    此问题已修复, 解决方案:只需打开您的 bootstap.css 并进行如下更改

                    body.modal-打开,
                    .modal-open .navbar-fixed-top,
                    .modal-open .navbar-fixed-bottom {
                    右边距:15px;
                    }

                    body.modal-打开,
                    .modal-open .navbar-fixed-top,
                    .modal-open .navbar-fixed-bottom {
                    /margin-right: 15px;/
                    }

                    请在 3 分钟内观看以下 youtube 视频,您的问题将得到解决... https://www.youtube.com/watch?v=kX7wPNMob_E

                    【讨论】:

                      【解决方案16】:

                      这是因为您必须在代码中添加modal: true;这会阻止用户与背景交互。

                      【讨论】:

                      • 您无法与背景交互,但您仍然可以使用滚动条或鼠标滚轮滚动页面
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-02-14
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多