webForumDet fria alternativet

Populera td genom clone() ?

JavaScriptur Javascript

8 svar · 973 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Tjena hej!

Med följande kod genererar jag en tabell utifrån ett json-objekt:

$.each(data.Result, function(x,y){
	$("<tr class=\"" + (x%2 == 0 ? "row-odd" : "row-even") + "\">\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"</tr>\n").appendTo('#Branches' + PhaseId + ' tbody');
});

Flera av dessa td's ska sedan innehålla en selectlista med ett flertal options. Json-objektet innehåller resp. rad's värde som ett tal. Detta för att inte behöva skicka hela selectlistan för varje rad med json.

Vad jag vill göra är alltså att:

  • Skriva ut en tabellrad.
  • Klona en selectlista som redan finns i koden.
  • Markera rätt Option för resp. rad

Jag har testat med bl.a.:

$.each(data.Result, function(x,y){
	$("<tr class=\"" + (x%2 == 0 ? "row-odd" : "row-even") + "\">\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"<td>" + $(".style").clone() + "</td>"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"<td></td>\n"
	 +"</tr>\n").appendTo('#Branches' + PhaseId + ' tbody');
});

Men det fungerar inte alls. Jag var inne på att sätta t.ex. klassnamn på varje td och sen klona select-listan, men det måste finnas något smidigare sätt!?

Tacksam för förslag!

Medlem sedan juli 2003555 inlägg
#2

Du håller på och grejjar med strängar, då får du hålla dig till strängar också. Byt $(".style").clone() mot $(".style").clone().wrap("<div />").parent().html()

(Sen föreslår jag att du cachar det där i en variabel innan loopen. Kan också vara en idé att bygga alltihopa programmatiskt direkt i DOM istället för att klistra strängar.)

[edit]
Btw, titta på http://stackoverflow.com/questions/2419749/get-selected-elements-outer-html
[/edit]

Medlem sedan juni 20019 519 inlägg
#3

som onkelborg skriver så behöver du hämta ut HTML koden inte en jQuery referens (du bör få [object Object] eller något liknande i din HTML markup nu. Sen vill du nog undvika att köra appendTo för många gånger. skrev om den lite:

var str = [],
	styleHTML = $(".style").clone().wrap("<div/>").parent().html();

$.each(data.Result, function(x,y){
	str.push('<tr class="' + (x%2 == 0 ? 'row-odd' : 'row-even') + '">');
	str.push('<td></td>');
	str.push('<td></td>');
	str.push('<td>' + styleHTML + '</td>');
	str.push('<td></td>');
	str.push('<td></td>');
	str.push('<td></td>');
	str.push('<td></td>');
	str.push('<td></td>');
	str.push('</tr>');
});

$(str.join()).appendTo('#Branches' + PhaseId + ' tbody');
Medlem sedan feb. 20034 441 inlägg
#4

Jag har fått till det nu så att det skrivs ut en select på rätt rad. Jag lyckas däremot inte att sätta "rätt" <option> som selected.

$.each(data.Result, function(x,y){
	if(y.Distance != 0){
		$('.style option[value=' + y.Distance + ']').attr("selected", "selected");
	}
	Distance = $(".style").clone().wrap("<div/>").parent().html();

	Res.push("<tr class=\"" + (x%2 == 0 ? "row-odd" : "row-even") + "\">\n");
        Res.push("<td>" + Distance + "</td>\n");
	// ...
});
$(Res.join()).appendTo('#Branches' + PhaseId + ' tbody');

Det som händer just nu är att <select>-listan som jag klonar, den som ligger i en dold div i headern, får rätt värde, men den klonade listan får inte någon selected alls.

Vad är fel?

Medlem sedan juni 20019 519 inlägg
#5
Distance = $(".style").clone().wrap("<div/>").val(y.Distance).parent().html();

borde fungera

Medlem sedan feb. 20034 441 inlägg
#6

Nej, nu händer inget alls.

Medlem sedan feb. 20034 441 inlägg
#7

Här är "all" kod:

<div style="display: none;>
	<select class="style large">
	<?php foreach($style_list as $key => $item){?>
	<option value="<?php echo $item['value'];?>"><?php echo $item['name'];?></option>
	<?php }?>
	</select>

	<!-- här kommer fler selectlistor senare... -->
</div>

...

<script type="text/javascript">
JSON = [
	{
	"hasError":false,
	"msgError":[],
	"Result":[
		{"Id":"2738","Parent":"294","Distance":2,"Pool":"2","Gender":"1","MinAge":"1","MaxAge":"99","Order":"1"},
		{"Id":"2739","Parent":"294","Distance":2,"Pool":"2","Gender":"2","MinAge":"1","MaxAge":"99","Order":"2"}
		]
	}
]

function(data){
	$.each(data.Result, function(x,y){
		Dist = $(".style").clone().attr("id", "foo" + y.Id).wrap("<div/>").parent().html();

		Res.push("<tr class=\"" + (x%2 == 0 ? "row-odd" : "row-even") + "\">\n");
		Res.push("<td></td>\n");
		Res.push("<td>" + Dist + "</td>\n");
		//...
		Res.push("</tr>\n");
	});
	$(Res.join()).appendTo('#Branches' + PhaseId + ' tbody');
}
</script>

Om nu "Dist" är en sträng måste jag väl ange vilken option som ska vara selected innan jag klonar obj? Just nu får varje select ett eget ID, så det fungerar, men lyckas inte få rätt selected.

Såfort jag löst det här kommer "Pool" och "Gender" också vara varsin select, så det blir i slutändan mer kod än såhär.

Medlem sedan juni 20019 519 inlägg
#8

http://jsbin.com/ekuxik/ kanske?

Medlem sedan feb. 20034 441 inlägg
#9

Japp! Tack!

142 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
139 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)