PDA

View Full Version : Ajax+XML



m.labbaf
شنبه 18 خرداد 1387, 11:50 صبح
در این بخش به مباحث مربوط به آژاکس و xml می پردازیم و در مورد تکنیکهای جدید برای بالا بردن سرعت و کارایی سایت بحث می کنیم .با تشکر از دوستان

m.labbaf
شنبه 18 خرداد 1387, 11:50 صبح
با سلام .برای شروع آژاکس ابتدا از تکنیکهای ساده استفاده می کنیم .
بحث امروز در مورد واکشی اطلاعات از دیتابیس و نمایش آن آن در صفحه html است که این کار را از طریق تکنولوژی آژاکس انجام می دهیم .(Asynchronous Javascript+XML)
Asynchronous به معنی غیر همزمان است.
به طور خلاصه از 3 تکنیک برای واکشی از دیتا بیس میتوانیم استفاده کنیم .(آژاکس تکنولوژی نیست بلکه تکنیک است.و هر شخص با استفاده از هوش خود میتوانید آن را گسترس دهد و تکنیک های بیشتری را اختراع کند.)
1- با استفاده از Frame
2- با استفاده از IFrame
3- با استفاده از XML
به طور صریح و خلاصه شروع میکنیم .تا به راحتی بتوانید از آژاکس استفاده کنید .و برنامه نویسی با آژاکس را امتحان کنید.
1-یک پروژه .net باز کرده و یک صفحه به نام Display.htm می سازید.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Display Page</title>

<script type="text/javascript">
function requestCustomerInfo()
{
var sId=document.getElementById("txtCustomerId").value;
top.frames["hiddenFrame"].location="Default.aspx?id="+sId;
}
function displayCustomerInfo(sText) {
var divCustomerInfo = document.getElementById("divCustomerInfo");
divCustomerInfo.innerHTML = sText;
}
</script>
</head>

<body>

<p>Enter customerId: <input type="text" id="txtCustomerId" value="" /></p>
<p><input type="button" id="Button1" value="get Customer Info" onclick="requestCustomerInfo()" /></p>
<div id="divCustomerInfo"></div>
</body>
</html>
کد های بالا را درون آن کپی کنید.
در این صفحه یک جعبه متن داریم که کد محصولی را در آن وارد میکنیم و نام آن را دریافت میکنیم بدون آنکه صفحه refresh شود اطلاعات را از دیتا بیس میخوانیم و نمایش می دهیم.
تابع جاوااسکریپت اول مقدار جعبه متن را خوانده و از طریق خط دوم به صفحه Default.aspx
می دهد .خلاصه کار به این صورت است که صفحه aspx ما کد را میگیرد و دیتا بیس متصل و نام محصول را میخواند و جواب را از طریق Response.write
<div id="divInfoToReturn"><%Response.Write(sInfo);%></div>
که داخل یک div است به صفحه فعلی انتقال میدهد.تابع displayCustomerInfo
در صفحه aspx ما فراخوانی میشود.
در اصل ما یک فریم میانی داریم که در صفحان آن را صدا میزنیم و از توابع داخل آن صفحات استفاده میکنیم . به این شکل.

<script type="text/javascript">
window.onload = function () {
var divInfoToReturn = document.getElementById("divInfoToReturn");
top.frames["displayFrame"].displayCustomerInfo(divInfoToReturn.innerHTML);
};

</script>

m.labbaf
شنبه 18 خرداد 1387, 11:51 صبح
کد مربوط به صفحه Default.aspx


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Labbaf Project</title>
</head>
<body>

<form id="form1" runat="server">

<script type="text/javascript">
window.onload = function () {
var divInfoToReturn = document.getElementById("divInfoToReturn");
top.frames["displayFrame"].displayCustomerInfo(divInfoToReturn.innerHTML);
};

</script>

<%
string sInfo = "";
string sID = Request["id"];
// Response.Write( Request["id"].ToString());

//customer ID


Proxy p=new Proxy();
System.Data.DataRow dr = p.FillRow("Select * from MyProje where id=" + sID);
if (dr!=null)
{
sInfo = dr["Name"].ToString();
}
else
{
sInfo = "Name with ID $sID doesn't exist.";
}
%>

