1

Я создаю инструмент и вам необходимо создать серию выпадающих меню, чтобы выбрать идентификатор профиля/вида (из аналитики Google), который заполняет следующее меню при изменении предыдущий (выбор правильных свойств для правильных учетных записей, а затем правильные профили для правильных свойств).Невозможно прочитать свойство «длина» неопределенного редко происходит

С этой целью я создал небольшую систему jquery/javascript for loop, которая, на мой взгляд, на самом деле довольно грязная, но я не уверен, как ее улучшить (не вопрос, хотя это может быть одной из причин У меня проблема, хотя я не уверен).

Этот скрипт работает во всех браузерах, которые я тестировал, включая мобильные устройства, которым я действительно был доволен.

Однако, когда инструмент был запущен, два человека (из примерно ста) вернулись, сказав, что профиль/вид не был выбран. Это было очень любопытно, так как я не мог воспроизвести эту ошибку.

Я был в контакте с одним из людей и пытался отлаживать (хотя и медленный процесс через длинные серии встреч и т. Д.), Но не смог найти исправления для него (хотя мне кажется, что мне удалось изолировать проблему , который будет указан после образца кода).

Так что мой вопрос в этом. Что может быть причиной этой длины неопределенной ошибки, и почему это происходит только для 1-2 человек из большой суммы из них (похоже, в jquery.min.js: 2 с использованием jquery версии 1.11.1?). Похоже, что ошибка возникает при изменении свойства, что странно, поскольку профили заполняются правильно. Также я спросил, может ли клиент использовать разные браузеры и учетные записи, но такая же ошибка продолжалась.

Вот код, который создает выпадающие:

function fillDropdownMenus(){ 

     var accounts = <?php echo json_encode($accountsArray); ?>; 

     var propertiesSelectHtml = '<div class="col-xs-12 col-md-4 properties"><select class="col-xs-12" id="properties"><option selected="selected">PROPERTY NAMES</option></select></div>'; 
     var profilesSelectHtml = '<div class="col-xs-12 col-md-4 profiles"><select class="col-xs-12" id="profiles"><option selected="selected">VIEW NAMES</option></select></div>'; 

     accounts.forEach(function(account){ 

      var accountIterator = 0; 
      account.account['id'].forEach(function(accountId){ 
       $('#accounts').append('<option value="'+accountId+'">'+account.account['name'][accountIterator]+'</option>'); 
       accountIterator++; 
      }); 

     }); 

     $('.accounts').on('change','#accounts', function(event){ 

      var currentAccount = $('#accounts').val(); 

      $('.properties').remove(); 

      $('.profiles').remove(); 

      $('.accounts').after(propertiesSelectHtml); 

      accounts.forEach(function(account){ 
       $.each(account.account, function(accountkey, accountvalue){ 
        if(accountvalue == currentAccount){ 
         var propertyIterator = 0; 

         account.account['property']['id'].forEach(function(propertyId){ 
          $('#properties').append('<option value="'+propertyId+'">'+account.account['property']['name'][propertyIterator]+'</option>'); 
          propertyIterator++; 
         }); 
        } 
       }); 
      }); 

      $('.properties').on('change','#properties', function(ev){ 

       var currentProperty = $('#properties').val(); 

       $('.profiles').remove(); 

       $('.properties').after(profilesSelectHtml); 

       accounts.forEach(function(account){ 
        $.each(account.account['property'], function(propertykey, propertyvalues){ 
         if($.type(propertyvalues) == 'object' || $.type(propertyvalues) == 'array'){ 
          for(var k in propertyvalues){ 
           var propertyvalue = propertyvalues[k]; 

           if(propertyvalue == currentProperty){ 
            var profileIterator = 0; 

            account.account['property']['profile']['id'].forEach(function(profileId){ 
             $('#profiles').append('<option value="'+profileId+'">'+account.account['property']['profile']['name'][profileIterator]+'</option>'); 
             profileIterator++; 
            }); 
           } 
          } 
         } else { 
          if(propertyvalue == currentProperty){ 
           var profileIterator = 0; 
           account.account['property']['profile']['id'].forEach(function(profileId){ 
            $('#profiles').append('<option value="'+profileId+'">'+account.account['property']['profile']['name'][profileIterator]+'</option>'); 
            profileIterator++; 
           }); 
          } 
         } 
        }); 
       }); 

       $('#profiles').on('change', function(e){ 

        $('#view_id').removeAttr('value'); 

        var currentProfile = $('#profiles').val(); 

        $('#view_id').val(currentProfile); 

       }); 

      }); 

     }); 

    } 

    fillDropdownMenus(); 

и структура объекта:

Object -> account (object) -> id (array) 
          -> name (array) 
          -> property (object) -> id (array) 
               -> name (array) 
               -> profile (object) -> id (array) 
                    -> name (array) 

Спасибо за ваш вклад в этом вопросе мой, как я трепку голову против стены в течение пары дней, пытаясь понять это!

EDIT: http://codepen.io/zephyr/pen/VYQPKQ Вот код списка в действии.

+0

var accounts = ; Если вы не используете var accounts = JSON.parse (''); – AndreaBogazzi

ответ

0

Это оказалось ошибкой в ​​том, что мой javascript был очень непоследовательным (так много разных циклов не помогло). После того, как я изменил их все на обычный. Jachery цикл, он, казалось, устранил проблему, и сделал весь набор меню намного лучше, так как были и некоторые логические ошибки (я не фильтровал профили по свойству, это было просто отображая их все для этой учетной записи, когда было выбрано свойство).

Смежные вопросы