[js+dom] Alle id's binnen element doorlopen en aanpassen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
stel ik heb het volgende html block:
XHTML:
1
2
3
4
5
6
7
8
9
10
<div id="specifications">
    <span id="spandescription">
        blaat<br />
        <a href="#" id="link" onclick="doiets()">doe iets</a>
    </span>
    <span id="spaninfo">
        Eenheid: <input type="input" id="eenheid" name="specification[]" value="" /><br />
        Varianten: <input id="specificationline" type="input" name="specificationline[]" value="" />
    </span>
</div>


wat is dan de beste manier om alle id's binnen het element "specifications" door te lopen?
Ik heb nu het volgende:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
deel uit functie:

var eId     = $(e); //e is dan het element waar binnen gelooped wordt.
var copyE   = eId.cloneNode(true); //dit is om een element te clonen
var cLength = copyE.childNodes.length -1;

for(var i = 0; cLength >= i;  i++) 
{
    alert(copyE.nodeName);
    if(copyE.childNodes[i].id) 
    {
        var cNode   = copyE.childNodes[i];
        var firstId = cNode.id;
        cNode.id = firstId+'_';  //hier pas ik het id aan (maar daar wil ik dus dat alle id's langskomen i.p.v. alleen van de div en span elementen.
    }
}


het probleem hierbij is dat hij niet door <a> loopt en ook niet door <input>, ik heb me lam gezocht
en weet dit alleen maar op te lossen door nog een loop te maken en dan evt. te selecteren op tagname o.i.d..

heeft iemand een goed idee? :)

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Hoewel je met cloneNode ( true ) de hele tree kloont, returned childNodes enkel het eerste niveau. In dit geval heb je daar vier nodes: twee spans en twee text nodes. Je kan dieper checken met b.v. hasChildNodes () op copyE.childNodes[i] te doen.

March of the Eagles


Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 22:29

BCC

In een functie gooien met recursie?

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Of het jezelf een stuk makkelijker maken en een library pakken die dit allemaal xbrowser en zo efficient mogelijk voor je afhandelt :)

jQuery:
JavaScript:
1
$('#specifications>span');


Klaar is Kees.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Dat kan ook :) En zo te zien gebruikt TS een library.

JavaScript:
1
$(e);

March of the Eagles


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
Bosmonster schreef op donderdag 16 juli 2009 @ 22:30:
Of het jezelf een stuk makkelijker maken en een library pakken die dit allemaal xbrowser en zo efficient mogelijk voor je afhandelt :)

jQuery:
JavaScript:
1
$('#specifications>span');


Klaar is Kees.
precies en ik gebruik dus ook prototype in mijn project, echter bevat dat frame work geen methode om een element met alle mogelijke (html) inhoud te clonen op basis van een id EN daarnaast van de gecloonde versie alle element id's te wijzigen (die zich bevinden in de parent element). Vandaar deze manier, maar recursie moet dan inderdaad wel werken, zal eens kijken..

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

wboard schreef op donderdag 16 juli 2009 @ 22:51:
[...]


precies en ik gebruik dus ook prototype in mijn project, echter bevat dat frame work geen methode om een element met alle mogelijke (html) inhoud te clonen op basis van een id EN daarnaast van de gecloonde versie alle element id's te wijzigen (die zich bevinden in de parent element). Vandaar deze manier, maar recursie moet dan inderdaad wel werken, zal eens kijken..
Mjah... Ondanks dat prototype redelijk zuigt, kan ik me niet voorstellen dat het dat niet zou kunnen..

Met jQuery is wat je zegt iig in 2 regels te doen.

[ Voor 4% gewijzigd door Bosmonster op 16-07-2009 23:39 ]


Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Een eenvoudige manier is in JQuery:
JavaScript:
1
2
3
$.each(function(){
    this.id = 'HHH_'+this.id;
}, $(element).find('[id]'));


