الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعدة في مشروع تخرج تحميل جزء من الصفحة دون اعادة تحميل كل الصفحة

بدأه azzedine509 في 30 يناير 2012 · 8 رد · 1,201 مشاهدة · في قسم البرمجة بــ Javascript
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم اخواني

واجهت مشكلة اوقفت عملي على مشروع تخرج

قمت بتصميم صفحة خرائط جوجل بالاعتماد عاى مراجع جوجل لكم المشكلة التي واحهتها هي اعادة تحديت محتويات الصفحة دون اعادة تحميلها

الفكرة هي اضهار المعلومات الموجودة على قاعدة البيانات و ضهورها على الخريطة دون اعادة تحميل الصفحة كاحداتيات النقطة التي سوف يتم اضهارها بالخريطة

لجلب المعلومات من قاعدة البيانات استخدمت سكربت php تحويل المعلومات من قاعدة البيانات الى ملف XML و اضهاره في نفس الصفحة و الخريطة تقوم بقرائة المعلومات بشكل مباشر من الملف دون الحاجة الى العودة الى قاعدة البيانات

لكن المشكل الدي واجهته هو عندما احدت اي شئ في قاعدة البيانات ان يتم تحديتها على الخريطة دون الحاجة الى اعادة تحميل الصفحة و بصراحة لم اكتب لك هده الاسطر حتى بحت بتلات لغات و لم اجد اي شئ

سوف اضع السكربت الدي اشتغات به بشكل كامل و اتمنى من الله ان اجد من يساعدني

سكربت PHP الدي يحول المعلومات من قاعدة البيانات الى ملف XML

<?php
$user = "root";
$password = "";
$host = "localhost";
$bdd = "map";
mysql_connect($host,$user,$password);
mysql_select_db($bdd) or die("erreur de connexion à la base de données");
$sql = "SELECT * FROM poi";
$res = mysql_query($sql) or die("erreur");
$dom = new DomDocument('1.0', 'iso-8859-1');
$node = $dom->createElement("markers");
$parnode = $dom->appendChild($node);
while ($result = mysql_fetch_array($res)){
$node = $dom->createElement("marker");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("titre", $result['titre']);
$newnode->setAttribute("lat", $result['latitud']);
$newnode->setAttribute("lng", $result['longitude']);
$newnode->setAttribute("description",utf8_encode($result['description']));
}
$xmlfile = $dom->saveXML();
echo $xmlfile;
?>

الان الدوال التي اشتغلت بها

الدالة الاولى لفتح requête AJAX

function createXmlHttpRequest() {
try {
if (typeof ActiveXObject != "undefined") {
return new ActiveXObject("Microsoft.XMLHTTP");
} else if (window["XMLHttpRequest"]) {
return new XMLHttpRequest();
}
} catch (e) {
changeStatus(e);
}
return null;
};

الدالة التانية

الدالة التي تقوم بتحميل ملف xml

function downloadUrl(url, callback) {
var status = -1;
var request = createXmlHttpRequest();
if (!request) {
return false;
}
request.onreadystatechange = function() {
if (request.readyState == 4) {
try {
status = request.status;
} catch (e) {
}
if (status == 200) {
callback(request.responseText, request.status);
request.onreadystatechange = function() {};
}
}
}
request.open("GET", url, true);
try {
request.send(null);
} catch (e) {
changeStatus(e);
}
};

الدالة التالتة

function xmlParse(str) {
if (typeof ActiveXObject != "undefined" && typeof GetObject != "undefined") {
var doc = new ActiveXObject("Microsoft.XMLDOM");
doc.loadXML(str);
return doc;
}
if (typeof DOMParser != "undefined") {
return (new DOMParser()).parseFromString(str, "text/xml");
}
return createElement("div", null);
}

الدالة الرابعة

التي تقوم بوضع النقاط على الخريطة

function createMarker(lat, lng, titre, description){
var latlng = new google.maps.LatLng(lat, lng);
var marker = new google.maps.Marker({
position: latlng,
map: map,
title: titre
});
var infobulle = new google.maps.InfoWindow({
content: description
});
google.maps.event.addListener(marker, "click", function(){
infobulle.open(map, marker);
});

}

