2015-02-20 3 views
-1

Я принимаю онлайн-курс javascript через Oreilly School Of Technology. Я закончил каждый урок, за исключением последнего. Мой инструктор требует времени, чтобы вернуться ко мне с вопросами, поэтому я решил, что обратясь к вам за помощью. Я не хочу, чтобы вы рассказывали мне о решении, а скорее помогали понять, что мне нужно делать.JavaScript Объекты, конструкторы, точечные обозначения

Вот мой пример,

window.onload = init; 
 

 
var counter = 0; 
 

 
function init() { 
 
\t var generateButton = document.getElementById("generateButton"); 
 
\t var clearButton = document.getElementById("clearButton"); 
 
\t var scene = document.getElementById("scene"); 
 

 
\t generateButton.onclick = generate; 
 
\t //clearButton.onclick = clear; 
 
} 
 

 
function Box(boxID, name, color, xPos, yPos) { 
 
\t this.boxID = boxID; 
 
\t this.name = name; 
 
\t this.color = color; 
 
\t this.xPos = xPos; 
 
\t this.yPos = yPos; 
 
} 
 

 
function generate() { 
 
\t var boxes = []; 
 
    
 
\t var colorSelect = document.getElementById("color"); 
 
\t var colorSelectOption = colorSelect.options[colorSelect.selectedIndex]; 
 
\t var colorSelectVal = colorSelectOption.value; 
 

 
\t var boxesToGen = data.elements.amount; 
 
    for (var i = 0; i < boxesToGen.length; i++) { 
 
    if(boxesToGen[i].checked) { 
 
    \t var boxesToGenVal = boxesToGen[i].value; 
 

 
    \t for (var i = 0; i < boxesToGenVal; i++) { 
 

 
\t \t \t \t var div = document.createElement("div"); 
 

 
\t \t \t \t var divClass = div.setAttribute("class", "box"); 
 
\t \t \t \t divClass = div.setAttribute("id", counter); 
 

 
\t \t \t \t var addDivs = scene.appendChild(div); 
 

 
\t \t \t \t 
 

 
\t \t \t \t var name = document.getElementById("name"); 
 
\t \t \t \t var boxName = name.value; 
 

 
\t \t \t \t div.innerHTML = boxName; 
 

 
\t \t \t \t counter++; 
 

 
\t \t \t \t newBox = new Box(counter, boxName, colorSelectVal, x, y); 
 

 
\t \t \t \t var x = Math.floor(Math.random() * (scene.offsetWidth-101)); 
 
\t \t \t \t var y = Math.floor(Math.random() * (scene.offsetHeight-101)); 
 

 
\t \t \t \t div.style.backgroundColor = colorSelectVal; 
 

 
\t \t \t \t div.style.left = x + "px"; 
 
\t \t \t \t div.style.top = y + "px"; 
 

 
\t \t \t \t boxes.push(newBox); 
 

 
\t \t \t \t newBox.boxID = counter; 
 

 
\t \t \t \t console.log(boxes); 
 
\t \t \t \t 
 

 
\t \t \t \t div.onclick = display; 
 

 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t } 
 
\t \t function display(e) { 
 
\t \t \t div = e.target; 
 
\t \t \t alert("boxID = " + newBox.boxID + " name = " + newBox.name + " color = " + newBox.color + " xPos = " + newBox.xPos + " yPos = " + newBox.yPos); 
 
\t \t \t console.log(getId); 
 
\t } 
 
}
html, body { 
 
    width: 100%; 
 
    height: 90%; 
 
    margin: 0px; 
 
    padding: 0px; 
 
    font-family: Helvetica, Arial, sans-serif; 
 
} 
 
       
 
input#generateButton { 
 
    margin-left: 15px; 
 
} 
 
       
 
div#status { 
 
    margin-left: 15px; 
 
} 
 
       
 
div#scene { 
 
    position: relative; 
 
    width: 100%; 
 
    height: 80%; 
 
    margin: 0px; 
 
    padding: 0px; 
 
} 
 
       
 
div.box { 
 
    position: absolute; 
 
    width: 100px; 
 
    height: 90px; 
 
    padding-top: 10px; 
 
    text-align: center; 
 
    overflow: hidden; 
 
}
<!doctype html> 
 
<html lang="en"> 
 
<head> 
 
    <title> Final Project: Amazing Boxes </title> 
 
    <meta charset="utf-8"> 
 
</head> 
 
