【问题标题】:How to disable jQuery accordion conditionally如何有条件地禁用 jQuery 手风琴
【发布时间】:2017-04-15 15:26:03
【问题描述】:

我想有条件地启用和禁用或更好地在我的菜单上添加和删除 jQuery 手风琴,是否可以在屏幕旋转或屏幕大小更改时添加或删除它?我试过了,但它似乎不起作用,手风琴仍在用于更改屏幕尺寸。

jQuery( document ).ready( function(){
    apply_accordion();
    jQuery(window).on("orientationchange",function(){
        apply_accordion();
    });
} );
function apply_accordion(){
    if (jQuery(window).width() < 540) {
        jQuery('.footer-area').accordion({
            icons: { "header": "icon-large ui-icon-carat-1-s", "activeHeader": "icon-large ui-icon-caret-1-n" },
            active: false,
            autoHeight: false,
            navigation: true,
            collapsible: true,
        });
    } else {
        //jQuery( '.footer-area' ).accordion( "disable" );
        //jQuery( '.footer-area' ).accordion( "destroy" );
        // jQuery( '.footer-area' ).accordion( "refresh" );
        jQuery( '.footer-area' ).accordion( "destroy" ).accordion();
    }
}

更新

如果其他部分将是,

} else {
    jQuery( '.footer-area' ).accordion( "destroy" );
    jQuery('.footer-area').accordion('option', 'active', 0);
}

当我开始从纵向移动到横向时,它正在工作,但反过来不起作用,这意味着当我从横向移动到纵向时它不起作用。并且还在控制台中给出错误不能call methods on accordion prior to initialization; attempted to call method 'destroy'

jsfield

我想根据屏幕尺寸删除和添加手风琴。

注意:

jQuery 版本 1.11.4

检查 Techbreak 的答案 https://jsfiddle.net/voytfj2q/20/ 它似乎正在工作,但如果您检查控制台,它将生成“Uncaught Error: cannot call methods on accordion prior to initialization;尝试调用方法'destroy'”。在实际实现中,当我从横向移动到纵向时,它不起作用。

我还发布了一个解决方法,目前在我的实现中它对我有用,但我知道这只是一种解决方法。

这里是另一个fiddle,如果你慢慢增加和减少屏幕尺寸,你会注意到这个问题。

问题的屏幕截图,您可以注意到其中一些手风琴被禁用以增加尺寸,而有些则没有被禁用。

【问题讨论】:

  • 你能添加工作小提琴链接吗?
  • 参考这个stackoverflow.com/questions/23996726/… 我相信你最终会触发这两个事件。
  • @TechBreak 请查看我更新的代码,我已经尝试了一些东西,现在它只是在屏幕尺寸更改上,但仍然无法正常工作。你能提出一些建议吗?
  • 我已经解决了您的问题,请参考以下答案。如果真的解决了您的问题,请接受:)
  • @PrafullaKumarSahu:这里解决了 2 个问题:jsfiddle.net/Lgx4es86/6

标签: javascript jquery accordion jquery-ui-accordion


【解决方案1】:

当尺寸大到足以展开内容或屏幕完全旋转时,您需要激活手风琴展开,如下所示,

