0

我在 Wordpress 中使用 Sidr Menu 插件。Sidr 在其移动布局中有几个问题,我使用一些 javascript 修复了这些问题。

<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(移动和桌面)和默认的 android 浏览器上,这不起作用。hide() 和 show() 方法完美运行,但没有重绘。菜单展开以允许显示子菜单,但不显示子菜单(和标题)。根据每个浏览器中的开发人员工具,显示被设置为适当的阻止或无。

我听说 Safari 可能存在不重绘事物的问题(因为它是 Webkit,但 Chrome 也是如此,所以......)。解决方案当然是使用 hide() 和 show() 来强制重绘。就我而言,这显然行不通: hide() 和 show() 是问题所在。我试过不使用 jQuery,还尝试添加和删除一个“hideThis”类,该类的样式设置为不显示。唯一有效的是使用 hide(2000),但这仅适用于您展开的第一个菜单,并且并非每次都有效。

我已经在两部 iPhone 和两部 Android 手机以及运行 Safari 的 Windows 桌面上对此进行了测试,它们的反应完全相同。

你可以在http://test.langcliffeavoca.church看看这个

编辑:Hide() 和 show() 绝对没有区别 - 我尝试隐藏和显示 this()、this.parent() 和 this.children(),并尝试多次这样做,但没有任何帮助。通过调试,我知道事件被正确触发。我也知道这些元素实际上是被显示和隐藏的,因为我可以在浏览器中关闭并重新打开侧边菜单,并且一切都正确显示。它只是没有被重绘。这适用于 Chrome、Firefox、Edge 和 Internet Explorer,但不适用于 Safari 或原生 Android。

4

1 回答 1

0

我为此找到的唯一解决方法实际上是隐藏和显示#sidr-main(整个侧边栏),延迟为 10 毫秒。这会导致闪光,但不是很明显。我使用这个用户代理检测代码来发现浏览器是 safari,还是三星、HTC、索尼或 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);
                }
            });
        }
    });
于 2016-09-21T15:07:38.787 回答