2016-08-30 21 views
0

WordpressでSidr Menuプラグインを使用しています。 Sidrはモバイルレイアウトにいくつかの問題を抱えています。これはJavaScriptのビットを使って修正しました。サブメニューが表示されない(Sidr)

<script type="text/javascript"> 
    jQuery(window).load(function() { 
     if(jQuery("#sidr-main").length !== 0) {   
       jQuery(".sidr-class-sub-menu").each(function() { 
       jQuery(this).hide(); 
      }); 
      jQuery(".sidr-class-menu-item-has-children > a").each(function() { 
       if(jQuery(this).children().length == 0) { 
        jQuery(this).append('<span class="sidr-class-menu_arrow"><i class="fa fa-angle-right"></i></span>'); 
       } 
      }); 
       jQuery(".fa-angle-down").each(function() { 
        jQuery(this).removeClass("fa-angle-down"); 
       jQuery(this).addClass("fa-angle-right"); 
       }); 
      jQuery(".sidr-class-sub-menu").hide(); 
      jQuery(".sidr-class-menu_arrow").toggle(function() { 
       var id1 = jQuery(this).parent().parent().attr("id"); 
       jQuery(this).children().removeClass("fa-angle-right"); 
       jQuery(this).children().addClass("fa-angle-down"); 
       jQuery("#" + id1 + " ul.sidr-class-sub-menu").show(); 

       }, function() { 
        var id1= jQuery(this).parent().parent().attr("id"); 
        jQuery("#" + id1 + " ul.sidr-class-sub-menu").hide(); 
        jQuery(this).children().removeClass("fa-angle-down"); 
       jQuery(this).children().addClass("fa-angle-right"); 
       }); 
     } 
    }); 
    </script> 

このコードは、サイドバーにサブメニューを隠し、そもそもクリック可能な矢印を追加し、矢印の方向を変更し、サブメニューを表示または非表示にするjQueryのトグル機能を使用しています。 Chrome(モバイルとデスクトップ)とFirefoxでは、これは完全に機能します。

Safari(モバイルとデスクトップ)とデフォルトのアンドロイドブラウザでは、これは動作しません。 hide()メソッドとshow()メソッドは完全に動作しますが、何も再描画されません。メニューが展開され、サブメニューが表示されますが、サブメニュー(および見出し)は表示されません。すべてのブラウザの開発ツールによれば、表示はブロックされるように設定されているか、適切でないものに設定されています。

Safariで再描画されない問題があると聞いていました(WebkitだからChromeはそうです...)。解決策はもちろん、hide()とshow()を使用して強制的に再描画を行うことです。私の場合、これは明らかにうまくいきません:hide()とshow()が問題です。私はjQueryを使用しないようにしましたが、表示されないようにスタイルされた「hideThis」クラスの追加と削除も試みました。わずかに動作するのは、hide(2000)を使用することだけですが、展開する最初のメニューでのみ機能し、毎回は機能しません。

私はこれを2台のiPhoneと2台のAndroid端末とSafariを実行するWindowsデスクトップでテストしましたが、すべて同じ反応があります。

あなたが http://test.langcliffeavoca.church

EDITでこれを見てとることができ

: 隠す()とshow()確かに違いはありません - 私は(これを示す&を隠蔽しようとした)、this.parent( )、this.children()、それを何度もやってみましたが何も助けません。デバッグを通じて、イベントが正常に実行されていることがわかります。ブラウザでサイドメニューを閉じて再度開くことができ、すべてが正しく表示されるため、要素が実際に表示され、隠されていることも知っています。それは再描画されていないだけです。これはChrome、Firefox、Edge、Internet Explorerでは正しく動作しますが、SafariやネイティブAndroidでは正しく動作しません。

答えて

0

私が見つけた唯一の回避策は、実際には#sidr-main(サイドバー全体)を非表示にして10msの遅延で表示することです。これはフラッシュを引き起こしますが、それほど目立つことはありません。私はthis user agent detection codeを使用して、ブラウザがSafariか、Samsung、HTC、Sony、またはLGのデフォルトブラウザを検出しました。これは、実際に必要でない限り、サイドバー全体を隠して表示することを排除します。私もこのコードを使っていくつかの問題を修正しなければならなかった:

