Я создаю инструмент и вам необходимо создать серию выпадающих меню, чтобы выбрать идентификатор профиля/вида (из аналитики 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 Вот код списка в действии.
var accounts = Php echo json_encode ($ accountsArray); ?>; Если вы не используете var accounts = JSON.parse (' Php echo json_encode ($ accountsArray);?>'); – AndreaBogazzi