Magento 2 open navigation menu on click on desktop












0















By default on mouseenter event menu get open but I would like to change the event to click so for that I've override following file



lib/web/mage/menu.js


and made the following change for _toggleDesktopMode function but it's not working.



_toggleDesktopMode: function () {
var categoryParent, html;

this._on({
/**
* Prevent focus from sticking to links inside menu after clicking
* them (focus should always stay on UL during navigation).
*/
'mousedown .ui-menu-item > a': function (event) {
event.preventDefault();
},

/**
* Prevent focus from sticking to links inside menu after clicking
* them (focus should always stay on UL during navigation).
*/
'**click** .ui-state-disabled > a': function (event) {
event.preventDefault();
},

/**
* @param {jQuer.Event} event
*/
'click .ui-menu-item:has(a)': function (event) {
var target = $(event.target).closest('.ui-menu-item');

if (!this.mouseHandled && target.not('.ui-state-disabled').length) {
this.select(event);

// Only set the mouseHandled flag if the event will bubble, see #9469.
if (!event.isPropagationStopped()) {
this.mouseHandled = true;
}

// Open submenu on click
if (target.has('.ui-menu').length) {
this.expand(event);
} else if (!this.element.is(':focus') &&
$(this.document[0].activeElement).closest('.ui-menu').length
) {
// Redirect focus to the menu
this.element.trigger('focus', [true]);

// If the active item is on the top level, let it stay active.
// Otherwise, blur the active item since it is no longer visible.
if (this.active && this.active.parents('.ui-menu').length === 1) { //eslint-disable-line
clearTimeout(this.timer);
}
}
}
},
'click .ui-menu-item': function (event) {
var target = $(event.currentTarget),
submenu = this.options.menus,
ulElement,
ulElementWidth,
width,
targetPageX,
rightBound;

if (target.has(submenu)) {
ulElement = target.find(submenu);
ulElementWidth = ulElement.outerWidth(true);
width = target.outerWidth() * 2;
targetPageX = target.offset().left;
rightBound = $(window).width();

if (ulElementWidth + width + targetPageX > rightBound) {
ulElement.addClass('submenu-reverse');
}

if (targetPageX - ulElementWidth < 0) {
ulElement.removeClass('submenu-reverse');
}
}

// Remove ui-state-active class from siblings of the newly focused menu item
// to avoid a jump caused by adjacent elements both having a class with a border
target.siblings().children('.ui-state-active').removeClass('ui-state-active');
this.focus(event, target);
},

/**
* @param {jQuery.Event} event
*/
'mouseleave': function (event) {
this.collapseAll(event, true);
},

/**
* Mouse leave.
*/
'mouseleave .ui-menu': 'collapseAll'
});

categoryParent = this.element.find('.all-category');
html = $('html');

categoryParent.remove();

if (html.hasClass('nav-open')) {
html.removeClass('nav-open');
setTimeout(function () {
html.removeClass('nav-before-open');
}, 300);
}
}


Any suggestion what is wrong?










share|improve this question

























  • can anyone help?

    – Kaushal Suthar
    Aug 28 '18 at 13:02
















0















By default on mouseenter event menu get open but I would like to change the event to click so for that I've override following file



lib/web/mage/menu.js


and made the following change for _toggleDesktopMode function but it's not working.



