webForumDet fria alternativet

Lägga till/tabort tr vid upp/ned

JavaScriptur Javascript

10 svar · 293 visningar · startad av Jesper T

Medlem sedan nov. 20017 144 inlägg
Frågan#1

Kryptisk rubrik?

Det är så att jag har en tabell med olika poster och i en kolumn så har jag en knapp för "flytta upp" respektive "flytta ned". Men problemet är att om jag vill flytta upp samma post flera gånger så måste jag flytta musen upp eller ned.
Då var tanken att om jag flyttar upp en post så skall en rad läggas till nere och virse versa.
Tips?

<table>
<tr>
<td>Post 1</td><td>[FONT=wingdings]òñ[/FONT]</td>
</tr>

<tr>
<td>Post 2</td><td>[FONT=wingdings]òñ[/FONT]</td>
</tr>

<tr>
<td>Post 3</td><td>[FONT=wingdings]òñ[/FONT]</td>
</tr>
</table>
Medlem sedan dec. 20025 483 inlägg
#2

Lite osäker på hur du menar, men:

<script type="text/javascript">

var trs = [],
    posts;

function initRows() {
    var pNodes = posts.childNodes,
	elm;

    trs.length = 0;

    outer:
    for (var i = 0; (elm = pNodes[i]); ++i) {
	switch (elm.nodeName) {
	    case "TBODY":
	    {
		var eNodes = elm.childNodes,
		    tElm;

		for (var j = 0; (tElm = eNodes[j]); ++j) {
		    switch (tElm.nodeName == "TR") {
			case true: trs.push(tElm); break;
		    }
		}

	    } break outer;

	    case "TR": trs.push(elm); break;
	}
    }
}

function move(obj, where) {
    var tr = 0;

    while (tr = obj.parentNode) {
	if (tr.nodeName == "TR") break;
	obj = obj.parentNode;
    }

    var iLen = trs.length,
	elm;

    outer:
    for (var i = 0; (elm = trs[i]); ++i) {
	if (tr == trs[i]) {
	    if ( (i == 0 && where == "up") || (i + 1 == iLen && where == "down"))
		return;

	    var cTr   = tr.cloneNode(true),
		tbody = posts.getElementsByTagName("TBODY").item(0),
		index = where == "up" ? 1 : -1;

	    tbody.replaceChild(cTr, trs[i - index]);
	    tbody.replaceChild(trs[i - index].cloneNode(true), tr);

	    break outer;
	}
    }

    initRows();
}

window.onload = function() {
    posts = document.getElementById("posts");
    initRows();
}

</script>

<table border="1" id="posts">
    <tr>
	<td>Post 1</td>
	<td>
	    <button type="button" onclick="move(this, 'up')">Flytta upp</button>
	    <button type="button" onclick="move(this, 'down')">Flytta ned</button>
	</td>
    </tr>

    <tr>
	<td>Post 2</td>
	<td>
	    <button type="button" onclick="move(this, 'up')">Flytta upp</button>
	    <button type="button" onclick="move(this, 'down')">Flytta ned</button>
	</td>
    </tr>

    <tr>
	<td>Post 3</td>
	<td>
	    <button type="button" onclick="move(this, 'up')">Flytta upp</button>
	    <button type="button" onclick="move(this, 'down')">Flytta ned</button>
	</td>
    </tr>
</table>

:q

Medlem sedan nov. 20017 144 inlägg
#3

Bra försök... ;)
Men låt säga att jag vill flytta "post 1" längst ned så måste jag "följa efter" med musen till "våningen under" osv.
Därav tanken med att om jag klickar på "flytta ner" så skall en rad undertill byggas på och virse versa. Så att jag kan stå still med pekaren.

Medlem sedan dec. 20025 483 inlägg
#4

Fortfarande osäker på hur du menar :e Kan du tänka dig att visa hur du hade tänkt att resultatet skall bli, visuellt, om jag t.ex. flyttar ned den första posten ett steg?

:)

Medlem sedan nov. 20017 144 inlägg
#5

Skickar en liten länk med en animation.
http://member.webforum.nu/Jesper T/pek.gif
:e
Som du ser så flyttas hela tabellen...

Medlem sedan dec. 20025 483 inlägg
#6

Ah, ok. Vad händer om det är 2 134 poster? Skall de försvinna utanför fönstret, eller är det få poster det handlar om?

:)

Medlem sedan nov. 20017 144 inlägg
#7

Tänkte att tabellen skall ligga i ett scrollbart lager.

Medlem sedan nov. 20017 144 inlägg
#8

Kanske bara kan ändra style.top?

Medlem sedan nov. 20017 144 inlägg
#9

Försöker att göra något sådant här:

function move(where){
var myTop=document.getElementById("posts").style.top.split("px")[0];
	if(where=="up"){
		document.getElementById("posts").style.top=(myTop+15)+"px";
	}else{
		document.getElementById("posts").style.top=(myTop-15)+"px";
		}
};

Men det funkar inte så bra med negativa tal.

Medlem sedan nov. 20017 144 inlägg
#10

Bahhh. Glöm detta inlägg. Fixar det med serverside....
Tack Peter S och andra.

Medlem sedan dec. 20025 483 inlägg
#11

Ursäkta dröjsmålet Jesper. Visst går det bra att använda style.top, testa följande:

<script type="text/javascript">

var trs = [],
    posts;

function initRows() {
    var pNodes = posts.childNodes,
	elm;

    trs.length = 0;

    outer:
    for (var i = 0; (elm = pNodes[i]); ++i) {
	switch (elm.nodeName) {
	    case "TBODY":
	    {
		var eNodes = elm.childNodes,
		    tElm;

		for (var j = 0; (tElm = eNodes[j]); ++j) {
		    switch (tElm.nodeName == "TR") {
			case true: trs.push(tElm); break;
		    }
		}

	    } break outer;

	    case "TR": trs.push(elm); break;
	}
    }
}

function move(obj, where) {
    var tr = k = 0;

    while (tr = obj.parentNode) {
	if (tr.nodeName == "TR") break;

	k += obj.offsetHeight;
	obj = obj.parentNode;
    }

    var iLen = trs.length,
	elm;

    outer:
    for (var i = 0; (elm = trs[i]); ++i) {
	if (tr == trs[i]) {
	    if ( (i == 0 && where == "up") || (i + 1 == iLen && where == "down"))
		return;

	    var cTr   = tr.cloneNode(true),
		tbody = posts.getElementsByTagName("TBODY").item(0),
		index = where == "up" ? 1 : -1;

	    tbody.replaceChild(cTr, trs[i - index]);
	    tbody.replaceChild(trs[i - index].cloneNode(true), tr);

	    if (where == "up") {
		posts.style.top = (parseInt(posts.style.top) || 0) + k + "px";
	    }
	    else {
		posts.style.top = (parseInt(posts.style.top) || 0) - k + "px";
	    }

	    break outer;
	}
    }

    initRows();
}

window.onload = function() {
    posts = document.getElementById("posts");
    initRows();
}

</script>

<div style="border:2px solid; overflow:auto; height:100px">
<table id="posts" style="position:relative">
    <tr>
	<td>Post 1</td>
	<td>
	    <button type="button" onclick="move(this, 'up')">Flytta upp</button>
	    <button type="button" onclick="move(this, 'down')">Flytta ned</button>
	</td>
    </tr>

    <tr>
	<td>Post 2</td>
	<td>
	    <button type="button" onclick="move(this, 'up')">Flytta upp</button>
	    <button type="button" onclick="move(this, 'down')">Flytta ned</button>
	</td>
    </tr>

    <tr>
	<td>Post 3</td>
	<td>
	    <button type="button" onclick="move(this, 'up')">Flytta upp</button>
	    <button type="button" onclick="move(this, 'down')">Flytta ned</button>
	</td>
    </tr>

    <tr>
	<td>Post 4</td>
	<td>
	    <button type="button" onclick="move(this, 'up')">Flytta upp</button>
	    <button type="button" onclick="move(this, 'down')">Flytta ned</button>
	</td>
    </tr>
</table>
</div>

:)

133 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)