jQuery(document).ready(function() {

  jQuery(window).on("resize", function() {
      if (jQuery(window).width() < 540) {

          jQuery('.footer-area').accordion({
              active: false, collapsible:true, active:true
          });
      } else {
          //reactivate the accordian so that it can be expanded again
          jQuery('.footer-area').accordion('option', 'active', 0);
      }
   });

为您的示例工作小提琴:https://jsfiddle.net/voytfj2q/18/ });

【讨论】:

  • 感谢您快速回复TechBreak,但这也没有解决我的问题,我添加了移动jquery并再次测试它。 :(
  • 我已经附上了工作小提琴,请检查您缺少的没有触发事件的内容。
  • 如果您正在谈论该警报,在我的情况下,我也得到了该警报,但这并没有禁用手风琴,问题不在于代码没有执行它,而是它没有完成工作。
  • 即使我用jQuery(window).resize 进行测试:(
  • 很抱歉,这里输入的时候其实是侧边栏区域,我在这里犯了一个错误,但是在我的代码中它是footer-area 并且不起作用。
【解决方案2】:

好的。实际上,您已经用许多不同的手风琴实例解决了这个问题,这在您的原始帖子中没有得到证明,所以这里使用了错误的选择器 .footer-area

      jQuery('.footer-area').accordion({
          active: false, collapsible:true, active:true
      });

已调整。

问题 #1:

由于您需要根据页面大小创建和销毁小部件,因此我们需要在调用手风琴的任何方法之前检查每个小部件实例是否存在,否则会引发臭名昭著的错误:...cannot call methods on *some-widget* prior to initialization.

这个问题可以通过检查 data 的存在来解决,该 data 在创建小部件实例时附加到元素中:

var isInstance1 = (typeof jQuery('#footer-widget-area-1 .footer-area').data("ui-accordion") != "undefined");

问题 #2:

当您切换回无样式菜单时,页面高度会增加,页面会显示垂直滚动条,从而导致页面宽度不同。页面再次调整大小,您对 window.width 的检查将表现不稳定。

这就是您需要检查jQuery('body').width() + scrollbar_width() 的原因。只需使用提供的函数按原样获取滚动条宽度,并将其包含在您的 sn-p 库中。

小提琴:https://jsfiddle.net/Lgx4es86/6/

/* Calculates scrollbar width in pixels */
function scrollbar_width() {
    if( jQuery('body').height() > jQuery(window).height()) {

        /* Modified from: http://jdsharp.us/jQuery/minute/calculate-scrollbar-width.php */
        var calculation_content = jQuery('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div>');
        jQuery('body').append( calculation_content );
        var width_one = jQuery('div', calculation_content).innerWidth();
        calculation_content.css('overflow-y', 'scroll');
        var width_two = jQuery('div', calculation_content).innerWidth();
        jQuery(calculation_content).remove();
        return ( width_one - width_two );
    }
    return 0;
}

jQuery( document ).ready( function(){
    apply_accordion();
    jQuery(window).resize(function() {
        apply_accordion();
    });
} );
function apply_accordion(){
  var ww = jQuery('body').width() + scrollbar_width();
    if (ww < 540) {
        jQuery('#footer-widget-area-1 .footer-area').accordion({
                active: false, collapsible:true
            });
        jQuery('#footer-widget-area-2 .footer-area').accordion({
                active: false, collapsible:true
            });
        jQuery('#footer-widget-area-3 .footer-area').accordion({
                active: false, collapsible:true
            });
        jQuery('#footer-widget-area-5 .footer-area').accordion({
                active: false, collapsible:true
            });
        jQuery('#footer-widget-area-6 .footer-area').accordion({
                active: false, collapsible:true
            });
        } else {
            var isInstance1 = (typeof jQuery('#footer-widget-area-1 .footer-area').data("ui-accordion") != "undefined");
            if (isInstance1) {
                jQuery('#footer-widget-area-1 .footer-area').accordion('option', 'active', 0);
                jQuery('#footer-widget-area-1 .footer-area').accordion("destroy");
            }
            var isInstance2 = (typeof jQuery('#footer-widget-area-2 .footer-area').data("ui-accordion") != "undefined");
            if (isInstance2) {
                jQuery('#footer-widget-area-2 .footer-area').accordion('option', 'active', 0);
                jQuery('#footer-widget-area-2 .footer-area').accordion("destroy");
            }
            var isInstance3 = (typeof jQuery('#footer-widget-area-3 .footer-area').data("ui-accordion") != "undefined");
            if (isInstance3) {
                jQuery('#footer-widget-area-3 .footer-area').accordion('option', 'active', 0);
                jQuery('#footer-widget-area-3 .footer-area').accordion("destroy");
            }
            var isInstance5 = (typeof jQuery('#footer-widget-area-5 .footer-area').data("ui-accordion") != "undefined");
            if (isInstance5) {
                jQuery('#footer-widget-area-5 .footer-area').accordion('option', 'active', 0);
                jQuery('#footer-widget-area-5 .footer-area').accordion("destroy");
            }
            var isInstance6 = (typeof jQuery('#footer-widget-area-6 .footer-area').data("ui-accordion") != "undefined");
            if (isInstance6) {
                jQuery('#footer-widget-area-6 .footer-area').accordion('option', 'active', 0);
                jQuery('#footer-widget-area-6 .footer-area').accordion("destroy");
            }
        // var isInstance = (typeof jQuery('.footer-area').data("ui-accordion") != "undefined");
        // if (isInstance){
        //  jQuery('.footer-area').accordion('option', 'active', 0);
        //  jQuery('.footer-area').accordion( "destroy" );
        // }
    }
}

您的解决方法:

您正在应用和删除手风琴样式,但没有破坏小部件实例,因此数据事件处理程序仍然存在。您至少需要将jQuery('.footer-area').accordion 部分移动到另一个位置,以便只执行一次。此外,除此之外,您的解决方法无法解决页面宽度问题。

滚动条宽度函数:感谢 Alex Mansfield (http://alexmansfield.com/javascript/css-jquery-screen-widths-scrollbars)

【讨论】:

    【解决方案3】:

    当屏幕尺寸发生变化时,解决方法是删除和添加类和属性。我正在发布此解决方法,但希望有一个正确的解决方案。

    jQuery(document).ready(function() {
    
      jQuery(window).on("resize", function() {
          if (jQuery(window).width() < 540) {
    
              jQuery('.footer-area').accordion({
                  active: false, collapsible:true, active:true
              });
    
              jQuery('.footer-area h2').append('<span class="ui-accordion-header-icon ui-icon ui-icon-carat-1-s"></span>');
              jQuery('.footer-area div').css('display', 'none');
              jQuery('.footer-area div').addClass('ui-widget-content');
              jQuery('.footer-area div').addClass('ui-accordion-content');
              jQuery('.footer-area h2').addClass('ui-accordion-header');
              jQuery('.footer-area h2').addClass('ui-accordion-icons');
    
          } else {
              jQuery('.footer-area h2 .ui-accordion-header-icon').remove();
              jQuery('.footer-area div').removeAttr('style');
              jQuery('.footer-area div').removeClass('ui-widget-content');
              jQuery('.footer-area div').removeClass('ui-accordion-content');
              jQuery('.footer-area h2').removeClass('ui-accordion-header');
              jQuery('.footer-area h2').removeClass('ui-accordion-icons');
          }
       });
    

    【讨论】:

      【解决方案4】:

      有一个使用纯 CSS 的选项,您可以在其中使用媒体查询根据屏幕大小相应地显示或隐藏它们:

      假设你的手风琴头上有ui-accordion-header 类,当它被渲染时。

      现在你可以把它放在你的样式表中了:

      @media screen and (min-width: 0) and (max-width: 1024px) {
        .ui-accordion-header { display: block; }  /* show it on small screens */
      }
      
      @media screen and (min-width: 0) and (max-width: 400px) {
        .ui-accordion-header { display: none; }   /* hide it elsewhere */
      }
      

      或者:

      @media all and (orientation:portrait) {
        .ui-accordion-header { display: none; }
      }
      
      @media all and (orientation:landscape) {
        .ui-accordion-header { display: block; }
      }
      

      而且您不需要编写任何js 代码。检查代码here

      【讨论】:

      • 我试过你的代码,它们都对我有用,但我仍然感谢你的努力。
      • 你有fiddle或plunkr吗? @PrafullaKumarSahu
      • 是的,如果您注意到jsfiddle.net/voytfj2q/20,问题本身包含一个链接
      • 我已经根据 id 选择器放了一个工作代码,但你明白了@PrafullaKumarSahu
      • 检查jsfiddle.net/voytfj2q/20 它似乎正在工作,但如果您检查控制台,它将生成“未捕获的错误:在初始化之前无法调用手风琴上的方法;试图调用方法'destroy'”。在实际实现中,当我从横向移动到纵向时,它不起作用。
      【解决方案5】:
              var myAccordion = null;
              jQuery(document).ready(function () {
                  createAccordion(true);
                  jQuery(window).bind("resize", function (event) {
      
                      updateAccordion();
                  });
              });
              function createAccordion(value){
              try{
      
      
                 $(".footer-area").accordion({
                          icons: {"header": "icon-large ui-icon-carat-1-s", "activeHeader": "icon-large ui-icon-caret-1-n"},
                          active: 0,
                         // heightStyle: "fill",
      
                          collapsible: value
                      });
      
      
                   }catch(e){
              alert(e);
              }   
              }
      
              function updateAccordion() {
      
            try{
             var w = jQuery(window).width();
                 if (w < 540){
                 $(".footer-area").accordion("option", "collapsible", false);
      
      
                 }else{
      
                  $(".footer-area").accordion("option", "collapsible", true);
                 }
      
      
            }catch(e){
      
            alert(e);
            }
      
      
                  }
      

      【讨论】:

      • 感谢您的友好回复,第一个我已经尝试过,但对我没有用,第二个,我一定会尝试,当我回家时,远离我的系统现在,我也想为这么晚的回复道歉。
      • 第二个也不起作用,第二个导致 div 在移动设备上消失,当返回横向时,它保留了手风琴,这是我想要删除的,对于横向,我是试图将其显示为普通 html 和肖像,我希望它使用手风琴。
      • 您好 toto,我尝试了您的更新代码,但它仍然对我不起作用,您可以在这里查看 jsfiddle.net/voytfj2q/21jsfiddle.net/voytfj2q/22
      • 你用的是什么版本的jquery?
      • 嗨,我更新了 jsfiddle 代码并从我身边工作。请检查。 jsfiddle.net/voytfj2q/69
      猜你喜欢
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2013-01-13
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多