<div id="divInfoToReturn"><%Response.Write(sInfo);%></div>

</form>

</body>
</html>





کد مربوط به FrameSet
صفحه ای به نام HIDDENF2.HTM ساخته و کد زیر را درون آن بنویسید


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
</head>
<frameset rows="100%,0" frameborder="1">
<frame name="displayFrame" width=20 height=20 src="Display.htm" noresize="noresize" />
<frame name="hiddenFrame" width=20 height=20 src="about:blank" noresize="noresize" />
</frameset>

<body>

</body>

</html>



در کال ما 3 صفحه داریم .
1- Display.htm
2- HTMLPage.htm
3- Default.aspx



به این شکل میتواین از این تکنیک استفاده کنیم.

m.labbaf
شنبه 18 خرداد 1387, 11:52 صبح
روش بالا به علت قدیمی بودن و ساختار آن که از فریم پنهان استفاده شده است کمتر در جوامع برنامه نویسی استفاده می شود.

در روش زیر که با استفاده از xml است ما از 2 صفحه استفاده میکنیم .

1- صفحه ای به نام XMLHTTP.HTM ساخته و کد زیر را درون آن کپی میکنیم .



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>XMLHttp Example 1</title>
<script type="text/javascript"src="zxml.js"></script>

<script type="text/javascript">
function requestCustomerInfo() {
var sId = document.getElementById("txtCustomerId").value;
var oXmlHttp = zXmlHttp.createRequest();
oXmlHttp.open("get", "default.aspx?id=" + sId, true);
oXmlHttp.onreadystatechange = function () {
if (oXmlHttp.readyState == 4) {
if (oXmlHttp.status == 200) {
displayCustomerInfo(oXmlHttp.responseText);
} else {
displayCustomerInfo("An error occurred: " + oXmlHttp.statusText); //statusText is not always accurate
}
}
};
oXmlHttp.send(null);
}

function displayCustomerInfo(sText) {
var divCustomerInfo = document.getElementById("divCustomerInfo");
divCustomerInfo.innerHTML = sText;
}
</script>
</head>
<body>
<p>Enter customer ID number to retrieve information:</p>
<p>Customer ID: <input type="text" id="txtCustomerId" value="" /></p>
<p><input type="button" value="Get Customer Info" onclick="requestCustomerInfo()" /></p>
<div id="divCustomerInfo"></div>
</body>
</html>

2- Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>hhh</title>
</head>
<body>

<form id="form1" runat="server">

<script type="text/javascript">
window.onload = function () {
var divInfoToReturn = document.getElementById("divInfoToReturn");
top.frames["displayFrame"].displayCustomerInfo(divInfoToReturn.innerHTML);
};

</script>

<%
string sInfo = "";
string sID = Request["id"];
// Response.Write( Request["id"].ToString());

//customer ID


Proxy p=new Proxy();
System.Data.DataRow dr = p.FillRow("Select * from MyProje where id=" + sID);
if (dr!=null)
{
sInfo = dr["Name"].ToString();
}
else
{
sInfo = "Customer with ID $sID doesn't exist.";
}
%>

<div id="divInfoToReturn"><%Response.Write(sInfo);%></div>

</form>

</body>
</html>





در این روش یک فایل جاوااسکریپت هم داریم .که محتویات آن به شرح زیر است.

var zXml={useActiveX:(typeof ActiveXObject!="undefined"),useDom:document.implementation&&document.implementation.createDocument,useXmlHttp: (typeof XMLHttpRequest!="undefined")};zXml.ARR_XMLHTTP_VERS=["MSXML2.XmlHttp.5.0","MSXML2.XmlHttp.4.0","MSXML2.XmlHttp.3.0","MSXML2.XmlHttp","Microsoft.XmlHttp"];zXml.ARR_DOM_VERS=["MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","Microsoft.XmlDom"];;function zXmlHttp(){}zXmlHttp.createRequest=function(){if(z Xml.useXmlHttp){return new XMLHttpRequest();}else if(zXml.useActiveX){if(!zXml.XMLHTTP_VER){for(var i=0;i<zXml.ARR_XMLHTTP_VERS.length;i++){try{new ActiveXObject(zXml.ARR_XMLHTTP_VERS[i]);zXml.XMLHTTP_VER=zXml.ARR_XMLHTTP_VERS[i];break;}catch(oError){;}}}if(zXml.XMLHTTP_VER){ret urn new ActiveXObject(zXml.XMLHTTP_VER);}else{throw new Error("Could not create XML HTTP Request.");}}else{throw new Error("Your browser doesn't support an XML HTTP Request.");}};zXmlHttp.isSupported=function(){return zXml.useXmlHttp||zXml.useActiveX;};function zXmlDom(){}zXmlDom.createDocument=function(){if(zX ml.useDom){var oXmlDom=document.implementation.createDocument("","",null);oXmlDom.parseError={valueOf:function(){retu rn this.errorCode;},toString:function(){return this.errorCode.toString()}};oXmlDom.__initError__( );oXmlDom.addEventListener("load",function(){this.__checkForErrors__();this.__chang eReadyState__(4);},false);return oXmlDom;;}else if(zXml.useActiveX){if(!zXml.DOM_VER){for(var i=0;i<zXml.ARR_DOM_VERS.length;i++){try{new ActiveXObject(zXml.ARR_DOM_VERS[i]);zXml.DOM_VER=zXml.ARR_DOM_VERS[i];break;}catch(oError){;}}}if(zXml.DOM_VER){return new ActiveXObject(zXml.DOM_VER);}else{throw new Error("Could not create XML DOM document.");}}else{throw new Error("Your browser doesn't support an XML DOM document.");}};zXmlDom.isSupported=function(){return zXml.useDom||zXml.useActiveX;};var oMozDocument=null;if(typeof XMLDocument!="undefined"){oMozDocument=XMLDocument;}else if(typeof Document!="undefined"){oMozDocument=Document;}if(oMozDocument&&!window.opera){oMozDocument.prototype.readyState=0 ;oMozDocument.prototype.onreadystatechange=null;oM ozDocument.prototype.__changeReadyState__=function (iReadyState){this.readyState=iReadyState;if(typeo f this.onreadystatechange=="function"){this.onreadystatechange();}};oMozDocument.protot ype.__initError__=function(){this.parseError.error Code=0;this.parseError.filepos=-1;this.parseError.line=-1;this.parseError.linepos=-1;this.parseError.reason=null;this.parseError.srcT ext=null;this.parseError.url=null;};oMozDocument.p rototype.__checkForErrors__=function(){if(this.doc umentElement.tagName=="parsererror"){var reError=/>([\s\S]*?)Location:([\s\S]*?)Line Number(\d+),Column(\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;reError.test(this.xml);this.parseError.errorCode=-999999;this.parseError.reason=RegExp.$1;this.parse Error.url=RegExp.$2;this.parseError.line=parseInt( RegExp.$3);this.parseError.linepos=parseInt(RegExp .$4);this.parseError.srcText=RegExp.$5;}};oMozDocu ment.prototype.loadXML=function(sXml){this.__initE rror__();this.__changeReadyState__(1);var oParser=new DOMParser();var oXmlDom=oParser.parseFromString(sXml,"text/xml");while(this.firstChild){this.removeChild(this.fir stChild);}for(var i=0;i<oXmlDom.childNodes.length;i++){var oNewNode=this.importNode(oXmlDom.childNodes[i],true);this.appendChild(oNewNode);}this.__checkFor Errors__();this.__changeReadyState__(4);};oMozDocu ment.prototype.__load__=oMozDocument.prototype.loa d;oMozDocument.prototype.load=function(sURL){this. __initError__();this.__changeReadyState__(1);this. __load__(sURL);};Node.prototype.__defineGetter__("xml",function(){var oSerializer=new XMLSerializer();return oSerializer.serializeToString(this,"text/xml");});Node.prototype.__defineGetter__("text",function(){var sText="";for(var i=0;i<this.childNodes.length;i++){if(this.childNodes[i].hasChildNodes()){sText+=this.childNodes[i].text;}else{sText+=this.childNodes[i].nodeValue;}}return sText;});}function zXslt(){}zXslt.transformToText=function(oXml,oXslt ){if(typeof XSLTProcessor!="undefined"){var oProcessor=new XSLTProcessor();oProcessor.importStylesheet(oXslt) ;var oResultDom=oProcessor.transformToDocument(oXml);va r sResult=oResultDom.xml;if(sResult.indexOf("<transformiix:result")>-1){sResult=sResult.substring(sResult.indexOf(">")+1,sResult.lastIndexOf("<"));}return sResult;;}else if(zXml.useActiveX){return oXml.transformNode(oXslt);}else{throw new Error("No XSLT engine found.");}};function zXPath(){}zXPath.selectNodes=function(oRefNode,sXP ath,sXmlNs){if(typeof XPathEvaluator!="undefined"){oXmlNs=oXmlNs||{};var nsResolver=function(sPrefix){return oXmlNs[sPrefix];};var oEvaluator=new XPathEvaluator();var oResult=oEvaluator.evaluate(sXPath,oRefNode,nsReso lver,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null); var aNodes=new Array;if(oResult!=null){var oElement=oResult.iterateNext();while(oElement){aNo des.push(oElement);oElement=oResult.iterateNext(); }}return aNodes;}else if(zXml.useActiveX){if(oXmlNs){var sXmlNs="";for(var sProp in oXmlNs){sXmlNs+="xmlns:"+sProp+"="+oXmlNs[sProp]+" ";}oRefNode.ownerDocument.setProperty("SelectionNamespaces",sXmlNs);};return oRefNode.selectNodes(sXPath);}else{throw new Error("No XPath engine found.");}};zXPath.selectSingleNode=function(oRefNode,sXP ath,oXmlNs){if(typeof XPathEvaluator!="undefined"){;oXmlNs=oXmlNs||{};var nsResolver=function(sPrefix){return oXmlNs[sPrefix];};var oEvaluator=new XPathEvaluator();var oResult=oEvaluator.evaluate(sXPath,oRefNode,nsReso lver,XPathResult.FIRST_ORDERED_NODE_TYPE,null);if( oResult!=null){return oResult.singleNodeValue;}else{return null;};}else if(zXML.useActiveX){if(oXmlNs){var sXmlNs="";for(var sProp in oXmlNs){sXmlNs+="xmlns:"+sProp+"="+oXmlNs[sProp]+" ";}oRefNode.ownerDocument.setProperty("SelectionNamespaces",sXmlNs);};return oRefNode.selectSingleNode(sXPath);}else{throw new Error("No XPath engine found.");}};function zXMLSerializer(){}zXMLSerializer.prototype.seriali zeToString=function(oNode){var sXml="";switch(oNode.nodeType){case 1:sXml="<"+oNode.tagName;for(var i=0;i<oNode.attributes.length;i++){sXml+=" "+oNode.attributes[i].name+"=\""+oNode.attributes[i].value+"\"";}sXml+=">";for(var i=0;i<oNode.childNodes.length;i++){sXml+=this.serializeT oString(oNode.childNodes[i]);}sXml+="</"+oNode.tagName+">";break;case 3:sXml=oNode.nodeValue;break;case 4:sXml="<![CDATA["+oNode.nodeValue+"]]>";break;case 7:sXml="<?"+oNode.nodevalue+"?>";break;case 8:sXml="<!--"+oNode.nodevalue+"-->";break;case 9:for(var i=0;i<oNode.childNodes.length;i++){sXml+=this.serializeT oString(oNode.childNodes[i]);}break;};return sXml;};

فقط کافیست که این کد ها را در فایلی به نام . ZXML.JS قرار دهیم .

این روش روش کلی کار با تکنیک آژاکس است و با کار بر روی آنها و کمی تغییر می توانیم تمام کارهای مربوط به یک سایت نظیر ورود اطلاعات و ویرایش و حذف و نمایش و غیره را انجام دهیم .


در صورت بروز هر گونه مشکل میتوانید تماس بگیرید و راهنماییهای لازم رو دریافت نمایید.
m.labbaf@gmail.com
www.sinapayman.com (http://www.sinapayman.com/)