الدالة الخامسة احداتات الخريطة لكن لا تحتاج الى اعادة تحميل لانها سوف تخلق مشكل

function initialize() {
var latlng = new google.maps.LatLng(31.633214, -8.009033);
var myOptions = {
zoom: 10,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);
}

الدالة السادسة تقوم بانشاء النقط و اخط الاحداتيات من ملف XML

downloadUrl("position-bd.php", function(data) {
var xml = xmlParse(data);
var markers = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
createMarker(parseFloat(markers.getAttribute("lat")),parseFloat(markers.getAttribute("lng")), markers.getAttribute("titre"),markers.getAttribute("description")),
setInterval(createMarker, 2000); 

}
})

كود صفحة هتمل بشكل كامل

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">

	<head>
		<title>Carte Google Maps</title>
		<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>	
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script> 

		<script type="text/javascript">

function createXmlHttpRequest() {
try {
if (typeof ActiveXObject != "undefined") {
return new ActiveXObject("Microsoft.XMLHTTP");
} else if (window["XMLHttpRequest"]) {
return new XMLHttpRequest();
}
} catch (e) {
changeStatus(e);
}
return null;
};
function downloadUrl(url, callback) {
var status = -1;
var request = createXmlHttpRequest();
if (!request) {
return false;
}
request.onreadystatechange = function() {
if (request.readyState == 4) {
try {
status = request.status;
} catch (e) {
}
if (status == 200) {
callback(request.responseText, request.status);
request.onreadystatechange = function() {};
}
}
}
request.open("GET", url, true);
try {
request.send(null);
} catch (e) {
changeStatus(e);
}
};

function xmlParse(str) {
if (typeof ActiveXObject != "undefined" && typeof GetObject != "undefined") {
var doc = new ActiveXObject("Microsoft.XMLDOM");
doc.loadXML(str);
return doc;
}
if (typeof DOMParser != "undefined") {
return (new DOMParser()).parseFromString(str, "text/xml");
}
return createElement("div", null);
}

function createMarker(lat, lng, titre, description){
var latlng = new google.maps.LatLng(lat, lng);
var marker = new google.maps.Marker({
position: latlng,
map: map,
title: titre
});
var infobulle = new google.maps.InfoWindow({
content: description
});
google.maps.event.addListener(marker, "click", function(){
infobulle.open(map, marker);
});

}
function initialize() {
var latlng = new google.maps.LatLng(31.633214, -8.009033);
var myOptions = {
zoom: 10,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);
}

downloadUrl("position-bd.php", function(data) {
var xml = xmlParse(data);
var markers = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
createMarker(parseFloat(markers.getAttribute("lat")),parseFloat(markers.getAttribute("lng")), markers.getAttribute("titre"),markers.getAttribute("description")),
setInterval(createMarker, 2000); 

}
})	

setInterval(function() {createMarker()}, 1000); 
setInterval(function() {xmlParse(str)}, 1000);
setInterval(function() {downloadUrl()}, 1000);
setInterval(function() {createXmlHttpRequest()}, 1000);

</script>
	</head>

	<body onload="initialize()">
		<div id="map_canvas" style="width:100%; height:100%"></div>
	</body>
</html>

وضعت السكربت بين ايديكم اتمنى ان تساعدوني

مع العلم اني استخدمت الدالة setInterval و واجهت مشاكل اما اختفاء الخريطة او يبقى الامر على حاله

مشروعي بين ايدكم و اتمنى المساعدة

#2

ممكن وضع محتوى قاعدة البيانات او فقط الجدول poi

#3
-- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- Client: localhost
-- Généré le : Lun 30 Janvier 2012 à 20:43
-- Version du serveur: 5.5.16
-- Version de PHP: 5.3.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `map`
--

-- --------------------------------------------------------

--
-- Structure de la table `poi`
--

CREATE TABLE IF NOT EXISTS `poi` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `titre` varchar(100) NOT NULL,
  `latitud` double NOT NULL,
  `longitude` double NOT NULL,
  `description` text NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

--
-- Contenu de la table `poi`
--