_toggleDesktopMode: function () {
var categoryParent, html;

this._on({
/**
* Prevent focus from sticking to links inside menu after clicking
* them (focus should always stay on UL during navigation).
*/
'mousedown .ui-menu-item > a': function (event) {
event.preventDefault();
},

/**
* Prevent focus from sticking to links inside menu after clicking
* them (focus should always stay on UL during navigation).
*/
'**click** .ui-state-disabled > a': function (event) {
event.preventDefault();
},

/**
* @param {jQuer.Event} event
*/
'click .ui-menu-item:has(a)': function (event) {
var target = $(event.target).closest('.ui-menu-item');

if (!this.mouseHandled && target.not('.ui-state-disabled').length) {
this.select(event);

// Only set the mouseHandled flag if the event will bubble, see #9469.
if (!event.isPropagationStopped()) {
this.mouseHandled = true;
}

// Open submenu on click
if (target.has('.ui-menu').length) {
this.expand(event);
} else if (!this.element.is(':focus') &&
$(this.document[0].activeElement).closest('.ui-menu').length
) {
// Redirect focus to the menu
this.element.trigger('focus', [true]);

// If the active item is on the top level, let it stay active.
// Otherwise, blur the active item since it is no longer visible.
if (this.active && this.active.parents('.ui-menu').length === 1) { //eslint-disable-line
clearTimeout(this.timer);
}
}
}
},
'click .ui-menu-item': function (event) {
var target = $(event.currentTarget),
submenu = this.options.menus,
ulElement,
ulElementWidth,
width,
targetPageX,
rightBound;

if (target.has(submenu)) {
ulElement = target.find(submenu);
ulElementWidth = ulElement.outerWidth(true);
width = target.outerWidth() * 2;
targetPageX = target.offset().left;
rightBound = $(window).width();

if (ulElementWidth + width + targetPageX > rightBound) {
ulElement.addClass('submenu-reverse');
}

if (targetPageX - ulElementWidth < 0) {
ulElement.removeClass('submenu-reverse');
}
}

// Remove ui-state-active class from siblings of the newly focused menu item
// to avoid a jump caused by adjacent elements both having a class with a border
target.siblings().children('.ui-state-active').removeClass('ui-state-active');
this.focus(event, target);
},

/**
* @param {jQuery.Event} event
*/
'mouseleave': function (event) {
this.collapseAll(event, true);
},

/**
* Mouse leave.
*/
'mouseleave .ui-menu': 'collapseAll'
});

categoryParent = this.element.find('.all-category');
html = $('html');

categoryParent.remove();

if (html.hasClass('nav-open')) {
html.removeClass('nav-open');
setTimeout(function () {
html.removeClass('nav-before-open');
}, 300);
}
}


Any suggestion what is wrong?










share|improve this question

























  • can anyone help?

    – Kaushal Suthar
    Aug 28 '18 at 13:02














0












0








0








By default on mouseenter event menu get open but I would like to change the event to click so for that I've override following file



lib/web/mage/menu.js


and made the following change for _toggleDesktopMode function but it's not working.



_toggleDesktopMode: function () {
var categoryParent, html;

this._on({
/**
* Prevent focus from sticking to links inside menu after clicking
* them (focus should always stay on UL during navigation).
*/
'mousedown .ui-menu-item > a': function (event) {
event.preventDefault();
},

/**
* Prevent focus from sticking to links inside menu after clicking
* them (focus should always stay on UL during navigation).
*/
'**click** .ui-state-disabled > a': function (event) {
event.preventDefault();
},

/**
* @param {jQuer.Event} event
*/
'click .ui-menu-item:has(a)': function (event) {
var target = $(event.target).closest('.ui-menu-item');

if (!this.mouseHandled && target.not('.ui-state-disabled').length) {
this.select(event);

// Only set the mouseHandled flag if the event will bubble, see #9469.
if (!event.isPropagationStopped()) {
this.mouseHandled = true;
}

// Open submenu on click
if (target.has('.ui-menu').length) {
this.expand(event);
} else if (!this.element.is(':focus') &&
$(this.document[0].activeElement).closest('.ui-menu').length
) {
// Redirect focus to the menu
this.element.trigger('focus', [true]);

// If the active item is on the top level, let it stay active.
// Otherwise, blur the active item since it is no longer visible.
if (this.active && this.active.parents('.ui-menu').length === 1) { //eslint-disable-line
clearTimeout(this.timer);
}
}
}
},
'click .ui-menu-item': function (event) {
var target = $(event.currentTarget),
submenu = this.options.menus,
ulElement,
ulElementWidth,
width,
targetPageX,
rightBound;

if (target.has(submenu)) {
ulElement = target.find(submenu);
ulElementWidth = ulElement.outerWidth(true);
width = target.outerWidth() * 2;
targetPageX = target.offset().left;
rightBound = $(window).width();

if (ulElementWidth + width + targetPageX > rightBound) {
ulElement.addClass('submenu-reverse');
}

if (targetPageX - ulElementWidth < 0) {
ulElement.removeClass('submenu-reverse');
}
}

// Remove ui-state-active class from siblings of the newly focused menu item
// to avoid a jump caused by adjacent elements both having a class with a border
target.siblings().children('.ui-state-active').removeClass('ui-state-active');
this.focus(event, target);
},

/**
* @param {jQuery.Event} event
*/
'mouseleave': function (event) {
this.collapseAll(event, true);
},

/**
* Mouse leave.
*/
'mouseleave .ui-menu': 'collapseAll'
});

categoryParent = this.element.find('.all-category');
html = $('html');

categoryParent.remove();

if (html.hasClass('nav-open')) {
html.removeClass('nav-open');
setTimeout(function () {
html.removeClass('nav-before-open');
}, 300);
}
}