var 
     ua = navigator.userAgent, 
     browser = /Edge\/\d+/.test(ua) ? 'ed' : /MSIE 9/.test(ua) ? 'ie9' : /MSIE 10/.test(ua) ? 'ie10' : /MSIE 11/.test(ua) ? 'ie11' : /MSIE\s\d/.test(ua) ? 'ie?' : /rv\:11/.test(ua) ? 'ie11' : /Firefox\W\d/.test(ua) ? 'ff' : /Chrom(e|ium)\W\d|CriOS\W\d/.test(ua) ? 'gc' : /\bSafari\W\d/.test(ua) ? 'sa' : /\bOpera\W\d/.test(ua) ? 'op' : /\bOPR\W\d/i.test(ua) ? 'op' : typeof MSPointerEvent !== 'undefined' ? 'ie?' : '', 
     os = /Windows NT 10/.test(ua) ? "win10" : /Windows NT 6\.0/.test(ua) ? "winvista" : /Windows NT 6\.1/.test(ua) ? "win7" : /Windows NT 6\.\d/.test(ua) ? "win8" : /Windows NT 5\.1/.test(ua) ? "winxp" : /Windows NT [1-5]\./.test(ua) ? "winnt" : /Mac/.test(ua) ? "mac" : /Linux/.test(ua) ? "linux" : /X11/.test(ua) ? "nix" : "", 
     touch = 'ontouchstart' in document.documentElement, 
     mobile = /IEMobile|Windows Phone|Lumia/i.test(ua) ? 'w' : /iPhone|iP[oa]d/.test(ua) ? 'i' : /Android/.test(ua) ? 'a' : /BlackBerry|PlayBook|BB10/.test 
     //window.alert(ua + " ||| " + browser + " ||| " + os); 
    var fix = 0; 
    if ((ua.indexOf("SamsungBrowser") > -1) || (ua.indexOf("HTC") > -1) || (ua.indexOf("LG-") > -1) || (ua.indexOf("Sony") > -1)) {var fix = 1} 
    if (browser == "sa") {var fix = 1} 

    jQuery(window).load(function() { 
     if (jQuery("#sidr-main").length !== 0) {  
       jQuery(".sidr-class-sub-menu").each(function() { 
        jQuery(this).hide(); 
       }); 
       jQuery(".sidr-class-menu-item-has-children > a").each(function() { 
        if(jQuery(this).children().length == 0) { 
         jQuery(this).append('<span class="sidr-class-menu_arrow"><i class="fa fa-angle-right"></i></span>'); 
        } 
       }); 
       jQuery(".fa-angle-down").each(function() { 
        jQuery(this).removeClass("fa-angle-down"); 
        jQuery(this).addClass("fa-angle-right"); 
       }); 
      jQuery(".sidr-class-sub-menu").hide(); 
      jQuery(".sidr-class-menu_arrow").click(function(event) { 
       event.preventDefault(); 
       event.stopPropagation(); 
       if (jQuery(this).children().hasClass("fa-angle-right")) { 
        var id1 = jQuery(this).parent().parent().attr("id"); 
        jQuery(this).children().removeClass("fa-angle-right"); 
        jQuery(this).children().addClass("fa-angle-down"); 
        jQuery("#" + id1 + " ul.sidr-class-sub-menu").show(10); 
        jQuery(this).parent().parent().children(".sidr-class-menu-item-has-children ul").each(function() { 
         jQuery(this).find("li ul").hide(); 
        }); 
        if (fix==1) { 
         jQuery("#sidr-main").hide(10); 
         jQuery("#sidr-main").show(10); 
        } 
       } else { 
        var id1= jQuery(this).parent().parent().attr("id"); 
        jQuery("#" + id1 + " ul.sidr-class-sub-menu").hide(10); 
        jQuery(this).children().removeClass("fa-angle-down"); 
        jQuery(this).children().addClass("fa-angle-right"); 
        jQuery("#sidr-main").hide(10); 
        jQuery("#sidr-main").show(10); 
       } 
      }); 
     } 
    }); 
関連する問題