ugrás a tartalomhoz

Javascript névtér gondok

inf · 2008. Jún. 6. (P), 08.00
Sziasztok!

Próbáltam beüzemelni a getElementsByTagNameNS függvényt, de nem sok sikerrel jártam, úgyhogy rákerestem neten egy példára, és az sem működött, most nem értem, hogy akkor maga a függvény a rossz, vagy én rontok el valamit?

<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
	xmlns:action="http://www.xyz.com/actions/">
<head>
	<script>
		function init()
		{
			var a=document.getElementsByTagNameNS("http://www.xyz.com/actions/","*");
			alert(a.length)
			for (var i=0; i<a.length; i++)
			{
				var item=a[i]
				alert(item.tagName)
			}
			
			var x=document.getElementsByTagName("action:preloadimg")
			alert(x[0])
			/*
			alert(x.namespaceURI)
			alert(x.prefix)*/
		}
	</script>
</head>
<body onload="init()">
	<action:preloadimg autostart="true">
		<img id="aaa" src="a.jpg" />
		<img src="b.jpg" />
	</action:preloadimg>
</body>
</html>
érdekessége a dolognak, hogyha a namespacet is beleveszem a tagnamebe és úgy keresek rá, akkor megtalálja az adott elemet... nyilván nekem ez nagyon nem jó, mert namespace alapján szeretnék feldolgozni elemeket a tagname pedig tetszőleges lesz...

ja kérdés:
mégis hogy lehet működésre bírni?
 
1

Esetleg dtd gond

inf · 2008. Jún. 6. (P), 10.58
még arra gondoltam, hogy írnom kéne dtd-t, de ezt nem tartom valószínűnek
tákoltam gyorsan egy tesztet:

<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
	xmlns:action="http://www.xyz.com/actions/">
<head>
	<title>bla</title>
	<script>
	//<![CDATA[
		function $e(tag)
		{
			return document.createElement(tag);
		}
		
		function $t(text)
		{
			return document.createTextNode(text);
		}
	
		function init()
		{
			var groups=[];
			groups[0]=document.getElementsByTagName("preloadimg");
			groups[1]=document.getElementsByTagName("action:preloadimg");
			groups[2]=document.getElementsByTagNameNS("http://www.xyz.com/actions/","preloadimg");
			groups[3]=document.getElementsByTagNameNS("http://www.xyz.com/actions/","action:preloadimg");
			groups[4]=document.getElementsByTagNameNS("action","preloadimg");
			groups[5]=document.getElementsByTagNameNS("*","action:preloadimg");
			groups[6]=document.getElementsByTagNameNS("","action:preloadimg");
			
			var titles=[];
			titles[0]="tagName(preloadimg)"
			titles[1]="tagName(action:preloadimg)"
			titles[2]="tagNameNS(uri,preloadimg)"
			titles[3]="tagNameNS(uri,action:preloadimg)"
			titles[4]="tagNameNS(action,preloadimg)"
			titles[5]="tagNameNS(*,action:preloadimg)"
			titles[6]="tagNameNS('',action:preloadimg)"
			
			var out=$e("div");
			
			for (var i=0; i<groups.length; i++)
			{
				var group=groups[i];
				var title=titles[i];
				var row=$e("div");
				
				row.appendChild($t(title));
				row.appendChild($e("br"));
				row.appendChild($t(group.length?"yes":"no"));
				
				out.appendChild(row);
			}
			
			document.body.appendChild(out);
		}
	//]]>
	</script>
</head>
<body onload="init()">
	<action:preloadimg autostart="true" url="a.jpg">
	</action:preloadimg>
</body>
</html>
2

IE megoldás

inf · 2008. Jún. 7. (Szo), 19.48
Azt írják a getElementsByTagNameNS függvényről, hogy ie nem támogatja, viszont ez nem gond, mert tree iteratort már rég megírtam..
ie-ben megtaláltam a megoldást, az alábbi sorral kell kiegészíteni a kódot:

