折腾:
【已解决】WordPress的网站Enfold主题在手机端顶部菜单异常
期间,已经确定不是css的原因了,此处看起来像是js的问题,感觉js没有正确运行,没有给对应节点加上is-active的class值,所以菜单显示异常了。去搞清楚具体什么原因。
注意到
www.china-teatime.com/wp-content/uploads/dynamic_avia
中的除了之前的css,还有header和footer的js:

比如:
avia-head-scripts-4d9be2120ec5317514492459d4c40f82.js
那么去看看:
此处真正用到的是哪个js
现有js中却的是哪部分内容-》这样拷贝过来,或许就可以了?
先去看看 现有正常的有哪些js文件:

不过需要先去搜索,哪些js中有我们希望的:
给.av-hamburger–spin 加上 is-active的
竟然没有找到js

还是对比js文件少了哪些吧

好像很多不同
不过先去看看此处生效的js:
但是是footer,此处顶部菜单,感觉像是header,再去找找是否有header的js
结果搜不到:
avia-head-scripts

代码中有:

正常的中:
/Users/crifan/dev/dev_root/crifan.com/mamp/wp_farmedia/wp-content/themes/enfold/config-templatebuilder/avia-template-builder/php/asset-manager.class.php
//default calling of the merging/compression script. the "merge" function can in theory also be called from outside
public function try_minifying_scripts()
{
// check if we got a compressed version that includes all the elements that we need.
// generate a new version if the theme version changes or the css files that are included change
// compare by hash if a new version is required
//compresses css files and stores them in a file called avia-merged-styles-HASH_ID.css
$this->merge('css', 'avia-merged-styles');
//compresses JS files and stores them in a file called avia-head-scripts-HASH_ID.js/avia-footer-scripts-HASH_ID.js// - footer scripts attr: (group 1)
//$this->merge('js', 'avia-head-scripts', array('groups'=>0));
$this->merge('js', 'avia-footer-scripts', array('groups'=>1));
}/Users/crifan/dev/dev_root/crifan.com/mamp/china_teatime/wp-content/themes/enfold/config-templatebuilder/avia-template-builder/php/asset-manager.class.php
//default calling of the merging/compression script. the "merge" function can in theory also be called from outside
public function try_minifying_scripts()
{
// check if we got a compressed version that includes all the elements that we need.
// generate a new version if the theme version changes or the css files that are included change
// compare by hash if a new version is required
//compresses css files and stores them in a file called avia-merged-styles-HASH_ID.css
$this->merge('css', 'avia-merged-styles');
//compresses JS files and stores them in a file called avia-head-scripts-HASH_ID.js/avia-footer-scripts-HASH_ID.js// - footer scripts attr: (group 1)
$this->merge('js', 'avia-head-scripts', array('groups'=>0));
}感觉是正常wp_farmedia页面也没用到avia-head-scripts
而此处china_teatime中好像合并出了avia-head-scripts,不过也没有用到的感觉
所以都没有用到avia-head-scripts,那就不管了。
去对比avia-footer-scripts
结果差异太大,看不出具体区别

最新页面的js倒是能搜到:av-hamburger
也能搜到:menu-main
后来无意间发现:
此处给:
<span class="av-hamburger av-hamburger--spin av-js-hamburger av-inserted-main-menu is-active"> <span class="av-hamburger-box"> <span class="av-hamburger-inner"></span> <strong>Menu</strong> </span> </span>
加上:
is-active后
显示就对了:

-》
说明:此处css配置都没问题,就是js中缺少了对应的逻辑
而此处点击菜单,有改动的地方,除了is-active还有一个opacity:


所以,就去找正常网页中,哪里的js去控制了此处的:
#avia-menu > li > a > span
对应的:
av-hamburger av-hamburger--spin av-js-hamburger av-inserted-main-menu
加上的:
is-active
但是搜到的内容,都不太像,唯一一个接近的是:

搜:
av-js-hamburger
wp-content/themes/enfold-child/js/avia.js

