1

Hello i have really large function in Jquery, which gives me an error in Microsoft Edge browser, but in some older version. It is working as expected in other browsers. I think that older edge versions are using less memory, that is why this error do exists. So i have this line of code.

setupElements($('body'));

And this really large function it has 2000 - 3000 lines with bunch of find().

function setupElements(sel) {
  var numOfAddedRows = 0;
  sel
    .find('.fileupload').each(configureFileUploader).end()
    .find('select.selectmenu').each(handleSelectMenu).end()
    .find('.progress.progress-striped').each(function () {
                                 $(this).css('width',$(this).data('percentComplete'));
                               })
    .end()
    .find('#assignbibs-skip_options-overwrite').click(function(){
          if($(this).val() == "overwrite"){
              $("#assign-bibs-event-form").addClass("confirm-overwrite-complete");
          }
    }).end()
    .find('div[type="javascript"]').each(function(index, element){
      var script = $(this).html();
      eval(script);
      $(this).remove();
    }).end()
    .find('.toggleResultsTable').click(function(event){
      $('#progressForm').toggleClass('show-results');
      event.preventDefault();
    }).end()
    .find('.useEndDate').click(useEndDate)
    .end()
    .find('.useEndDate').each(useEndDate)
    .end()
    .find('#uploadCourseMap').on('click', function() {
      handlePopup(this);
    }).end()
    .find('input.filterType').on('change', function() {
      displayBasedOnFilterType($(this).val());
    })
    .end()
    .find('#useEndDate').on('click', useDateFilter)
    .end()
    .find('#event-wants_photo_purchasing').on('click', updatePhotosSection)
    .end()
    .find('#event-wants_photo_purchasing').each(function() {
      updatePhotosSection();
    })
    .end()
    .find('input.filterType:checked').each(function() {
      displayBasedOnFilterType($(this).val())
    })
    .end()
    .find('#create-email_list-date-allAvalible-all').each(function() {
      if ($(this).attr('checked')) {
        $("#fr-create-email_list-date-dateRange").hide();
      }
    })
    .end()
    .find('#create-email_list-date-allAvalible-all').live('change',function() {
      if ($(this).attr("checked")) {
        $("#fr-create-email_list-date-dateRange").hide();
      }
      else {
        $("#fr-create-email_list-date-dateRange").show();
      }
    }).end()
    .find('.payment_structure').on("click",function(){
      var val = $("input[name='regchoice[advanced_payment_structure]']:checked").val();
      var participantsChoice = $("label[for='regchoice-pricing_change_type-PARTICIPANTS'],#regchoice-pricing_change_type-PARTICIPANTS");
      if ($.inArray(val, ['CAPTAIN_PAYS_AFTER', 'CAPTAIN_CHOOSE']) !==-1) {
        participantsChoice.addClass('hide');
        $('#regchoice-pricing_change_type-DATE').click();
      }
      else {
        participantsChoice.removeClass('hide').show();
      }
    }).end()
    .find('.modal').on("show", function(){
      $('body').css({overflow: 'hidden'});
    }).on('hidden', function(){
      $('body').css({overflow: ''});
    }).end()
    .find('#fr-exportType').on('click', 'input[name="exportType"]', function() {
      $('#fr-raceID,#fr-entry-status,#fr-lastID').toggle($(this).val() === "0");
      $('#fr-importHistoryFile, #fr-preamble').toggle($(this).val() === "1");
    }).end().find('#edit-bracket-rule-form, #create-bracket-rule-form').each(function(e) {
      var primaryBracket = $('.br-policy.btn-success').last().val();
      setPrimaryBracketKinect(primaryBracket);
    }).end()
    .find('#edit-bracket-rule-form .custom-bracket-rule, #create-bracket-rule-form .custom-bracket-rule').on('click',function(){
      $('.custom-bracket-rule').removeClass('selected');
      $(this).addClass('selected');
      $("#policy-custom-bracket").html($(this).text());
      $("#prefered_bracket").val($(this).data('value'));
    }).end()
    .find('.prevent-default').on('click', function(e){
      e.preventDefault();
    }).end()
    .find('#addAnotherRestriction').on('click', function(){
      var tr          = $('.tableRestrictions').find('tbody > tr:last-child');
      var trSelect    = $('.tableRestrictions').find('tbody > tr:last-child td:first-child select');
      var selectClone = $(trSelect).clone(false);
      $(selectClone).removeClass('chzn-done').show();
      var trClone     = $(tr).clone();
      var cloneClass  = $(trClone).attr('class');
      var cloneNumber = cloneClass.split('-');
      cloneNumber[1] = $.trim(cloneNumber[1]);
      var cloneNumberLine = parseInt(cloneNumber[1]) + 1;
      $(trClone).attr('class', 'line-' + cloneNumberLine);
      $('.tableRestrictions').find('tbody').append(trClone);
      var inputNumber = parseInt(cloneNumber[1])-1;
      var elements = new Array('sex', 'min_members', 'max_members', 'min_age', 'max_age');
      for(var i in elements) {
        $('table.tableRestrictions tr.line-' + cloneNumberLine + ' dt').attr('id', 'team_bracket-restrictions-'+cloneNumber[1]+'-'+elements[i]+'-label');
        $('table.tableRestrictions tr.line-' + cloneNumberLine + ' dd').attr('id', 'team_bracket-restrictions-'+cloneNumber[1]+'-'+elements[i]+'-element');
        $('table.tableRestrictions tr.line-' + cloneNumberLine + ' #team_bracket-restrictions-'+inputNumber+'-'+elements[i]).attr('name', 'team_bracket[restrictions]['+cloneNumber[1]+']['+elements[i]+']');
        $('table.tableRestrictions tr.line-' + cloneNumberLine + ' #team_bracket-restrictions-'+inputNumber+'-'+elements[i]).attr('id', 'team_bracket-restrictions-'+cloneNumber[1]+'-'+elements[i]);
        $('table.tableRestrictions tr.line-' + cloneNumberLine + ' #team_bracket-restrictions-'+cloneNumber[1]+'-'+elements[i]).val('').trigger('change');
      }
      $('table.tableRestrictions tr.line-' + cloneNumberLine + ' td:first-child').html('<dt>&nbsp</dt><dd></dd>');
      $('table.tableRestrictions tr.line-' + cloneNumberLine + ' td:first-child').find('dd').html($(selectClone));
      $('table.tableRestrictions tr.line-' + cloneNumberLine + ' td:first-child select').addClass('teamRestrictionsInput').attr('id', 'team_bracket-restrictions-'+cloneNumber[1]+'-sex')
      .attr('name', 'team_bracket[restrictions]['+cloneNumber[1]+'][sex]').chosen({disable_search_threshold: 10});

      var remove = $('table.tableRestrictions tbody tr td:last-child').html('<a href="#" class="removeRestriction">Remove</a>');
      $('.selectRestriction').each(function(index, element){
        $(element).trigger('chosen:updated');
      });
      resizeModal();
    }).end()

etc...

Discovered if i remove two random find() methods error is gone. Any idea how to optimize this, since this is legacy code total refactoring is not possible, just trying to find some workaround.

Ambulance lada
  • 311
  • 1
  • 2
  • 14
  • If possible, break it up in multiple functions. – Grumpy Nov 19 '21 at 08:42
  • you think that it will help? – Ambulance lada Nov 19 '21 at 08:51
  • 1
    Multiple functions won't help, but removing all the `.end()` *possibly* will, eg `sel.find(..).each(..);` `sel.find(..).each(..);` `sel.find(..).click(..);` using `.end()` like that is just chaining for the sake of it and asking for problems with maintenance, especially with the confusing mix of when a newline is added. – freedomn-m Nov 19 '21 at 08:53
  • @Grumpy for some reason creating new function did it, do you know why? – Ambulance lada Nov 19 '21 at 10:13
  • @Ambulancelada https://stackoverflow.com/questions/6095530/maximum-call-stack-size-exceeded-error – Grumpy Nov 19 '21 at 11:45

0 Answers0