Anders zul je het met een recursieve functie moeten doen.

Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
mmm.. misschien toch maar overstappen naar jquery..

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Joolee schreef op donderdag 16 juli 2009 @ 23:56:
Een eenvoudige manier is in JQuery:
JavaScript:
1
2
3
$.each(function(){
    this.id = 'HHH_'+this.id;
}, $(element).find('[id]'));


Anders zul je het met een recursieve functie moeten doen.
Dit is alleen geen eenvoudige manier, maar ene omslachtige. Waarom gebruik je niet gewoon de selector-each :? Hiermee loop je door ALLE items in je pagina heen, inclusief bijvoorbeeld het specifications element (en waarschijnlijk tientallen andere ongerelateerde elementen).

Wat ik eerder al typte:
JavaScript:
1
$('#specifications>span');


Of volledige, als je perse wilt checken of er een ID aanwezig is:

JavaScript:
1
2
3
$('#specifications>span[id]').each(function(){
   // blaat
});

Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Bosmonster schreef op vrijdag 17 juli 2009 @ 10:03:
[...]


Dit is alleen geen eenvoudige manier, maar ene omslachtige. Waarom gebruik je niet gewoon de selector-each :? Hiermee loop je door ALLE items in je pagina heen, inclusief bijvoorbeeld het specifications element (en waarschijnlijk tientallen andere ongerelateerde elementen).

Wat ik eerder al typte:
JavaScript:
1
$('#specifications>span');


Of volledige, als je perse wilt checken of er een ID aanwezig is:

JavaScript:
1
2
3
$('#specifications>span[id]').each(function(){
   // blaat
});
Als je goed naar de code kijkt doe ik het niet zo anders dan jij, alleen heb ik de selector achter de functie staan i.p.v. ervoor.

Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
heb het als volgt opgelost, als iemand weet hoe het korter d.m.v. prototype kan hoor ik het graag (kan helaas niet afstappen van prototype i.v.m. allerhande implementaties

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
                    var eId     = $(e);
                    var copyE   = eId.cloneNode(true);
                    
                    updateChildId(copyE);

                    function updateChildId(element)
                    {
                        var cLength = element.childNodes.length -1;

                        for(var i = 0; cLength >= i;  i++)
                        {
                            if(element.childNodes[i].id)
                            {
                                var cNode   = element.childNodes[i];
                                var firstId = cNode.id;
                                cNode.id = firstId+'_';

                                if(element.childNodes[i].hasChildNodes())
                                {
                                    updateChildId(cNode);
                                }
                            }
                        }
                    }

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Joolee schreef op vrijdag 17 juli 2009 @ 10:12:
[...]

Als je goed naar de code kijkt doe ik het niet zo anders dan jij, alleen heb ik de selector achter de functie staan i.p.v. ervoor.
Je doet ook niet zoveel anders, je doet het alleen een stuk omslachtiger met de object/array iterator ipv gewoon middels de gebruikelijke selector. Het druist imho een beetje in tegen het jQuery principe en volgens mij help je ook chaining ermee omzeep.

Daarnaast is de volgorde van de argumenten omgedraaid. Eerst het object, dan de callback.

Dus inderdaad, het verschil is niet zo groot, het is alleen in jQuery erg ongebruikelijk om het op een dergelijke manier te doen.

Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
op een of andere manier kom ik er niet goed uit..... 8)7
XHTML:
1
2
3
4
5
6
7
8
9
10
11
12
<input type="hidden" id="PP_specifications" name="PP_specifications" value="1" />
<input type="hidden" id="PP_specificationlines" name="PP_specificationlines" value="1" />
<div class="row_order_form" id="specifications[1]">
    <span class="description">
        Artikel variant [1]<span class="fakeLink" onmouseover="fakeLinkBehavior(this);" onclick="mcElement.element('specifications[1]', 'specifications[1]', 'copy', 'after', 'PP_specifications');"><img src="/images/1/icons/add.gif" /></span> :
    </span>
    <span class="info">
        Eenheid: <input type="input" id="eenheid" name="specifications[1]" value="" /><br />
        Varianten: <span class="fakeLink" onmouseover="fakeLinkBehavior(this);" onclick="mcElement.element('specificationline[1]', 'specificationline[1]', 'copy', 'after', 'PP_specificationlines');"><img src="/images/1/icons/add.gif" /></span><br />
        <input id="specificationline[1]" type="input" name="specificationline[1][]" value="" />
    </span>