<?xml:namespace prefix="action" ns="http://www.esportsview.com/action/" />
firefoxban csak az segít, ha text/xml headerrel használom az oldalt, viszont ez ieben nem járható út, legalábbis .xml kiterjesztésre ie elég furán reagál.

szóval most egy olyan megoldást keresek, ami mindkét böngészőben működik, meg esetleg a harmadikban is (safari)

eddig úgy néz ki, hogy névtér csak xml-ben van mindenhol, és valahogy az xmlt kéne úgy behozni a htmlbe, hogy attól még maga az oldal text/htmlként legyen értelmezve.

bármi ötlet?
3

Csak kérdezem...

foxmulder · 2008. Jún. 7. (Szo), 23.13
Nem az okoz problémát, hogy az xml deklaráció (<?xml version="...?>) nem az első sorban van? Úgy emlékszem ennek kell az első sornak lennie egy xml dokumentumban. Mivel nálad a html fejléc van előbb, a Firefox html-ként is értelmezi, vagyis egyrészt amit nem ért (pl.: action tag), azzal nem foglalkozik (ahogy a HTML-ben szokás) és talán a DOM-ba (-be?) sem épülnek be az ilyen elemek és attribútumok (például a html elem xmlns:action attribútuma sem), innentől fogva a getElementsByTagNameNS() meg sem találhatja őket.
4

Igaz

inf · 2008. Jún. 7. (Szo), 23.39
Valóban, ide még rosszul írtam, később kijavítottam a hibát, és nincs hatással a dologra. Egyébként meg azt próbálom áthidalni, hogy a htmlként értelmezett cuccon valahogy tudjak xml funkciókat használni, de nem jön össze. Sajnos ie nem tud xml-t htmlként értelmezni, max annyira, hogy xsltvel lefordítja, de úgy szimplán nem, szóval ieben nem járható út, a text/xml, vagy application/xhtml+xml, egyedül az, amit írtam.
Egyébként ma nagyon kiverte nálam a biztosítékot az a böngésző, mert lemondtam erről a html-névtér dologról, viszont xml-ben szeretném használni ugyanezt, ahol azért már logikusan működnie kéne.
Na ieben nincs névtér az xml objectben, mert csak dom1-et támogat az xml parsere, ami azért külön érdekes, mert az előbb leírt módon még htmlben is el lehet érni benne a névterezést.. Akkor most hogy is van ez? Úgy igazából nem ez volt, ami felhúzott, hanem próbáltam lekérni egy gyerek node tulajdonságait for-in-nel, aztán hibaüzenetet kaptam, hogy azt a szutykot nem lehet for-inezni, mert nem támogatja. Na szal eléggé felhúzott, hogy hogy lehet ekkora szemetet piacra dobni, meg böngészőnek eladni. :S

Valahogy összegányolom majd, hogy lehessen xml-ben névterezni, meg egyáltalán alapvető dolgokat megoldani, de elég érdekes volt már az is, amíg megtaláltam az adott object leírását az msdn.microsoft.com-on.... Aztán az meg külön vicc, hogy a leírásban persze benne van a prefix... Még annyi az ötletem, hogy elavult activeXObjectet hívhattam meg, olyat, amiben még nincs prefix, de ez már holnapra marad. Egyszerűen 2 napja szenvedek ezen az alap dolgon. Idegesítő.

Szal most éppen erre próbálok valami teszt parsert írni, az eszközök megvannak, csak megint nagyon sok a böngészők közti eltérés. Reménykedve várom az ie8at, azt mondják ott már odafigyelnek a szabványokra.

<?php
header("content-type: text/xml; charset=utf-8");
echo '<?xml version="1.0" encoding="UTF-8"?>';
?><root 
	xmlns="http://www.bla.com/"
	xmlns:action="http://www.bla.com/action">
	<action:cucc>
		<valami>
			cucc
		</valami>
	</action:cucc>
</root>
5

És ha, ...

foxmulder · 2008. Jún. 8. (V), 00.17
Sajnos ie nem tud xml-t htmlként értelmezni, max annyira, hogy xsltvel lefordítja,


CSS?

Na ieben nincs névtér az xml objectben, mert csak dom1-et támogat az xml parsere,...


ehhez mit szólsz?:
if(isMSIE) 
    elem = doc.getElementsByTagName("demo:Employee");
else 
    elem = doc.getElementsByTagNameNS("demo", "Employee");
6

Nem jó

inf · 2008. Jún. 9. (H), 22.00
Figy, látom nem érted a problémám :-) Leírom én is kóddal, hogy világos legyen:

