Javascript - как дать переменным имена в цикле, такие как var_1, var_2 и т. Д. - PullRequest
0 голосов
/ 31 августа 2010

Я играю с Google Maps API V3.

Я хочу создать серию маркеров на карте.

Я прошел учебное пособие и получил:

Теперь этот код добавляет один маркер - первый.

Я совершенно новичок в Javascript, но, исходя из моих знаний PHP, я думаю, что причина этого не в том, что все маркеры хранятся впеременная с именем 'm'.

IE номер 2 заменяет номер 1

Однако я путаюсь с тем, что в этом случае маркер 2 будет отображаться не как маркер 1.

Может ли кто-нибудь постулировать возможное объяснение / исправить?

Спасибо

Отредактированный код ниже:

function initialize(){
// Creating a map
var map = new google.maps.Map(document.getElementById('map'), {
  zoom: 10,
  center: new google.maps.LatLng(53.0123601276819, -2.44519164333635),
  mapTypeId: google.maps.MapTypeId.ROADMAP
});


var m = [];

function addMarker(title, lat, lng) {
m = new google.maps.Marker({
position: new google.maps.LatLng(lat, lng),
map: map,
title: title,  
clickable: true 
});


}



addMarker('Home', 53.0682143712504, -2.52150736731894);
addMarker('Away', 53.0123601276819, -2.44519164333635);



}

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

Я подозреваю, что проблема в том, что вы пытаетесь обработать объект"m", как если бы это был массив . Объявите это так:

var m = [];

и посмотри, что получится. На простых объектах нет функции «push», поэтому после добавления вашего первого маркера строка вызывает исключение.

Консоль ошибок Javascript, как бы она ни отображалась в используемом вами браузере, должна всегда быть открытой, пока вы пытаетесь создать новый код. Ну, может быть, не всегда , но, конечно, в ту минуту, когда происходит что-то странное.

изменить & mdash; Вызов функции .push() в вашем коде в порядке; проблема заключалась в том, что вы пытались вызвать его из чего-то, что не было массивом. Все, что делает функция, это расширяет массив заданным элементом. Массивы Javascript несколько странны, и основная магия связана с тем, как среда выполнения поддерживает значение атрибута "length". Вы можете более непосредственно расширить массив следующим образом:

arr[arr.length] = newValue;

Вы также можете просто использовать некоторый числовой индекс, вычисленный некоторым образом:

arr[pick_a_number()] = newValue;

Когда вы это делаете, среда выполнения проверяет, правильно ли обновлен атрибут "length", если число, используемое в качестве индекса, будет больше текущего значения.

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

m = google.whatever( ... );

вы больше не добавляете эти точки в массив - вы переназначаете переменную "m" на одну из точек, снова и снова. Измените его на «push» и & mdash; если вы также измените объявление "m", как я предложил & mdash; он все равно будет работать, и ваш массив будет заполнен правильно.

0 голосов
/ 31 августа 2010

Переменная m находится в области инициализации, как и функция addMarker.

Каждый раз, когда вы устанавливаете m (который сначала является массивом) для объекта Marker, вы сохраняете ссылку на вновь созданный объект маркера.,Это может быть проблемой, как вы упомянули.

Вместо установки m для объекта Marker, используйте push (метод для добавления объекта в массив), как показано ниже:

m.push(new google.maps.Marker({
  position: new google.maps.LatLng(lat, lng),
  map: map,
  title: title,  
  clickable: true 
});). 
0 голосов
/ 31 августа 2010

m относится к функции, в которой он находится, так что это не проблема. Я предполагаю, что вы получаете сообщение об ошибке marker.push(m). marker является объектом и не имеет метода push. Сделайте это массивом (var marker = []). Так как он прерывает эту строку, он никогда не сможет выполнить второй вызов функции. Но он уже добавил маркер на экран, поэтому вы его видите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...