Aprender algo nuevo cada dia

Sunday, January 15, 2006

hoy he tenido mi primer contacto con el objeto xmlhttpRequest, es decir, con AJAX!. Y he de decir que después de ver la de maravillas que hace la gente con él, me esperaba algo más complicado.

En realidad no he profundizado mucho en el tema(mas bien ha sido nada más que un poco de hacking a partir del código de otros) y desde luego no puedo decir que hoy he aprendido AJAX, pero, ya tenia yo ganas de dejar de ver esta maravillosa tecnología desde la barrera.

Pues este interesante script para greasemonkey que te permite ver los feeds de la pagina que visitas ha sido el que me ha introducido en este maravilloso mundo, gracias Joe!


Y a continuación las funciones que consiguen la maravillosa asincronía en el script de arriba:

function rss_req(src) {
if (! src) return;
// http://diveintogreasemonkey.org/api/gm_xmlhttprequest.html
if (typeof(GM_xmlhttpRequest) == 'function') {
// dbg('XHR: GM');
GM_xmlhttpRequest(
{
method: 'GET',
url: src,
headers: {
'User-agent': 'Mozilla/5.0 (compatible) GM RSS Panel'
},
onload: rss_response
});
} else {
// handle feed through "native" XHR object
if (window.XMLHttpRequest) {
try {
gReq = new window.XMLHttpRequest();
} catch(e) {
dbg((e.message) ? e.message : e.toString());
gReq = false;
}
// branch for IE/Windows ActiveX version
} else if (window.ActiveXObject) {
try {
gReq = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
dbg("Msxml2.XMLHTTP: "+(e.message) ? e.message : e.toString());

try {
gReq = new ActiveXObject("Microsoft.XMLHTTP");

} catch(e1) {
dbg("Microsoft.XMLHTTP: "+(e.message) ? e.message : e.toString());
gReq = false;
}
}
}

}
if (gReq) {
try {
gReq.onreadystatechange = rss_response;
gReq.open("GET", src);
gReq.send(null);
} catch(e) {
dbg((e.message) ? e.message : e.toString());
}
}
}

function rss_response(res) {
if (res) gReq = res; // for GM_XHR
// dbg('XHR status: ' + gReq.status);
// only if req is "loaded"
if (gReq.readyState == 4) {
// only if "OK"
if (gReq.status == 200) {
// handle result
// rss_render(gReq.responseXML);
// responseXML is not available with GM_XHR
// http://www.mozilla.org/xmlextras/parseserialize.html
// Aaargggg!
// Turnabout sets responseXML to the same string as resultText
if (gReq.responseXML && typeof(gReq.responseXML) != "string") {
// dbg("parsing Native XHR " + typeof(gReq.responseXML));
rss_render(gReq.responseXML);
// next try parsing the resultText with DOMParser;
// first the safe route through XPCNativeWrapper
} else if (typeof(XPCNativeWrapper) == "function") {
var dp = new XPCNativeWrapper(window, "DOMParser()");
// dbg('XPC Wrapped DOM Parser: '+typeof(dp));
var parser = new dp.DOMParser();
// dbg('DOM Parser: '+typeof(parser));
var DOM = parser.parseFromString(gReq.responseText, "application/xhtml+xml");
rss_render(DOM);
// fallback to content window object; this would fail
// in GM 0.6.4+ but the safe option has succeeded already.
} else if (typeof(window.DOMParser) == "object") {
// dbg("parsing DOMParser");
var parser = new win.DOMParser();
var DOM = parser.parseFromString(gReq.responseText, "application/xhtml+xml");
rss_render(DOM);
} else {
// dbg("parsing msxml2");
var DOM = new ActiveXObject("msxml2.DOMDocument");
DOM.loadXML(gReq.responseText);
if (DOM.parseError.errorCode != 0) {
dbg(DOM.parseError.reason);
return;
}
rss_render(DOM);
}
} else {
dbg("XHR response error: " + gReq.statusText + "\nURL: " + gRss_src);
}
}
}


function rss_render(DOM) {
var title = window.document.createElement("div");
title.appendChild(window.document.createTextNode(
dom_getFirstNodeValue(DOM, "title")));


box.appendChild(title);


var ul = window.document.createElement("ul");
dom_setStyle(ul, "padding-left: 14px; padding-top: 20px");
var items = [];
try {
items = dom_getElements(DOM, "item");
} catch (e) {
var li = window.document.createElement("li");
li.appendChild(window.document.createTextNode("RSS doesn't contain any items!"));
ul.appendChild(li);
}
for (var i=0; i
var n = items[i];
var desc = dom_getFirstNodeValue(n, "description");
var a = dom_createLink(
(dom_getFirstNodeValue(n, "link") || "#RSS_MISSING_LINK"),
(dom_getFirstNodeValue(n, "title") || "Untitled item #" + i),
desc);
var li = window.document.createElement("li");
dom_setStyle(li, "color:" + TEXT + ";");
li.appendChild(a);
ul.appendChild(li);
}
var div = window.document.createElement("div");
div.appendChild(ul);
div.appendChild(dom_createLink(gRss_src, "Link to RSS feed", "RSS feed XML"));
div.appendChild(window.document.createElement("br"));
div.appendChild(dom_createLink("http://joe.lapoutre.com/BoT/Javascript/RSSpanel/?v="+RSSPanelVersion, "Check for RSS Panel updates", "Current version: v" + RSSPanelVersion));
title.addEventListener('dblclick', expander, true);
box.appendChild(div);
dom_getElements(document, "body")[0].appendChild(box);

}



vale, faltan algunas funciones que son llamadas desde este código, y tb sobra codigo que no tiene nada que ver con AJAX, pero vale para hacerse una idea.

Por cierto, lo que he aprendido me ha servido para crear esta modificación del script original

0 Comments:

Post a Comment

<< Home