Avatar billede Slettet bruger
02. august 2005 - 15:27 Der er 19 kommentarer og
1 løsning

Hjælp med insertBefore

Hej, jeg har fundet denne kode (Fundet på eksperten.dk)
Koden er perfekt til mit formål, bare ud over at det ligger i en tabel. Så jeg vil høre om der er nogen der kan lave en kode der gør det samme, men ligger det i en div/font/h(1-7) eller lign

Koden ser således ud:

<style type="text/css">
td{border:1px solid #500;}
</style>
<script type="text/javascript">
var numrows = 12;
var actRow = lastRow = 0;

function addDeleteRow(){
  var tbl = document.getElementById('chatTable');
  if(actRow+1==lastRow+numrows){
    var delrow = document.getElementById('row' + lastRow++);
    tbl.removeChild(delrow);
  }
  var addrow = document.getElementById('row' + actRow++);
  var newrow = document.createElement('TR');
  newrow.id = "row" + actRow;
  tbl.insertBefore(newrow,addrow);
  var newcell = document.createElement('TD');
  newrow.appendChild(newcell);
  newcell.innerHTML = actRow + ". række";
}
</script>

<button onclick="addDeleteRow();">Tilføj række</button>
<table><tbody id="chatTable">
  <tr id="row0">
    <td>Den første række</td>
  </tr>
</tbody></table>
Avatar billede olebole Juniormester
02. august 2005 - 18:04 #1
<ole>

Hvad er det, du ønsker?

/mvh
</bole>
Avatar billede Slettet bruger
02. august 2005 - 18:12 #2
altså at det ikke er i en table, men bare en div, da der kommer for meget mellemrum mellem de nye linier. Og så skal den nyeste være øverst (ligesom i koden)

Skal jeg formulerer mere, eller?? (Er ikke så god til at forklare ;)..)
Avatar billede Slettet bruger
02. august 2005 - 19:20 #3
ok jeg prøver en anden fremgangs metode.
Jeg har en kode som tilføjer en ny linie i en div, men den laver den nyeste nederst, og det er det jeg vil ha lavet om (med noget insertBefore)
Her kommer koden:

<div id="Beskeder"></div>
<script type="text/javascript">

function Skrivbesked(Beskeden) {
var Besked=document.createElement('DIV')
Besked.innerHTML=Beskeden
document.getElementById("Beskeder").appendChild(Besked);

    }
</script>
Avatar billede skovenborg Nybegynder
02. august 2005 - 20:07 #4
Da appendChild per definition indsætter "barnet" som det sidste i rækken er det meget logisk, at outputten bliver sådan. DOM har midlertidig netop en insertBefore funktion, som gør det muligt at omgå det problem:
<script type="text/javascript">

function Skrivbesked(Beskeden) {
var Besked=document.createElement('DIV');
Besked.appendChild(document.createTextNode("Besked"));
document.body.insertBefore(Besked,document.getElementById("Beskeder"));
    }
</script>
Avatar billede Slettet bruger
02. august 2005 - 20:19 #5
hmm den skriver den altså stadig under :(
Avatar billede skovenborg Nybegynder
02. august 2005 - 20:52 #6
hmm, ja jeg har åbenbart brugt insertBefore forkert i den sammenhæng. Kan ikke lige finde ud af hvordan det løses i lige det script, men vi kunne jo skifte lidt strategi:
<div id="Beskeder"></div>
<script type="text/javascript">
function Skrivbesked(Beskeden) {
var Besked=document.createElement("DIV");
Besked.appendChild(document.createTextNode(Beskeden));
var parentNode = document.getElementById("Beskeder");
parentNode.insertBefore(Besked,parentNode.firstChild);
    }
</script>
<form>
<textarea name="tekst"></textarea>
<input type="button" value="Tilføj" onclick="Skrivbesked(this.form.tekst.value);">
</form>

Her bruges div'en med id'en Beskeder som pladsholder for de forskellige beskeder du indsætter. I dette tilfælde fungerer insertBefore som vi vil ha' det.
Avatar billede Slettet bruger
02. august 2005 - 20:58 #7
Ahh nice, kan du eventuelt lave det så det virker med html?
Avatar billede skovenborg Nybegynder
02. august 2005 - 22:13 #8
hvad mener du med virker med html? Hvis du vil indsætte html-kode, så kunne du jo evt. bare gå tilbage og bruge innerHTML istedet for createTextNode metoden. Den brugte jeg bare for at være lidt på forkant med fremtidens xhtml2 hvor innerHTML og andet ikke standardhalløj ikke blive blive understøttet.
Avatar billede Slettet bruger
02. august 2005 - 23:52 #9
hmmm det virker ikke, dette:
Besked.appendChild(document.innerHTML(Beskeden));
Avatar billede olebole Juniormester
03. august 2005 - 02:28 #10
<ole>

Hvis andet argument i insertBefore har værdien null, tilføjes elementet i første argument som den første childNode til objektets element. I modsat fald tilføjes det før elementet i andet argument:

<script type="text/JavaScript">
function insMsg() {
    var cont, msg, dv, tx;
    cont = document.getElementById("beskeder");
    msg = document.getElementById("besked").value;
    dv = document.createElement("div");
    tx = document.createTextNode(msg);
    dv.appendChild(tx);
    cont.insertBefore(dv, cont.firstChild);
}
</script>

<input id="besked" type="text">
<button onclick="insMsg()">Indsæt</button>
<div id="beskeder"></div>

/mvh
</bole>
Avatar billede Slettet bruger
03. august 2005 - 02:44 #11
øhhh, tak, tror jeg nok?
Men ved du hvordan jeg få den til at udskrive html´en som html og ikke som tekst.

Dette virker ikke:
Besked.appendChild(document.innerHTML(Beskeden));
Den ser således ud rigtigt:
Besked.appendChild(document.createTextNode(Beskeden));
Avatar billede olebole Juniormester
03. august 2005 - 02:52 #12
- men "kan du eventuelt lave det så det virker med html?" tyder på, du har misforstået det at arbejde med DOM  :)
Når man manipulerer dokumentets DOM, arbejder man med alle dokumentets bestanddele som selvstændige noder. I den forbindelse kan man ikke bruge HTML i form af tekststrenge.