Any suggestion what is wrong?










share|improve this question
















By default on mouseenter event menu get open but I would like to change the event to click so for that I've override following file



lib/web/mage/menu.js


and made the following change for _toggleDesktopMode function but it's not working.



_toggleDesktopMode: function () {
var categoryParent, html;

this._on({
/**
* Prevent focus from sticking to links inside menu after clicking
* them (focus should always stay on UL during navigation).
*/
'mousedown .ui-menu-item > a': function (event) {
event.preventDefault();
},

/**
* Prevent focus from sticking to links inside menu after clicking
* them (focus should always stay on UL during navigation).
*/
'**click** .ui-state-disabled > a': function (event) {
event.preventDefault();
},

/**
* @param {jQuer.Event} event
*/
'click .ui-menu-item:has(a)': function (event) {
var target = $(event.target).closest('.ui-menu-item');

if (!this.mouseHandled && target.not('.ui-state-disabled').length) {
this.select(event);

// Only set the mouseHandled flag if the event will bubble, see #9469.
if (!event.isPropagationStopped()) {
this.mouseHandled = true;
}

// Open submenu on click
if (target.has('.ui-menu').length) {
this.expand(event);
} else if (!this.element.is(':focus') &&
$(this.document[0].activeElement).closest('.ui-menu').length
) {
// Redirect focus to the menu
this.element.trigger('focus', [true]);

// If the active item is on the top level, let it stay active.
// Otherwise, blur the active item since it is no longer visible.
if (this.active && this.active.parents('.ui-menu').length === 1) { //eslint-disable-line
clearTimeout(this.timer);
}
}
}
},
'click .ui-menu-item': function (event) {
var target = $(event.currentTarget),
submenu = this.options.menus,
ulElement,
ulElementWidth,
width,
targetPageX,
rightBound;

if (target.has(submenu)) {
ulElement = target.find(submenu);
ulElementWidth = ulElement.outerWidth(true);
width = target.outerWidth() * 2;
targetPageX = target.offset().left;
rightBound = $(window).width();

if (ulElementWidth + width + targetPageX > rightBound) {
ulElement.addClass('submenu-reverse');
}

if (targetPageX - ulElementWidth < 0) {
ulElement.removeClass('submenu-reverse');
}
}

// Remove ui-state-active class from siblings of the newly focused menu item
// to avoid a jump caused by adjacent elements both having a class with a border
target.siblings().children('.ui-state-active').removeClass('ui-state-active');
this.focus(event, target);
},

/**
* @param {jQuery.Event} event
*/
'mouseleave': function (event) {
this.collapseAll(event, true);
},

/**
* Mouse leave.
*/
'mouseleave .ui-menu': 'collapseAll'
});

categoryParent = this.element.find('.all-category');
html = $('html');

categoryParent.remove();

if (html.hasClass('nav-open')) {
html.removeClass('nav-open');
setTimeout(function () {
html.removeClass('nav-before-open');
}, 300);
}
}


Any suggestion what is wrong?







magento2 navigation






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jul 18 '18 at 6:55









nikin

758213




758213










asked Jul 18 '18 at 6:51









Kaushal SutharKaushal Suthar

1,64011231




1,64011231













  • can anyone help?

    – Kaushal Suthar
    Aug 28 '18 at 13:02



















  • can anyone help?

    – Kaushal Suthar
    Aug 28 '18 at 13:02

















can anyone help?

– Kaushal Suthar
Aug 28 '18 at 13:02