</div>

dit moet het kunnen (maar dan universeel te gebruiken, ik wil niet voor iedere andere situatie weer wat anders gaan schrijven)
- het hele blok: specifications[1] dupliceren en vervolgens moeten er wat waarden opgehoogd worden (waaronder id's en parameters van de functie mcElement)
- een gedeelte van wat in het blok zit <input id="specificationline[1]" type="input" name="specificationline[1][]" value="" /> ook kunnen dupliceren

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
var mcElement = 
{

    copy    :   function(e, target, position, pp)   
                { 
                    var eId     = $(e);
                    var copyE   = eId.cloneNode(true);

                    /*
                    str = copyE.innerHTML;
                    copyE.innerHTML = str.replace(/[1]/, $(pp).value);
                    */

                    $(pp).value = $(pp).value + 1;

                    updateChildId(copyE);

                    function updateChildId(element)
                    {
                        var cLength = element.childNodes.length -1;

                        for(var i = 0; cLength >= i;  i++)
                        {
                            if(element.childNodes[i].id)
                            {
                                var cNode   = element.childNodes[i];
                                var firstId = cNode.id;
                                cNode.id = firstId+'_'+$('PP_'+e).value;
                                
                                if(cNode.name)
                                {
                                    cNode.name = cNode.name + '_' + $('PP_'+e).value;
                                }
                                if(element.childNodes[i].hasChildNodes())
                                {
                                    updateChildId(cNode);
                                }
                            }
                        }
                    }


                    if(position == 'before') { $(target).insert({before:copyE}); }
                    else { $(target).insert({after:copyE}); }
                },
    element :   function(e, target, type, position, pp) 
                {
                    var eId = $(e);
                    if(type == 'move') { $(target).appendChild(eId); }
                    else if(type == 'copy')     
                    { 
                        this.copy(e, target, position, pp);
                    }
                }
}


dit moet veel korter kunnen, maar ik ben heb de verkeerde afslag genomen dus kom er even niet uit :/

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
is het misschien niet eens slim dit blok in z'n geheel te willen clonen (met daarin weer een block die gekloond kan worden)
XHTML:
1
2
3
4
5
6
7
8
9
10
11
12
<input type="hidden" id="PP_specifications" name="PP_specifications" value="1" /> 
<input type="hidden" id="PP_specificationlines" name="PP_specificationlines" value="1" /> 
<div class="row_order_form" id="specifications[1]"> 
    <span class="description"> 
        Artikel variant [1]<span class="fakeLink" onmouseover="fakeLinkBehavior(this);" onclick="mcElement.element('specifications[1]', 'specifications[1]', 'copy', 'after', 'PP_specifications');"><img src="/images/1/icons/add.gif" /></span> : 
    </span> 
    <span class="info"> 
        Eenheid: <input type="input" id="eenheid" name="specifications[1]" value="" /><br /> 
        Varianten: <span class="fakeLink" onmouseover="fakeLinkBehavior(this);" onclick="mcElement.element('specificationline[1]', 'specificationline[1]', 'copy', 'after', 'PP_specificationlines');"><img src="/images/1/icons/add.gif" /></span><br /> 
        <input id="specificationline[1]" type="input" name="specificationline[1][]" value="" /> 
    </span> 
</div>


zou het ophalen van het blok vanaf de server d.m.v. een ajax call beter zijn?

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • pingwings
  • Registratie: Mei 2009
  • Laatst online: 01-06 00:15
Prototype kan dit ook.

JavaScript:
1
2
3
4
5
6
var newNode = $('ParentNodeId').cloneNode(true);
$('parentVanParentNodeId').insert(newNode);
var childNodes = newNode.childElements();
for(var i=0; i<childNodes.length; i++){
  //doe iets met je childnodes.
} 

[ Voor 9% gewijzigd door pingwings op 19-07-2009 09:39 . Reden: insert vergeten. ]


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
pingwings schreef op zondag 19 juli 2009 @ 09:38:
Prototype kan dit ook.

JavaScript:
1
2
3
4
5
6
var newNode = $('ParentNodeId').cloneNode(true);
$('parentVanParentNodeId').insert(newNode);
var childNodes = newNode.childElements();
for(var i=0; i<childNodes.length; i++){
  //doe iets met je childnodes.
} 
maar dan moet je alsnog recursie toepassen om alle elementen te doorlopen binnen de nieuwe node

het komt er overigens op neer dat ik toch een ajax request moet doen, ik moet teveel parameters steeds wijzigen (bij het clonen) om dat in 1 nette functie te trappen

[ Voor 15% gewijzigd door wboard op 20-07-2009 11:38 ]

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 18:02
Bosmonster schreef op donderdag 16 juli 2009 @ 22:30:
Of het jezelf een stuk makkelijker maken en een library pakken die dit allemaal xbrowser en zo efficient mogelijk voor je afhandelt :)