Til gengæld kan man lave en slags template sytem, hvor man kloner en større HTML-struktur og indsætter tekststrenge med DOM:

<script type="text/JavaScript">
function insMsg() {
    var cont, msg, nvn, tr, tx;
    cont = document.getElementById("beskeder");
    msg = document.getElementById("besked").value;
    nvn = document.getElementById("navn").value;
    tr = document.getElementById("trTmpl").cloneNode(true);
    tr.id = "";
    tx = document.createTextNode(nvn);
    tr.firstChild.appendChild(tx);
    tx = document.createTextNode(msg);
    tr.childNodes[1].appendChild(tx);
    cont.insertBefore(tr, cont.firstChild);
}
</script>

<table cellspacing="4" cellpadding="10" border="1">
<tr>
    <th>Navn</th>
    <th>Besked</th>
</tr>
<tbody id="beskeder"></tbody>
</table>

<hr>
Navn: <input id="navn" type="text" value="OleBole"><br>
Besked: <input id="besked" type="text">
<button onclick="insMsg()">Indsæt</button>

<div style="display:none">
    <table>
    <tr id="trTmpl">
        <td></td>
        <td></td>
    </tr>
    </table>
</div>

På den måde slipper man for at skrive en kode på længde med en halv Koran og Det Nyt Testamente for at oprette en bunke elementer - og fylde dem med tekst. HUSK, at en ID altid skal være unik i dokumentet, hvorfor alle ID'er i din template skal ændres til en tom streng - eller en unik ID - når der klones.

Dette er blot et simpelt eksempel, men det kan udbygges på mange måder - alt efter opgaven  :)
Avatar billede olebole Juniormester
03. august 2005 - 03:05 #13
Problemet er nok, at du har fat i den helt forkerte ende af dit projekt  :)

Når man skriver en script-chat, har man gang i at skrive noget af det aller mest resourcekrævende, man overhovedet kan belaste en server med ... hvorfor det i øvrigt er svært at finde en udbyder, der tillader den slags  ;o)

Det er meget vigtigt at hvert kald til serveren, belaster så lidt, som overhovedet muligt. Derfor sender man _kun_ rå data frem og tilbage - f.eks. i form af XML. Du skal under alle omstændigheder foretage al HTML-formatering på klienten ... endelig ikke på serveren.

Derudover bør du sørge for, at du kun lader brugern hente de beskeder, han endnu ikke har set - f.eks. ved hjælp af et timestamp, der enten sendes med frem og tilbage, eller lægges i en cookie.

Til sidst er det vigtigt at din DB er optimeret og indekseret i forhold til dine SQL-kald - som naturligvis også skal være top-tunet ... f.eks. har du forhåbentlig ingen *'er i dine kald, vel?  ;o)

Sprog som ASP og PHP er i virkeligheden komplet uegnede til chat-applikationer - men hvis man insisterer på at skrive én, skal men _virkelig_ holde tungen lige i munden  :)
Avatar billede Slettet bruger
03. august 2005 - 03:15 #14
Du har ret i, at jeg er igang med at lave en chat, og det virker perfekt, men den udskriver det som ren tekst, og det ser dumt ud, jeg bruger både <b> og forskellige farver :(
Avatar billede Slettet bruger
05. august 2005 - 01:54 #15
nå, men når ingen svarer må jeg finde ud af det på anden vis.
Hvis i vil ha points så lav et svar.
Avatar billede roenving Novice
05. august 2005 - 07:13 #16
Du har det vel som en rimelig fast skabelon, så kan det jo ikke tage så lang tid at lave en funktion, som genskaber den funktionalitet, du ellers har lavet i det serverside script !-)
Avatar billede Slettet bruger
05. august 2005 - 14:20 #17
Mit problem er bare at jeg ikke aner noget som helst om Javascript, jeg kan kun asp/php html og css :( så aner ikke hvordan jeg skal lave det til mit behov :(
Avatar billede roenving Novice
06. august 2005 - 02:28 #18
-- hvis du kan lave det i php er der en chance for at du kun skal ændre nogle objekt-referencer for at få det til at fungere i javascript !-)
Avatar billede Slettet bruger
06. august 2005 - 09:47 #19
hele chatten er lavet i asp, da det er mit hoved sprog, men det virker også, udover lige at den ikke viser feks <b></b> som html men bare som text :(
Avatar billede Slettet bruger
09. april 2006 - 11:30 #20
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester