запустить функцию после сгенерированного элемента jquery - PullRequest
0 голосов
/ 10 июля 2019

У меня есть функция, написанная в одном файле js с отсрочкой и обещанием. После этого я вызываю эту функцию в другом HTML-файле, где я создаю меню, эта страница будет работать как веб-часть. Поэтому я хочу запустить функцию после генерации этого меню, как я могу это сделать.

Ph.DAL = function() {
  this.getRequest = function(listName, select, filter, orderby, top, _async) {
    var dfd = $.Deferred()
    var request = baseRequest
    request.type = 'GET'
    request.async = _async
    request.url =
      siteAbsoluteUrl +
      "/_api/web/lists/getbytitle('" +
      listName +
      "')/items?" +
      (this.isNullOrEmpty(select) ? '' : '$select=' + select) +
      '&' +
      (this.isNullOrEmpty(filter) ? '' : '$filter=' + filter) +
      '&' +
      (this.isNullOrEmpty(orderby) ? '' : '$orderby=' + orderby) +
      '&' +
      (this.isNullOrEmpty(top) ? '' : '$top=' + top)
    request.headers = { ACCEPT: 'application/json;odata=verbose' }
    dfd = $.ajax(request)
    return dfd.promise()
  }

Который я звоню с другой HTML-страницы для создания динамического меню

$(document).ready(function() {
    var utility = new Ph.DAL()
    var menuHTML = ''
    utility
      .getRequest(
        'Navigation',
        'Id,Title,Icon,URL,Target,ParentId,OrderBy',
        "Active eq 'Yes'",
        '',
        '',
        true
      )
      .done(function(data) {
        if (data && data.d && data.d.results && data.d.results.length > 0) {
          createMenu(data.d.results, null)
        }
        $('#respMenu').html(menuHTML)
        $('#respMenu').aceResponsiveMenu({
          resizeWidth: '768', // Set the same in Media query
          animationSpeed: 'fast', //slow, medium, fast
          accoridonExpAll: false, //Expands all the accordion menu on click
        })
      })
    function createMenu(jSON, parentId) {
      var _menu
      _menu = Enumerable.from(jSON)
        .where(function(value) {
          return value.ParentId == parentId
        })
        .orderBy(function(value) {
          return value.OrderBy
        })
        .toArray()
      if (_menu.length > 0) {
        _menu.map(function(item, i) {
          menuHTML +=
            '<li class="' +
            (item.URL.toLowerCase() == utility.pageName.toLowerCase() ? 'active' : '') +
            '"><a href="' +
            item.URL +
            '">'
          menuHTML +=
            '<i class="' +
            item.Icon +
            '"></i><span class="title">' +
            item.Title +
            '</span></a>'
          var subMenu = Enumerable.from(jSON)
            .where(function(value) {
              return value.ParentId == item.Id
            })
            .orderBy(function(value) {
              return value.OrderBy
            })
            .toArray()
          if (subMenu.length > 0) {
            createSubMenu(jSON, subMenu)
          }
          menuHTML += '</li>'
        })
      }
    }
    function createSubMenu(mainData, data) {
      menuHTML += '<ul>'
      data.map(function(item, i) {
        menuHTML += '<li><a href="' + item.URL + '">' + item.Title + '</a>'
        var subMenu = Enumerable.from(mainData)
          .where(function(value) {
            return value.ParentId == item.Id
          })
          .orderBy(function(value) {
            return value.OrderBy
          })
          .toArray()
        if (subMenu.length > 0) {
          createSubMenu(mainData, subMenu)
        }
      })
      menuHTML += '</li></ul>'
    }
  })

Сейчас я пытаюсь зациклить li и хочу добавить активный класс для определенного класса, но сгенерированное меню и вызов функции ранее, поэтому он не работает. Как я могу это сделать.

Запустить эту функцию после создания меню

 $.menuActive = function (menuItem) {
      $('#respMenu li').each(function() {
        if ($(this).text() == menuItem) {
          $(this).addClass('active')
          return false
        }
      })
    }

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Вы должны попробовать использовать MutationObserver API

var mutationObserver = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    // Do something here

  });
});

mutationObserver.observe(myRefElement, {attributes: true})
0 голосов
/ 10 июля 2019
//You can use custom events
//Do this after  $('#respMenu').html(menuHTML)
$( "#respMenu" ).trigger( "list_ready" );

//In another file
$( "#respMenu" ).on( "list_ready", function () {
//Do ur stuff here
});
...