jQuery:
JavaScript:
1
$('#specifications>span');


Klaar is Kees.
Volgens mij haal je nu alleen de span-elementen op. TS wil, als ik het goed lees, ALLE elementen met een ID. En als ik het even snel bekijk zijn de selectors van Prototype vrijwel gelijk aan die van jQuery.

[ Voor 10% gewijzigd door wackmaniac op 20-07-2009 11:59 ]

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

wackmaniac schreef op maandag 20 juli 2009 @ 11:58:
[...]

Volgens mij haal je nu alleen de span-elementen op. TS wil, als ik het goed lees, ALLE elementen met een ID. En als ik het even snel bekijk zijn de selectors van Prototype vrijwel gelijk aan die van jQuery.
Ik ging er even vanuit dat ie alle spans die direct onder specifications staan op wilde halen, aangezien die de losse specifications aanduiden. (En dan merk ik maar even niet op dat dat qua semantiek natuurlijk niet helemaal correct is)

Maar goed, mocht je alle elementen met een ID willen hebben:

JavaScript:
1
$('#specifications>*[id]');

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 18:02
Bosmonster schreef op maandag 20 juli 2009 @ 12:01:
[...]


Ik ging er even vanuit dat ie alle spans die direct onder specifications staan op wilde halen, aangezien die de losse specifications aanduiden. (En dan merk ik maar even niet op dat dat qua semantiek natuurlijk niet helemaal correct is)

Maar goed, mocht je alle elementen met een ID willen hebben:

JavaScript:
1
$('#specifications>*[id]');
Dit gaat volgens mij nog steeds maar 1 niveau diep (zowel met Prototype en Jquery even snel geprobeerd). Ik vrees dat je toch vast gaat zitten aan recursie.

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

wackmaniac schreef op maandag 20 juli 2009 @ 13:43:
[...]


Dit gaat volgens mij nog steeds maar 1 niveau diep (zowel met Prototype en Jquery even snel geprobeerd). Ik vrees dat je toch vast gaat zitten aan recursie.
Vervang de > door een spatie 8)

Zijn gewoon standaard CSS-selectors.

[ Voor 5% gewijzigd door Bosmonster op 20-07-2009 13:46 ]


Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 18:02
You are right, problem solved:

JavaScript:
1
2
3
$$('#specifications *[id]').each( function( element ) {
    // doe je ding met element
});

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
nice! dat kan ik goed gebruiken en is toch een stukje korter, desalniettemin moet ik nog meer parameters wijzigen als ID, dus ik haal het blokje nu gewoon van de server af met de juiste parameters...

thanks

A smooth sea never made a skilled sailor

Pagina: 1