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?
  1. <!DOCTYPE html   
  2.      PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
  3.      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
  4. <?xml version="1.0" encoding="utf-8"?>  
  5. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"  
  6.     xmlns:action="http://www.xyz.com/actions/">  
  7. <head>  
  8.     <script>  
  9.         function init()  
  10.         {  
  11.             var a=document.getElementsByTagNameNS("http://www.xyz.com/actions/","*");  
  12.             alert(a.length)  
  13.             for (var i=0; i<a.length; i++)  
  14.             {  
  15.                 var item=a[i]  
  16.                 alert(item.tagName)  
  17.             }  
  18.               
  19.             var x=document.getElementsByTagName("action:preloadimg")  
  20.             alert(x[0])  
  21.             /*  
  22.             alert(x.namespaceURI)  
  23.             alert(x.prefix)*/  
  24.         }  
  25.     </script>  
  26. </head>  
  27. <body onload="init()">  
  28.     <action:preloadimg autostart="true">  
  29.         <img id="aaa" src="a.jpg" />  
  30.         <img src="b.jpg" />  
  31.     </action:preloadimg>  
  32. </body>  
  33. </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:
  1. <!DOCTYPE html   
  2.      PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
  3.      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
  4. <?xml version="1.0" encoding="utf-8"?>  
  5. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"  
  6.     xmlns:action="http://www.xyz.com/actions/">  
  7. <head>  
  8.     <title>bla</title>  
  9.     <script>  
  10.     //<![CDATA[ 
  11.         function $e(tag) 
  12.         { 
  13.             return document.createElement(tag); 
  14.         } 
  15.          
  16.         function $t(text) 
  17.         { 
  18.             return document.createTextNode(text); 
  19.         } 
  20.      
  21.         function init() 
  22.         { 
  23.             var groups=[]; 
  24.             groups[0]=document.getElementsByTagName("preloadimg"); 
  25.             groups[1]=document.getElementsByTagName("action:preloadimg"); 
  26.             groups[2]=document.getElementsByTagNameNS("http://www.xyz.com/actions/","preloadimg"); 
  27.             groups[3]=document.getElementsByTagNameNS("http://www.xyz.com/actions/","action:preloadimg"); 
  28.             groups[4]=document.getElementsByTagNameNS("action","preloadimg"); 
  29.             groups[5]=document.getElementsByTagNameNS("*","action:preloadimg"); 
  30.             groups[6]=document.getElementsByTagNameNS("","action:preloadimg"); 
  31.              
  32.             var titles=[]; 
  33.             titles[0]="tagName(preloadimg)" 
  34.             titles[1]="tagName(action:preloadimg)" 
  35.             titles[2]="tagNameNS(uri,preloadimg)" 
  36.             titles[3]="tagNameNS(uri,action:preloadimg)" 
  37.             titles[4]="tagNameNS(action,preloadimg)" 
  38.             titles[5]="tagNameNS(*,action:preloadimg)" 
  39.             titles[6]="tagNameNS('',action:preloadimg)" 
  40.              
  41.             var out=$e("div"); 
  42.              
  43.             for (var i=0; i<groups.length; i++) 
  44.             { 
  45.                 var group=groups[i]; 
  46.                 var title=titles[i]; 
  47.                 var row=$e("div"); 
  48.                  
  49.                 row.appendChild($t(title)); 
  50.                 row.appendChild($e("br")); 
  51.                 row.appendChild($t(group.length?"yes":"no")); 
  52.                  
  53.                 out.appendChild(row); 
  54.             } 
  55.              
  56.             document.body.appendChild(out); 
  57.         } 
  58.     //]]>  
  59.     </script>  
  60. </head>  
  61. <body onload="init()">  
  62.     <action:preloadimg autostart="true" url="a.jpg">  
  63.     </action:preloadimg>  
  64. </body>  
  65. </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:
  1. <?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.
  1. <?php  
  2. header("content-type: text/xml; charset=utf-8");  
  3. echo '<?xml version="1.0" encoding="UTF-8"?>';  
  4. ?><root   
  5.     xmlns="http://www.bla.com/"  
  6.     xmlns:action="http://www.bla.com/action">  
  7.     <action:cucc>  
  8.         <valami>  
  9.             cucc  
  10.         </valami>  
  11.     </action:cucc>  
  12. </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?:
  1. if(isMSIE)   
  2.     elem = doc.getElementsByTagName("demo:Employee");  
  3. else   
  4.     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:
  1. if(isMSIE)     
  2.     elems = doc.getElementsByTagName("demo:*");    
  3. else     
  4.     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?
  1. <html xmlns:valami="valami">  
szóval egy ilyennél a
  1. Array.Create(document.documentElement.attributes).iterate(function (iterator)  
  2. {  
  3.     var attr=iterator.value;  
  4.     if (attr.nodeName.indexOf("xmlns:")!=-1)  
  5.     {  
  6.         alert(attr.nodeName);  
  7.     }  
  8. })  
semmit nem alertezik..

:-(
8

OuterHTML

inf · 2008. Jún. 12. (Cs), 23.05
  1. create: function ()  
  2. {  
  3.     var doc=this.document;  
  4.     doc.DOM=this.Class;  
  5.     var root=doc.documentElement;  
  6.     doc.nameSpaces=new Hash;  
  7.     var namespaces=doc.nameSpaces;  
  8.     var exp=(/xmlns:[\w]+/i);  
  9.       
  10.     if (root.outerHTML)  
  11.     {  
  12.         //ie6,ie7 contains xmlns:foo in outerHTML only  
  13.         var html=root.outerHTML.match(/<html[^>]*>/i)[0];  
  14.         var attributes=html.match(/xmlns:[\w]+[\W]*=[\W]*"[^"]*"/ig);  
  15.         if (attributes)  
  16.         {  
  17.             var exp=/xmlns:([\w]+)[\W]*=[\W]*"([^"]*)"/i;  
  18.             for (var i=0; i<attributes.length; i++)  
  19.             {  
  20.                 var attr=attributes[i];  
  21.                 var temp=attr.match(exp);  
  22.                 var item={}  
  23.                 item.prefix=temp[1];  
  24.                 item.namespaceURI=temp[2];  
  25.                 namespaces.set(item.prefix,item);  
  26.             }  
  27.         }  
  28.     }  
  29.     else  
  30.     {  
  31.         //ff contains xmlns:foo in attributes collection  
  32.         for (var i=0; i<root.attributes.length; i++)  
  33.         {  
  34.             var attr=root.attributes[i];  
  35.             var name=attr.nodeName;  
  36.             if (exp.test(name))  
  37.             {  
  38.                 var item={}  
  39.                 var temp=name.split(":");  
  40.                 item.prefix=temp[1];  
  41.                 item.namespaceURI=attr.nodeValue;  
  42.                 namespaces.set(item.prefix,item);  
  43.             }  
  44.         }  
  45.     }  
  46. }  
téma lezárva.