2014-01-26 4 views
1

Я ранее размещал версию этого вопроса (JS - Constructor referencing) и выяснил ответ в пределах дубликатов, особенно Access/process (nested) objects, arrays or JSON. Отсюда у меня все еще есть нелепое время, чтобы это работало по назначению.JS - Название свойства Доступ

Учитывая следующий пример кода:

function f1(args) { 
     this.defaults = { 
      param1 : 100, 
      param2 : 900; 
     } 
     this.ranges = { 
      param1 : { min : 0, max : 500 }, 
      param2 : { min : 0, max : 1000 }; 
     } 
     this.steps = { 
      param1 : 50, 
      param2 : 100; 
     } 
    var myF1 = new f1(); 

Я прочитал на предыдущих дублей и изучение доступа неизвестных имен свойств по:

for (var propertyName in myF) { 
     newName = propertyName; 
    } 

Что мне нужно сделать, это перебирать функцию (или любую функцию) и построить входные данные диапазона HTML5 для функции (имейте в виду, что имена параметров будут сильно отличаться или случайны, поэтому я предполагаю, что мне нужно зациклиться на самом ключе. Так, в случае f1/myF1 , Сгенерированный HTML5 будет:

param1: <input type="range" name="param1" min="0" max="500" steps="50" /> 
    param2: <input type="range" name="param2" min="0" max="1000" steps="100" /> 

Примечание: Значения для диапазона =, = имя, мин =, макс = и шаг = все динамически генерируется из свойств функции.

Я пробовал цикл для ключей, призывая к ценностям и почти любым другим исследованиям и попыткам, которые я могу, но я всегда получаю переменные, переписывающие себя, и я предполагаю, что это только больше в глубине, чем этот любитель пловец может понять.

Кроме того, убедитесь, что каждый параметр будет иметь значения defaults, ranges и steps, поэтому мы не должны беспокоиться о том, что уровень рандомизации или вариации THAT. Спасибо SO-JS гуру!

+0

Если я не ошибаюсь, в основном вы хотите сгенерировать html (ввод), вызвав внутренний цикл 'f1()'. Конечно, разные значения на входе будут динамическими? –

+0

Я могу сгенерировать HTML и т. Д. Я просто не могу правильно получить имена параметров из 'defaultValues' и последующих для' диапазонов' и ​​'шагов'. Если я смогу ПОЛУЧИТЬ данные, я могу сделать с ним по мере необходимости для HTML5 и другого использования. Итак, чтобы ответить на ваш вопрос более или менее: да. – user3223880

ответ

1

Похоже, что вы предпочли бы перебрать свойства myF1.defaults, myF1.ranges или myF1.steps, а не над свойствами самого myF1 (потому что они фиксированы).

Я не знаю, что вы пробовали, но это, как вы могли бы создать DOM элементы, которые вы хотите:

var myF1 = new f1(); 
var elements = []; 

for (var param in myF1.ranges) { 
    var input = document.createElement('input'); 
    input.type = 'range'; 
    input.name = param; 
    input.min = myF1.ranges[param].min; 
    input.max = myF1.ranges[param].max; 
    input.step = myF1.steps[param]; 
    input.value = myF1.defaults[param]; 

    var span = document.createElement('span'); 
    span.appendChild(document.createTextNode(param + ': ')); 
    span.appendChild(input); 
    elements.push(span); 
} 

Просто итерацию по свойствам ranges и доступ к тому же свойству steps и defaults , Затем вы можете делать все, что хотите, с elements. DEMO

+0

+1 для быстроты и моей рукотворной работы по знанию Феликса. Выполнение этого метода с помощью 'var param' будет правильно получать имя defaultValue, скорее это' param1', 'param2' или' ksid83isozn', правильно? – user3223880

+0

Я не уверен, что вы подразумеваете под «получить имя defaultValue». 'param' будет иметь значения' param1' и 'param2', потому что это свойства в' myF1.ranges'. –

+0

Смысл, независимо от того, какое имя привязано к значению, находится внутри свойства, вот что вытащит? В этом случае имя было 'param1', поэтому, если это имя было чем-то другим (или это выполнено на аналогичной функции/объекте с совершенно разными именами), то оно будет работать одинаково? – user3223880

1

Прежде всего, в вашем примере есть две ошибки.

  1. открывающий кронштейн function f1(args) { не закрыт.
  2. точки с запятой последней записи в this.defaults и this.steps не должны быть там.

Следующий код (опираясь на jQuery$) создать две рабочие правильно входные элементы диапазона типа, хотя код сильно зависит от заданного формата данных. Один элемент ввода получает значение путем зацикливания myF1.steps свойств, и каждое имя проверено на defaults и ranges. Вспомогательная функция applyAttr безопасно обращается к значениям с помощью другого свойстваName или прямого значения.

Работа plunker

$(document).ready(function() { 

    function f1(args) { 
    this.defaults = { 
     param1 : 100, 
     param2 : 900 
    } 
    this.ranges = { 
     param1 : { min : 0, max : 500 }, 
     param2 : { min : 0, max : 1000 } 
    } 
    this.steps = { 
     param1 : 50, 
     param2 : 100 
    } 
    } 
    var myF1 = new f1(); 

    function applyAttr(inElem, data, propName) { 
    if(data.hasOwnProperty(propName)) 
     inElem.prop(propName, data[propName]); 
    else { 
     inElem.prop(propName, data); 
    } 
    } 

    for(var stepsProp in myF1.steps) { 
    var inputElem = $('<input type="range"/>'); 
    inputElem.prop('step', myF1.steps[stepsProp]); 
    if(myF1.defaults.hasOwnProperty(stepsProp)) { 
     inputElem.prop('value', myF1.defaults[stepsProp]); 
    } 
    if(myF1.ranges.hasOwnProperty(stepsProp)) { 
     applyAttr(inputElem, myF1.ranges[stepsProp], 'min'); 
     applyAttr(inputElem, myF1.ranges[stepsProp], 'max'); 
    } 
    $('body').append(inputElem); 
    } 
}); 
+0

Что такое '' 'в вашем коде? –

+0

Ах забыл упомянуть об использовании jQuery. указал на это. – angabriel

+0

+1 для полноты и краткости, но остается вопрос, как это сделать на родном пути без рамки (jQuery или иначе)? – user3223880

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