看来这部分js代码就是我们要的:
//toogle hide/show for submenu items
$('.html_av-submenu-display-hover').on( 'mouseenter touchstart', '.av-width-submenu', function (e)
{
$(this).children("ul.sub-menu").slideDown('fast');
});
$('.html_av-submenu-display-hover').on( 'mouseleave touchstart', '.av-width-submenu', function (e)
{
$(this).children("ul.sub-menu").slideUp('fast');
});
//toogle hide/show for submenu items
$('.html_av-submenu-display-click').on( 'click', '.av-width-submenu > a', function (e)
{
e.preventDefault();
e.stopImmediatePropagation();
var clicked = $(this), parent = clicked.parents('li').eq(0);
parent.toggleClass('av-show-submenu');
if(parent.is('.av-show-submenu'))
{
parent.children("ul.sub-menu").slideDown('fast');
}
else
{
parent.children("ul.sub-menu").slideUp('fast');
}
});
(function normalize_layout()
{
//if we got the menu outside of the main menu container we need to add it to the container as well
if(menu_in_logo_container.length) return;
var menu2 = $('#header .main_menu').clone();
menu2.find('.menu-item:not(.menu-item-avia-special)').remove();
menu2.insertAfter(logo_container.find('.logo'));
//check if we got social icons and append it to the secondary menu
var social = $('#header .social_bookmarks').clone();
if(!social.length) social = $('.av-logo-container .social_bookmarks').clone();
if( social.length )
{
menu2.find('.avia-menu').addClass('av_menu_icon_beside');
menu2.append(social);
}
//re select the burger menu if we added a new one
burger_wrap = $('.av-burger-menu-main a');
}());
burger_wrap.click(function(e)
{
if(animating) return;
burger = $(this).find('.av-hamburger'),
animating = true;
if(!menu_generated)
{
menu_generated = true;
burger.addClass("av-inserted-main-menu");
burger_ul = $('<ul>').attr({id:'av-burger-menu-ul', class:''})
var first_level_items = menu.find('> li:not(.menu-item-avia-special)'); //select all first level items that are not special items
var list = create_list( first_level_items , burger_ul);
burger_ul.find('.noMobile').remove(); //remove any menu items with the class noMobile so user can filter manually if he wants
burger_ul.appendTo(inner_overlay);
first_level = inner_overlay.find('#av-burger-menu-ul > li');
if($.fn.avia_smoothscroll){
$('a[href*="#"]', overlay).avia_smoothscroll(overlay);
}
}
if(burger.is(".is-active"))
{
burger.removeClass("is-active");
htmlEL.removeClass("av-burger-overlay-active-delayed");
overlay.animate({opacity:0}, function()
{
overlay.css({display:'none'});
htmlEL.removeClass("av-burger-overlay-active");
animating = false;
});
}
else
{
set_list_container_height();
var offsetTop = header_main.length ? header_main.outerHeight() + header_main.position().top : header.outerHeight() + header.position().top;
overlay.appendTo($(e.target).parents('.avia-menu'));
burger_ul.css({padding:( offsetTop ) + "px 0px"});
first_level.removeClass('av-active-burger-items');
burger.addClass("is-active");
htmlEL.addClass("av-burger-overlay-active");
overlay.css({display:'block'}).animate({opacity:1}, function()
{
animating = false;
});
setTimeout(function()
{
htmlEL.addClass("av-burger-overlay-active-delayed");
}, 100);
first_level.each(function(i)
{
var _self = $(this);
setTimeout(function()
{
_self.addClass('av-active-burger-items');
}, (i + 1) * 125)
});
}
e.preventDefault();
});
}就是点击后打开子菜单,去给is-active执行:
burger.addClass(“is-active”);
或:
burger.removeClass(“is-active”);
的地方。
那去搜现在网站中,是否有这部分代码:
结果是有的,且合并的后的js也有这部分代码:

但是为何没有生效呢,就怪了。
然后对比了目前的js和class的值,也都一样。
注意到:
点击此处菜单,也是更新了:

只是却了is-active
也有:

那再去找找:
av-burger-overlay
搜到太多了。算了。
还是继续研究:
av-inserted-main-menu
部分代码,为何此处没有完全生效。
对比一下,结果这部分没改动:

此处感觉是:
burger_wrap.click
的函数没有完全执行到
去研究看看为何
通过自己手动添加调试代码发现:

效果:
第一次,点击菜单,的确是进入了:
not active的代码段的
可以看到输出:

->
那就诡异了,代码都执行到了,但是没有生效
-》难道代码合并后,代码本身出问题了?变量无效了?
再去调试看看代码变量是否有问题
调试发现,源码中的:
wp-content/themes/enfold-child/js/avia.js
burger_wrap.click(function(e)

burger_wrap是undefined

这就不对了。
感觉像是,猜测是:
此处的代码:
;s=t('.av-burger-menu-main a')}());s.click(function(a){中的s,可能由于变量作用域的关系,被压缩后,变量名错了,被前面的s覆盖了。
即:此处的js代码的压缩,导致变量失效了
所以手动去改变量名试试
后来发现是自己搞错了,此处是有值的:

只不过在click函数时间内,s是空的
再去调试发现:
addClass是正常的,class的值是加上了is-active的:
after: burger class=av-hamburger av-hamburger--spin av-js-hamburger av-inserted-main-menu is-active

但是不知道为何html中却还是没有:

以及时jquery没生效呢
去查了下jquery,的确少了个:
<script type="text/javascript" src="https://farmedia.de/wp-content/themes/enfold/js/aviapopup/jquery.magnific-popup.min.js?ver=4.2.4"></script>

不过感觉应该不是重点
重点是:
js中已经加上了is-active了,但是为何html中还没显示
是后续代码又删除了is-active吗?
此处函数burger_wrap.click结束,都还是:
end of burger_wrap.click: burger class=av-hamburger av-hamburger--spin av-js-hamburger av-inserted-main-menu is-active
感觉像是:
jquery用addClass添加了 class,结果没有生效
jquery add class but not exist
jquery addclass not working
list – add class via jquery but only when not exists – Stack Overflow
jquery – Should I use “hasClass” before “addClass”? – Stack Overflow
jquery – Check if class already assigned before adding – Stack Overflow
html – jQuery.addClass not working – Stack Overflow
javascript – addclass not working jquery – Stack Overflow
javascript – jQuery addClass is not working now – Stack Overflow
css – JQuery addClass not working – Stack Overflow
jQuery addClass not working? – Stack Overflow
weird behavior – addClass not working in one of my functions? – jQuery Forum
测试代码去加上额外的class,结果是可以保留的:

那么说明:
估计是哪里把is-active去掉了
去找找是否有什么监听class值变化的机制
jquery addclass not show in html
jQuery addClass() does not appear to add the CSS class – Stack Overflow
感觉还是哪里把is-active去掉了
转载请注明:在路上 » 【已解决】确认是否是js没有正确运行导致手机端WordPress主题Enfold的主菜单显示异常