if(isMSIE)   
    elems = doc.getElementsByTagName("demo:*");  
else   
    elems = doc.getElementsByTagNameNS("demo", "*");  
Egyrészt az összes elem kéne a névtérből, másrészt a getElementsByTagNameNS az URI-t és nem a prefixet kéri... szóval sehogy sem passzol :-) mindenképp írok rá egy saját függvényt a réteghez, amit majd ráillesztek a DOM-ra. A másik dolog, hogy valszeg kikapcsolom az ie-s xmles megoldást is, és az alapokból kezdem az egészet. Egyébként a koncenpcióm már megvan, getElementsByClassName működik mindenhol, a névtérnek meg amúgyis kell classt adnom, mert megjelenhet, ami benne van, szóval a display:none az muszáj... A többit már gondolom kitalálod...

Utánanéztem, és XML-ben sem sokkal jobb a helyzet, ie az xmlben nem támogatja a névterezést, oda talán majd beszúrom azt a prefixes részt, hátha segít benne... Meg főleg inkább XMLben fogom használni ezt az egészet adatküldésre, és szűrésre..

Köszi, hogy segítettél.
7

Újabb problémák

inf · 2008. Jún. 12. (Cs), 15.36
Kénytelen vagyok újraéleszteni a témát ...

Most úgy próbálkozom, hogy lekérem az összes tulajdonságot a document.documentElementből, és kiválasztom az xmlns:valami alakúakat, aztán ez alapján csekkolom, hogy létezik e a NS stbstb... a probléma msot ott van, hogy ie-ben nincsenek benne az attributes gyűjteményben, és getAttribute segítségével sem lehet lekérni őket..
Tudja valaki, hogy miért nem lehet lekérni ezeket, és, hogy hogyan lehetne mégis?

<html xmlns:valami="valami">
szóval egy ilyennél a

Array.Create(document.documentElement.attributes).iterate(function (iterator)
{
	var attr=iterator.value;
	if (attr.nodeName.indexOf("xmlns:")!=-1)
	{
		alert(attr.nodeName);
	}
})
semmit nem alertezik..

:-(
8

OuterHTML

inf · 2008. Jún. 12. (Cs), 23.05

	create: function ()
	{
		var doc=this.document;
		doc.DOM=this.Class;
		var root=doc.documentElement;
		doc.nameSpaces=new Hash;
		var namespaces=doc.nameSpaces;
		var exp=(/xmlns:[\w]+/i);
		
		if (root.outerHTML)
		{
			//ie6,ie7 contains xmlns:foo in outerHTML only
			var html=root.outerHTML.match(/<html[^>]*>/i)[0];
			var attributes=html.match(/xmlns:[\w]+[\W]*=[\W]*"[^"]*"/ig);
			if (attributes)
			{
				var exp=/xmlns:([\w]+)[\W]*=[\W]*"([^"]*)"/i;
				for (var i=0; i<attributes.length; i++)
				{
					var attr=attributes[i];
					var temp=attr.match(exp);
					var item={}
					item.prefix=temp[1];
					item.namespaceURI=temp[2];
					namespaces.set(item.prefix,item);
				}
			}
		}
		else
		{
			//ff contains xmlns:foo in attributes collection
			for (var i=0; i<root.attributes.length; i++)
			{
				var attr=root.attributes[i];
				var name=attr.nodeName;
				if (exp.test(name))
				{
					var item={}
					var temp=name.split(":");
					item.prefix=temp[1];
					item.namespaceURI=attr.nodeValue;
					namespaces.set(item.prefix,item);
				}
			}
		}
	}
téma lezárva.