can anyone help?

– Kaushal Suthar
Aug 28 '18 at 13:02










1 Answer
1






active

oldest

votes


















0














No need to override




lib/web/mage/menu.js




Just go to




app/design/frontent/YourVendor/YourTheme/Magento_Theme/templates/html/topmenu.phtml




Inside ul data-mage-init add




"mediaBreakpoint": "(max-width: 1824px)"




Code should look like below



<ul data-mage-init='{"menu":{"responsive":true, "expanded":true,  "mediaBreakpoint": "(max-width: 1824px)", "position":{"my":"left top","at":"left bottom"}}}'>


By doing this menu.js will execute _toggleMobileMode() and in this mode, menu will open on click, not on hover.






share|improve this answer








New contributor




Mathew Lawrence is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




















    Your Answer








    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "479"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f234925%2fmagento-2-open-navigation-menu-on-click-on-desktop%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    No need to override




    lib/web/mage/menu.js




    Just go to




    app/design/frontent/YourVendor/YourTheme/Magento_Theme/templates/html/topmenu.phtml




    Inside ul data-mage-init add




    "mediaBreakpoint": "(max-width: 1824px)"




    Code should look like below



    <ul data-mage-init='{"menu":{"responsive":true, "expanded":true,  "mediaBreakpoint": "(max-width: 1824px)", "position":{"my":"left top","at":"left bottom"}}}'>


    By doing this menu.js will execute _toggleMobileMode() and in this mode, menu will open on click, not on hover.






    share|improve this answer








    New contributor




    Mathew Lawrence is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.

























      0














      No need to override




      lib/web/mage/menu.js




      Just go to




      app/design/frontent/YourVendor/YourTheme/Magento_Theme/templates/html/topmenu.phtml




      Inside ul data-mage-init add




      "mediaBreakpoint": "(max-width: 1824px)"




      Code should look like below



      <ul data-mage-init='{"menu":{"responsive":true, "expanded":true,  "mediaBreakpoint": "(max-width: 1824px)", "position":{"my":"left top","at":"left bottom"}}}'>


      By doing this menu.js will execute _toggleMobileMode() and in this mode, menu will open on click, not on hover.






      share|improve this answer








      New contributor




      Mathew Lawrence is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.























        0












        0








        0







        No need to override




        lib/web/mage/menu.js




        Just go to




        app/design/frontent/YourVendor/YourTheme/Magento_Theme/templates/html/topmenu.phtml




        Inside ul data-mage-init add




        "mediaBreakpoint": "(max-width: 1824px)"




        Code should look like below



        <ul data-mage-init='{"menu":{"responsive":true, "expanded":true,  "mediaBreakpoint": "(max-width: 1824px)", "position":{"my":"left top","at":"left bottom"}}}'>


        By doing this menu.js will execute _toggleMobileMode() and in this mode, menu will open on click, not on hover.






        share|improve this answer








        New contributor




        Mathew Lawrence is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.










        No need to override




        lib/web/mage/menu.js




        Just go to




        app/design/frontent/YourVendor/YourTheme/Magento_Theme/templates/html/topmenu.phtml




        Inside ul data-mage-init add




        "mediaBreakpoint": "(max-width: 1824px)"




        Code should look like below



        <ul data-mage-init='{"menu":{"responsive":true, "expanded":true,  "mediaBreakpoint": "(max-width: 1824px)", "position":{"my":"left top","at":"left bottom"}}}'>


        By doing this menu.js will execute _toggleMobileMode() and in this mode, menu will open on click, not on hover.







        share|improve this answer








        New contributor




        Mathew Lawrence is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.









        share|improve this answer



        share|improve this answer






        New contributor




        Mathew Lawrence is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.









        answered 14 mins ago









        Mathew LawrenceMathew Lawrence

        1




        1




        New contributor




        Mathew Lawrence is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.





        New contributor





        Mathew Lawrence is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.






        Mathew Lawrence is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
        Check out our Code of Conduct.






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Magento Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f234925%2fmagento-2-open-navigation-menu-on-click-on-desktop%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Polycentropodidae

            Magento 2 Error message: Invalid state change requested

            Paulmy