INSERT INTO `poi` (`id`, `titre`, `latitud`, `longitude`, `description`) VALUES
(6, 'Pointeur1', 31.62730153, -8.02582467, 'Nom:AZZEddine\r\nquartier : massira\r\nville : marrakech\r\npays : Maroc'),
(7, 'Pointeur2', 31.6, -8.216667, 'Nom:Tarik\r\nprenom : lodi \r\nquartier : bou Azza\r\nville : marrakech\r\npays : Maroc\r\n'),
(8, 'Pointeur3', 31.586, -8.495956999999976, 'Nom:Tarik\r\nprenom : lodi \r\nquartier : Mzouda\r\nville : marrakech\r\npays : Maroc\r\n'),
(9, 'Pointeur4', 31.7518068, -8.106551599999, 'Nom:Tarik\r\nprenom : mohammed\r\nquartier : tamnsourt\r\nville : marrakech\r\npays : Maroc\r\n'),
(10, 'Pointeur5', 31.666667, -7.85, 'Nom:ali\r\nprenom : lodi \r\nquartier : assakane\r\nville : marrakech\r\npays : Maroc\r\n');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

اتمنى المساعدة اخي اريد ان تتغير المعلومات الخاصة بنقط الموضوعة في الخريطة دون ان تحدت الصفحة

و شكرا جزيلا على اهتمامك اخي

#4

السلام عليكم

اولا قمت بوضع هذه الاسطر داخل دالة جديدة هي start

function start() {
	downloadUrl("position-bd.php", function(data) {
		console.log("start");

		var xml = xmlParse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");

		for (var i = 0; i < markers.length; i++) {
			createMarker(parseFloat(markers.getAttribute("lat")),
						parseFloat(markers.getAttribute("lng")),
						markers.getAttribute("titre"),
						markers.getAttribute("description")); 
			//setInterval(createMarker, 2000); // مسحت هذا السطر
		}
	});
}

ومن تم نضع مؤقت في نهاية الدالة initialize يستدعي الدالة start مثلا كل 10 ثوان

function initialize() {
	var latlng = new google.maps.LatLng(31.633214, -8.009033);
	var myOptions = {
		zoom: 10,
		center: latlng,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	};

	map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);

	start();
	timer = setInterval("start()", 10000);
}

المشكل انه في كل مرة يتم رسم الـ marker فوق بعضها بعضا

تم تعديل هذه المشاركة بواسطة choclatboy في 30 يناير 2012 في 06:44

1
#5

و الله لا اعرف الطريقة التي اشكرك بها

شكرا جزيلا اخي و جعلها الله في ميزان حسناتك

هناك دالة

setMap(null

التي تقوم بمسح الفونكسيون الاولى هل من حل بعض ضهور marker يمسحو و يتم اعادة كتابتهم

هدا متال حيت يتم مسح marker و تعوضيه باخر بعض الضغط على INPUT

http://www.weboblog.fr/geocoder-adresse-googlemap-v3

#6

السلام عليكم

كنت اجرب طريقة هي وضع id كل marker داخل مصفوفة، وقبل رسمه على الخريطة نتأكد انه ليس موجودا في هذه المصفوفة

سأجرب الطريقة الاخرى setMap

بالتوفيق ان شاء الله

#7

شكرا على الاهتمام اي طريقة تشتغل بشكل جيد انا مستعد لاجربها

#8

السلام عليكم

قمت بتعديله بشكل كبير، لكن لم اغير المبدأ الاساسي (الاتصال عن طريق ajax كل 30 ثانية وجلب الاحداثيات من قاعدة البيانات على صيغة json ليسهل التعامل معها من خلال jquery)

عند اضافة او تعديل او حتى حذف marker من الجدول poi فسوف يتم تطبيق هذا التعديل على الخريطة دون اعادة تحميل الصفحة.

لتسهيل عملية Debug تركت اسطر console.log يمكنك حذفها

post-49504-020281200 1327954241_thumb.pn

بالتوفيق ان شاء الله

maps_markers.zip

المرفقات
gmaps_markers.png
1
#9

شكرا جزييييييييييييييلا اخي

و جعلها الله في ميزان حسناتك

راك ولد البلاد

و اتمنى من الله ان يوفقك في حياتك

تمياتي لك بالتوفيق

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…