<body> 
 
    <form id="data"> 
 
    <ol> 
 
     <li>Pick a name for your Amazing Box: <br> 
 
     <label for="name">Name: </label> 
 
      <input type="text" id="name" size="20"> 
 
     </li> 
 
     <li>Pick a color for your Amazing Box: <br> 
 
     <select id="color"> 
 
      <option value="red">Red</option> 
 
      <option value="orange">Orange</option> 
 
      <option value="yellow">Yellow</option> 
 
      <option value="green">Green</option> 
 
      <option value="blue">Blue</option> 
 
      <option value="indigo">Indigo</option> 
 
      <option value="violet">Violet</option> 
 
     </select> 
 
     </li> 
 
     <li>How many Amazing Boxes do you want to create?<br> 
 
     <input type="radio" id="five" name="amount" value="5"> 
 
      <label for="five">5</label><br> 
 
     <input type="radio" id="ten" name="amount" value="10"> 
 
      <label for="ten">10</label><br> 
 
     <input type="radio" id="fifteen" name="amount" value="15"> 
 
      <label for="fifteen">15</label><br> 
 
     </li> 
 
    </ol> 
 
    <p> 
 
     <input type="button" id="generateButton" value="Generate!"> 
 
     <input type="button" id="clearButton" value="Clear"> 
 
    </p> 
 
    </form> 
 
    <div id="scene"> 
 

 
    </div> 
 

 

 
</body> 
 
</html>

https://jsfiddle.net/f5670m68/2/

Вот направления урока. Я смущен, в частности, с одной стороны. Это связано с функцией display(). Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю на div и делаю newBox.boxID, результат равен 5 для каждого окна. Код, который сгенерирован, содержит div id = "1", div id = "2" и т. Д. Похоже, что он всегда использует последнее значение приращения.

Box(): создайте функцию-конструктор с именем Box, чтобы создать объекты коробки для каждого генерируемого окна. Объект Box будет содержать каждое свойство поля, включая его идентификатор, имя, цвет и позиции x и y. Обратите внимание, что идентификатор каждого окна должен быть уникальным, но имя отсутствует (у вас будет несколько ящиков с тем же именем).

коробки: массив всех ящиков. Все ящики должны быть представлены элементами и заданы класс «ящик» и уникальный идентификатор. (Обратите внимание, что вы можете просто использовать номер для идентификатора, если хотите!).

counter: глобальная переменная, которая отслеживает количество генерируемых ящиков, которые вы можете использовать для создания уникального идентификатора для каждого окна.

init(): обработчик нагрузки.

generate(): обработчик кликов для Generate! кнопка. Эта функция генерирует элементы, которые представляют поля.

clear(): обработчик кликов для Clear! кнопка. Эта функция удаляет все ящики со сцены и сбрасывает все, чтобы вы могли начать с нуля.

дисплей(): обработчик кликов для каждой коробки. Когда пользователь нажимает на поле, эта функция будет отображать предупреждение со всей информацией о поле, включая его идентификатор, имя, цвет и позицию.

+1

На самом деле, я не могу воспроизвести это. Когда я нажимаю на каждое поле, ожидаемый идентификатор отображается как часть 'alert (...)' (это не всегда '5'). – JCOC611

+1

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

+0

Вы должны получить предупреждение, когда вы нажимаете на каждый div. Попробуйте снова. Теперь идентификаторы должны быть одинаковыми. У меня был какой-то взломанный код, заставляющий div id быть другим. –

ответ

0

newBox (который вы еще не указали в своем коде BTW) - это переменная, которую вы постоянно переписываете в своем цикле. Он будет содержать последнее значение, которое вы ему назначили, поэтому, если вы создадите 5 ящиков, а затем нажмите один, то newBox, доступ к которому вы можете получить в своей функции display(), будет последним, который вы создали (с идентификатором 5).

Похоже, что вы хотите получить объект box, который соответствует щелчку. Идентификаторы вы назначаете ваши коробчатых элементов на самом деле 0, 1, 2, 3, ..., так что вы можете получить их из массива на основе их ID (внутри функции display():

var clickedBox = boxes[getId]; 

Вы должны также увеличивайте counter на конец вашей петли, а не посередине. То, как у вас было это, вы давали свою коробку DIV с разными идентификаторами из объектов коробки.

И вуаля, эта часть вашей программы должна работать.

https://jsfiddle.net/f5670m68/5/

(Был также вопрос с вами, используя ваши x и y переменных, прежде чем вы дали им значения. Я установил это тоже.)

+0

Почему «ящики» должны быть объектами? Что не так с массивом объектов? – zgood

+0

@zgood Хорошо, поскольку идентификаторы OP начинаются с 1, это не все, что хорошо подходит для массива (хотя это будет работать), но что более важно, объект позволяет OP легко переключаться на нечисловые идентификаторы (например, 'box1' , 'box2', что, я думаю, было бы целесообразной идеей), но это было бы сложнее с массивом. – JLRishe

+0

имеет смысл. Что просто любопытно из ваших рассуждений :) Он также может использовать 'data-id' в качестве атрибута и хранить там счетчик и напомнить его – zgood

0

Я не мог воспроизвести вашу ошибку (все идентификаторы были верны, когда я нажимаю на divs)

Что я думаю вам нужно сделать, хотя объявить ваш var boxes = []; в глобальной области (вне функции, в которой он сейчас находится), то в вашей функции display сделать что-то вроде это:

var newBox = boxes[getId];

Это работает только потому, что вы настраиваете ваши Див идентификаторы для вашего counter стоимости вашего цикла. (вы действительно не должны устанавливать число только иды - это недействительно, я считаю)

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