首页 > 解决方案 > 附加 DOM 会丢失菜单下拉功能

问题描述

我正在附加动态 DOM 元素(在 Ajax 调用以收集数据之后),如下所示。我已将代码范围缩小到我认为最重要的部分:

<!-- SideMenu HTML -->
<div id="sidebar-menu">
    <ul id="folders">
        <!-- AJAX DATA POPULATES MENU HERE -->

<!-- HTML File calling JS function -->
<script>
    $(document).ready(function() {
        getParentFolders('parentFolderTitle');
    });
</script>



// JS File function...
var parentFolders;  // Values retrieved from AJAX calls

function buildFolderMenu(index) {

    var markup = '<li class="has_sub">' +
                     '<a ... > parentFolders[index].Name + '</a>' +
                     '<ul ...>' +
                         '<li> SUB FOLDER TEST <li>' +
                     '</ul>' +
                 '</li>';

    $(#folders').append(markup);
}

编辑:我的代码正在与第 3 方模板交互,阅读回复后,我能够找到处理“点击事件”的文件。但是,根据上面显示的我自己的代码,我不确定如何调整模板代码以使用我的动态附加 DOM。

这是处理点击的模板代码:(我可以看到'menuItemClick'函数是可能处理的,但是我如何应用'.on('',function())'调整,基于如何文件被写入?)

/**
    * Theme: Adminto Admin Template
    * Author: Coderthemes
    * Module/App: Main Js
    */


    !function($) {
        "use strict";

        var Sidemenu = function() {
            this.$body = $("body"),
            this.$openLeftBtn = $(".open-left"),
            this.$menuItem = $("#sidebar-menu a")
        };
        Sidemenu.prototype.openLeftBar = function() {
          $("#wrapper").toggleClass("enlarged");
          $("#wrapper").addClass("forced");

          if($("#wrapper").hasClass("enlarged") && $("body").hasClass("fixed-left")) {
            $("body").removeClass("fixed-left").addClass("fixed-left-void");
          } else if(!$("#wrapper").hasClass("enlarged") && $("body").hasClass("fixed-left-void")) {
            $("body").removeClass("fixed-left-void").addClass("fixed-left");
          }

          if($("#wrapper").hasClass("enlarged")) {
            $(".left ul").removeAttr("style");
          } else {
            $(".subdrop").siblings("ul:first").show();
          }

          toggle_slimscroll(".slimscrollleft");
          $("body").trigger("resize");
        },
        //menu item click
        Sidemenu.prototype.menuItemClick = function(e) {
           if(!$("#wrapper").hasClass("enlarged")){
            if($(this).parent().hasClass("has_sub")) {

            }
            if(!$(this).hasClass("subdrop")) {
              // hide any open menus and remove all other classes
              $("ul",$(this).parents("ul:first")).slideUp(350);
              $("a",$(this).parents("ul:first")).removeClass("subdrop");
              $("#sidebar-menu .pull-right i").removeClass("md-remove").addClass("md-add");

              // open our new menu and add the open class
              $(this).next("ul").slideDown(350);
              $(this).addClass("subdrop");
              $(".pull-right i",$(this).parents(".has_sub:last")).removeClass("md-add").addClass("md-remove");
              $(".pull-right i",$(this).siblings("ul")).removeClass("md-remove").addClass("md-add");
            }else if($(this).hasClass("subdrop")) {
              $(this).removeClass("subdrop");
              $(this).next("ul").slideUp(350);
              $(".pull-right i",$(this).parent()).removeClass("md-remove").addClass("md-add");
            }
          }
        },

        //init sidemenu
        Sidemenu.prototype.init = function() {
          var $this  = this;

          var ua = navigator.userAgent,
            event = (ua.match(/iP/i)) ? "touchstart" : "click";

          //bind on click
          this.$openLeftBtn.on(event, function(e) {
            e.stopPropagation();
            $this.openLeftBar();
          });

          // LEFT SIDE MAIN NAVIGATION
          $this.$menuItem.on(event, $this.menuItemClick);

          // NAVIGATION HIGHLIGHT & OPEN PARENT
          $("#sidebar-menu ul li.has_sub a.active").parents("li:last").children("a:first").addClass("active").trigger("click");
        },

        //init Sidemenu
        $.Sidemenu = new Sidemenu, $.Sidemenu.Constructor = Sidemenu

    }(window.jQuery),


    function($) {
        "use strict";

        var FullScreen = function() {
            this.$body = $("body"),
            this.$fullscreenBtn = $("#btn-fullscreen")
        };

        //turn on full screen
        // Thanks to http://davidwalsh.name/fullscreen
        FullScreen.prototype.launchFullscreen  = function(element) {
          if(element.requestFullscreen) {
            element.requestFullscreen();
          } else if(element.mozRequestFullScreen) {
            element.mozRequestFullScreen();
          } else if(element.webkitRequestFullscreen) {
            element.webkitRequestFullscreen();
          } else if(element.msRequestFullscreen) {
            element.msRequestFullscreen();
          }
        },
        FullScreen.prototype.exitFullscreen = function() {
          if(document.exitFullscreen) {
            document.exitFullscreen();
          } else if(document.mozCancelFullScreen) {
            document.mozCancelFullScreen();
          } else if(document.webkitExitFullscreen) {
            document.webkitExitFullscreen();
          }
        },
        //toggle screen
        FullScreen.prototype.toggle_fullscreen  = function() {
          var $this = this;
          var fullscreenEnabled = document.fullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled;
          if(fullscreenEnabled) {
            if(!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement) {
              $this.launchFullscreen(document.documentElement);
            } else{
              $this.exitFullscreen();
            }
          }
        },
        //init sidemenu
        FullScreen.prototype.init = function() {
          var $this  = this;
          //bind
          $this.$fullscreenBtn.on('click', function() {
            $this.toggle_fullscreen();
          });
        },
         //init FullScreen
        $.FullScreen = new FullScreen, $.FullScreen.Constructor = FullScreen

    }(window.jQuery),



    //main app module
     function($) {
        "use strict";

        var App = function() {
            this.VERSION = "1.5.0",
            this.AUTHOR = "Coderthemes",
            this.SUPPORT = "coderthemes@gmail.com",
            this.pageScrollElement = "html, body",
            this.$body = $("body")
        };

         //on doc load
        App.prototype.onDocReady = function(e) {
          FastClick.attach(document.body);
          resizefunc.push("initscrolls");
          resizefunc.push("changeptype");

          $('.animate-number').each(function(){
            $(this).animateNumbers($(this).attr("data-value"), true, parseInt($(this).attr("data-duration")));
          });

          //RUN RESIZE ITEMS
          $(window).resize(debounce(resizeitems,100));
          $("body").trigger("resize");

          // right side-bar toggle
          $('.right-bar-toggle').on('click', function(e){

              $('#wrapper').toggleClass('right-bar-enabled');
          });


        },
        //initilizing
        App.prototype.init = function() {
            var $this = this;
            //document load initialization
            $(document).ready($this.onDocReady);
            //init side bar - left
            $.Sidemenu.init();
            //init fullscreen
            $.FullScreen.init();
        },

        $.App = new App, $.App.Constructor = App

    }(window.jQuery),

    //initializing main application module
    function($) {
        "use strict";
        $.App.init();
    }(window.jQuery);



    /* ------------ some utility functions ----------------------- */
    //this full screen
    var toggle_fullscreen = function () {

    }

    function executeFunctionByName(functionName, context /*, args */) {
      var args = [].slice.call(arguments).splice(2);
      var namespaces = functionName.split(".");
      var func = namespaces.pop();
      for(var i = 0; i < namespaces.length; i++) {
        context = context[namespaces[i]];
      }
      return context[func].apply(this, args);
    }
    var w,h,dw,dh;
    var changeptype = function(){
        w = $(window).width();
        h = $(window).height();
        dw = $(document).width();
        dh = $(document).height();

        if(jQuery.browser.mobile === true){
            $("body").addClass("mobile").removeClass("fixed-left");
        }

        if(!$("#wrapper").hasClass("forced")){
          if(w > 990){
            $("body").removeClass("smallscreen").addClass("widescreen");
              $("#wrapper").removeClass("enlarged");
          }else{
            $("body").removeClass("widescreen").addClass("smallscreen");
            $("#wrapper").addClass("enlarged");
            $(".left ul").removeAttr("style");
          }
          if($("#wrapper").hasClass("enlarged") && $("body").hasClass("fixed-left")){
            $("body").removeClass("fixed-left").addClass("fixed-left-void");
          }else if(!$("#wrapper").hasClass("enlarged") && $("body").hasClass("fixed-left-void")){
            $("body").removeClass("fixed-left-void").addClass("fixed-left");
          }

      }
      toggle_slimscroll(".slimscrollleft");
    }


    var debounce = function(func, wait, immediate) {
      var timeout, result;
      return function() {
        var context = this, args = arguments;
        var later = function() {
          timeout = null;
          if (!immediate) result = func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) result = func.apply(context, args);
        return result;
      };
    }

    function resizeitems(){
      if($.isArray(resizefunc)){
        for (i = 0; i < resizefunc.length; i++) {
            window[resizefunc[i]]();
        }
      }
    }

    function initscrolls(){
        if(jQuery.browser.mobile !== true){
          //SLIM SCROLL
          $('.slimscroller').slimscroll({
            height: 'auto',
            size: "7px"
          });

          $('.slimscrollleft').slimScroll({
              height: 'auto',
              position: 'right',
              size: "7px",
              color: '#828e94',
              wheelStep: 5
          });
      }
    }
    function toggle_slimscroll(item){
        if($("#wrapper").hasClass("enlarged")){
          $(item).css("overflow","inherit").parent().css("overflow","inherit");
          $(item). siblings(".slimScrollBar").css("visibility","hidden");
        }else{
          $(item).css("overflow","hidden").parent().css("overflow","hidden");
          $(item). siblings(".slimScrollBar").css("visibility","visible");
        }
    }

    // === following js will activate the menu in left side bar based on url ====
    $(document).ready(function() {
        $("#sidebar-menu a").each(function() {
          var pageUrl = window.location.href.split(/[?#]/)[0];
          if (this.href == pageUrl) { 
                $(this).addClass("active");
                $(this).parent().addClass("active"); // add active to li of the current link
                $(this).parent().parent().prev().addClass("active"); // add active class to an anchor
                $(this).parent().parent().prev().click(); // click the item to make it drop
            }
        });
    });


    var resizefunc = [];

标签: javascriptjqueryhtmldrop-down-menu

解决方案


这可能是因为在您的 DOM 操作之后重绘事件未在浏览器上隐式触发。请参阅这篇文章,了解如何重绘以便在 UI 上刷新生成的 DOM

在 Chrome/Mac 上强制 DOM 重绘/刷新

如果这不起作用,请分享您的 CSS 以及 DOM 生成前和 DOM 生成后的屏幕截图


推荐阅读