Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   вопрос по jSon + Ajax (https://javascript.ru/forum/events/5321-vopros-po-json-ajax.html)

Beck 05.10.2009 14:46

Цитата:

Сообщение от x-yuri (Сообщение 31724)
если есть, на стороне php можно воспользоваться json_encode. А на стороне js: eval( '('+s+')' );

Есть, попробую. Спасибо. :)

Beck 05.10.2009 15:03

Цитата:

Сообщение от Kolyaj (Сообщение 31700)
Ну значит m.lat[i] не массив.

if(m['mcount'] > 0) {
		while(i < m['mcount']) {
			for(var i2=0;i2 < all_lat.length;i2++){
				console.log(m);
				if(m['lat'].length > 0) {
					if(m['lat'][i] == all_lat[i2]){
						m['lat'][i].splice(i,1);
						m['lng'][i].splice(i,1);
					}
				}
			}
			i++;
		}
	}


Object lat=[2] lng=[2] mcount=2


Lat:
["56.50097598931345", "56.49983904637648" 0=56.50097598931345 1=56.49983904637648]

Beck 05.10.2009 15:05

Что самое интересное, ошибка происходит, только на первом эвенте, а потом все повторы проходят без ошибок.

x-yuri 05.10.2009 15:26

Цитата:

Сообщение от Beck
Object lat=[2] lng=[2] mcount=2

ну так, m['lat'] - не массив, а тем более m['lat'][i]

Beck 05.10.2009 15:52

А как тогда правильно обратиться к данным?

Я не особо дружу с яваскриптом, так что с объектами еще не умею обращаться.

var m = {"lat": lat,"lng": lng,"mcount": data1[2]};

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

var m = [];
			m.push(lat);
			m.push(lng);
			m.push(data1[2]);


Так будет правильно?

*Вроде разобрался*
Только не понял, как обращаться к данным ассоциативного массива/объекта.

x-yuri 05.10.2009 16:27

Цитата:

Сообщение от x-yuri
ну так, m['lat'] - не массив, а тем более m['lat'][i]

или просто не видно, что он из себя представляет

Цитата:

Сообщение от Beck
Еще бы узнать, как ассоциативный массив создавать и как обращаться к его данным

var a = {a: 1, b: 2};
alert(a.a);

Beck 05.10.2009 17:23

Цитата:

Сообщение от x-yuri (Сообщение 31750)
или просто не видно, что он из себя представляет


var a = {a: 1, b: 2};
alert(a.a);

А в случае многомерного?

x-yuri 05.10.2009 18:06

try to guess ;)

Beck 05.10.2009 19:37

var allmakers = [];
var all_lat = [];
var all_lng = [];
var all_lat_length = 0;
var all_lng_length = 0;

function insert_marker(lat,lng){
	all_lat.push(lat);
	all_lng.push(lng);
	all_lat_length++;
	all_lng_length++;
	var mark = new GMarker(new GLatLng(lat,lng)); 
	allmakers.push(mark);
}

function process_markers(m) {
	console.log(allmakers);
	if(all_lat_length > 0) {
	var i = 0;
	var rounds = m[2];
	
	if(m[2] > 1) {
		while(i < rounds){
		var i2 = 0;
		while(i2 < all_lat_length) {
			if(m[0][i] == all_lat[i2]){m[0].splice(i,1);m[1].splice(i,1);m[2]--;}
			i2++;
			}
		i++;
		}
	}
	else {
		var i2 = 0;
		while(i2 < all_lat_length) {
			if(m[0] == all_lat[i2]){m[0] = '';m[1] = '';m[2]--;}
			i2++;
			}			
		}
	}	
	
		
	console.log(m[2]);	
	if(m[2] > 1) {	var i = 0;while(i < m[2]){insert_marker(m[0][i],m[1][i]);i++;}	}	
	if(m[2] == 1) {insert_marker(m[0],m[1]);}
	
	if(m[2] > 0) {mgr.addMarkers(allmakers,13);mgr.refresh();}
	
}	

function get_and_set(sw_lat,sw_lng,ne_lat,ne_lng){
	$.ajax({
		url: "c4.php",
		type: "POST",
		data: "swlat=" + sw_lat + "&swlng=" + sw_lng + "&nelat=" + ne_lat + "&nelng=" + ne_lng,
		success: function(data){
		if(data != "empty") {
			var data1 = (data).split("*");
			if(data1[2] > 1) {
			var lat = (data1[0]).split("|");var lng = (data1[1]).split("|");
			lat.pop();
			lng.pop();
			} else {
			var lat = data1[0];
			var lng = data1[1];
			}		
			var m = [];
			m.push(lat);
			m.push(lng);
			m.push(data1[2]);

			process_markers(m);
			}
		}		
	});
}
	
	var s_sw_lat = s_sw.lat();
	var s_sw_lng = s_sw.lng();
	var s_ne_lat = s_ne.lat();
	var s_ne_lng = s_ne.lng();
	
	var mgrOptions = {borderPadding: 25};
	var mgr = new MarkerManager(map,mgrOptions);
	
	get_and_set(s_sw_lat,s_sw_lng,s_ne_lat,s_ne_lng);		


GEvent.addListener(map, "dragend", function() {
		var after_bounds = map.getBounds();
		var a_sw = after_bounds.getSouthWest();
		var a_ne = after_bounds.getNorthEast();
		var a_sw_lat = a_sw.lat();
		var a_sw_lng = a_sw.lng();
		var a_ne_lat = a_ne.lat();
		var a_ne_lng = a_ne.lng();
				
		get_and_set(a_sw_lat,a_sw_lng,a_ne_lat,a_ne_lng);
		
	});


К карте привязан listener, то есть, после перетаскивания карты, проверяются вытащенные из базы маркеры с уже теми, что есть на карте и удаляются те, которые уже есть на карте.

Оставшиеся в массиве маркеры, если такие будут, наносятся на карту и добавляются в общий массив маркеров.

Только вот проблема в том, что при перетаскивании иногда происходит вот такое, хотя в базе координат всего на 5 маркеров:

screenshot

У меня почему то проскакивает m[2] в виде единицы, хотя должен быть 0, если на карте уже есть такой маркер.

Помогите пожалуйста разобраться, где я ошибся.

Может в скрипте присутствуют лишние вычисления? Если да, то как их сократить?

x-yuri 05.10.2009 20:42

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


Часовой пояс GMT +3, время: 21:24.