Avatar billede default Nybegynder
19. marts 2009 - 16:54 Der er 11 kommentarer og
1 løsning

Ajax tagwall, max 20 beskeder i diven.

Hej

Jeg har en ajax tagwall, som hver 6 sekund tilføjer de nyeste beskeder til en div. selve hver besked har jeg sat ind i en div.

<div id=\"beskeder\"></div> er der hvor jeg indsætter de nye til beskeder

document.getElementById(\"beskeder\").innerHTML = http.responseText+document.getElementById(\"beskeder\").innerHTML;

Sådan smider jeg beskeder ind i den div. hver besked ser sådan her ud <div id="$row[id]">BESKEDEN</div>

Er der nogen form for mulighed for at lave sådan at der max kan være 20 beskeder i den div? Hvor den så sletter de nederste beskeder når der kommer for over 20?
Avatar billede default Nybegynder
19. marts 2009 - 21:25 #1
Kan også definere det på en anden måde

Jeg har en div der sersådan her ud

<div>
<div id="1">Hej med jer BESKED</div>
<div id="2">Hej med jer BESKED</div>
<div id="3">Hej med jer BESKED</div>
<div id="4">Hej med jer BESKED</div>
<div id="5">Hej med jer BESKED</div>
</div>

hvis så der bliver tilføjet en <div id="5">HEJ med jer besked</div> mere så skal den slette den anden / ældste / nederste med id="5". Er dette muligt?
Avatar billede default Nybegynder
19. marts 2009 - 21:27 #2
eller bare lave sådan at der max kan være 5 <div id="xx"></div> inde i <div></div>

Den skal selvf slette de ældste først.
Avatar billede olebole Juniormester
20. marts 2009 - 09:26 #3
<ole>

At bruge innerHTML til indsættelse af HTML elementer, hører til i 1990'erne. I moderne kode som f.eks. Ajax bruger man DOM - f.eks. document.createElement, document.createTextNode og ELEMENT.appendChild.

At generere HTML'en på serveren bruger desuden i allerbedste tilfælde 4-5 gange så mange resourcer - hvilket ikke ligefrem er noget, man sigter efter med kald hvert 6. sekund  ;o)

/mvh
</bole>
Avatar billede default Nybegynder
20. marts 2009 - 14:26 #4
Er det svært at bygge et system om til DOM?
Avatar billede default Nybegynder
20. marts 2009 - 15:05 #5
Min nuværende ajax script
<script language="JavaScript" type="text/javascript">
    function getXMLHTTPRequest() {
        try {
            req = new XMLHttpRequest();
        }
        catch(err1) {
            try {
                req = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (err2) {
                try {
                        req = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                catch (err3) {
                    req = false;
                }
            }
        }
        return req;
    }

    var http = getXMLHTTPRequest();
    var http2 = getXMLHTTPRequest();
    function sendText() {
    if(document.getElementById("tekst").value.length != 0) {
            var beskeder = document.getElementById('tekst');       
        var modurl = "send.php?text="+escape(beskeder.value)+"&til="+document.getElementById('til').value+"";
        http2.open("GET", modurl, true);
        http2.onreadystatechange = handleText2;
        http2.send(null);
        document.getElementById("tekst").value = "";
               
}
    }
    function getText() {
        var modurl = "get.php";
        http.open("GET", modurl, true);
        http.onreadystatechange = handleText;
        http.send(null);
    }

    function handleText() {
        if (http.readyState == 4) {
                document.getElementById("beskeder").innerHTML = http.responseText+document.getElementById("beskeder").innerHTML;
            }
        }
    }
   
    var timeoutId = 0;
    function main() {
        getText();
        timeoutId = setTimeout("main()", 6000);       
    }
</script>
Avatar billede olebole Juniormester
21. marts 2009 - 17:25 #6
Der er ikke noget, der er svært, hvis man kan - men man skal som udgangspunkt være ret stærk i bl.a. JS og DOM. Ajax er ikke noget, du lærer på en weekend  =)

Til en begyndelse skal du ikke formatere data som HTML på serveren. De skal formateres som JSON (JavaScript Object Notation) eller XML. Om JSON:
    http://json.org

- og en lille artikel, jeg har skrevet om JS-arrays og -objects kan måske også hjælpe på forståelsen:
    http://www.eksperten.dk/guide/227

Jeg har ingen idé om, hvad det helt præcist er, du skal gøre - og agter heller ikke at gøre det for dig - men jeg kan vise dig et lille eksempel på principperne.

Hvis vi forudsætter, vi har en DB-tabel med brugere, som vi gerne vil vise i et HTML-dokument, kunne det gøres noget i stil med dette:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>AJAX med JSON - http://www.eksperten.dk/spm/868810</title>
<style type="text/css">
html, body {
    height: 100%;
    margin: 0;
    padding: 0;
    font: 0.85em verdana, tahoma, sans-serif;
}
</style>
<script type="text/javascript">
// XMLHttpRequest wrapper - http://www.dengodekode.dk/artikler/ajax/xmlhttprequest_wrapper.php
(function(){if(window.XMLHttpRequest)return;var o=null,s,a=["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];for(var i=0,j=a.length;i<j;s=a[i],i++){try{if(o=new ActiveXObject(s))break}catch(e){}}window.XMLHttpRequest=o?function(){return new ActiveXObject(s)}:null;o=null})();

function showUsers() {
    var oHttp = new XMLHttpRequest();
    var aQuery = [];
   
    // Tag de par af argumenter, funktionen blev kaldt med
    // - og læg dem som kodede parametre i arrayet:
    for (var i=0,j=arguments.length; i<j; i+=2) {
        aQuery.push( encodeURIComponent(arguments[i]) +"="+ encodeURIComponent(arguments[i+1]) );
    }
   
    // Åben forbindelsen
    oHttp.open("post", "response.php", true);
   
    // Sæt en Content-Type header på requesten
    oHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
   
    // Kald insertUsers, når der er data
    oHttp.readystatechange = function() {
        if (oHttp.readyState<4) return;
        insertUsers(oHttp.responseText);
        oHttp = null;
    }
   
    // Send requsten
    oHttp.send( aQuery.join("&") );
}

function insertUsers(sResp) {
    // Opret et JS-object udfra JSON-strengen
    var oResp = eval("("+sResp+")");
   
    // Tjek for evt. serverfejl
    if (oResp.error) return alert("Der opstod en fejl: " + oResp.error);
   
    var oRow, aTd;
    // Gå users-arrayet igennem
    for (var i=0,j=oResp.users.length; i<j; i++) {
        // Opret en række ved at klone vores template
        oRow = oRowTempl.cloneNode(true);
        // Sæt en id på rækken
        oRow.setAttribute("id", "userID_"+oResp.users[i].id);
        // Find rækkens celler
        aTd = oRow.getElementsByTagName("td");
        // Udskift indholdet i cellerne i rækken
        aTd[0].firstChild.nodeValue = oResp.users[i].u_name;
        aTd[1].firstChild.nodeValue = oResp.users[i].sex;
        aTd[2].firstChild.nodeValue = oResp.users[i].birth;
        aTd[3].firstChild.nodeValue = oResp.users[i].address;
        // Indsæt rækken
        oUserBody.appendChild(oRow);
    }
}

// Bare en test funktion på onclick på rækkerne
function foo(oRow) {
    alert(oRow.getAttribute("id"))
}

var oUserBody = oRowTempl = null;
window.onload = function() {
    oUserBody = document.getElementById("userBody");
    // Opret en template af rækken i tbody-elementet 'userBody'.
    // Den skal senere klones og indsættes i 'userBody'.
    oRowTempl = oUserBody.getElementsByTagName("tr")[0];
    oUserBody.removeChild(oRowTempl);
}
</script>
</head>
<body>

<p><button onclick="showUsers('context', 'getUsers')">Show</button></p>

<table>
<thead>
<tr>
    <th>Navn</th>
    <th>Køn</th>
    <th>Fødselsdag</th>
    <th>Adresse</th>
</tr>
</thead>
<tbody id="userBody">
<tr onclick="foo(this)">
    <td>navn</td>
    <td>køn</td>
    <td>fødselsdag</td>
    <td>adresse</td>
</tr>
</tbody>
</table>

</body>
</html>

Hvor response.php ser sådan ud (MySQL-koden er skrevet som pseudokode. Personligt ville jeg bruge mysqli, men det er ikke væsentligt for forståelsen af princippet):

<?php
// Opret et tomt objekt, som vil indeholde returdata
$oJson = new stdClass();

/*
    Funktion, der henter brugere fra DB og lægger dem
    som et array af objekter på returobjektet $oJson
*/
function getUsers() {
    global $oJson;
   
    $oJson->users = array();
   
    // Udfør en query og hent de ønskede felter
    $result = [MYSQL_SELECT_QUERY - `id`, `u_name`, `address`, `sex`, `birth`];
    // Hent rækker som objekter (f.eks. med mysql_fetch_object)
    while ($row = [MYSQL_FETCH_OBJECT_FROM_QUERY]) {
        $oJson->users[] = $row;
    }
}

// Tjek, om der er sat en 'context'
if (isset($_POST["context"])) {
    // Vælg handling udfra 'context'
    switch ($_POST["context"]) {
        case "getUsers":
            getUsers();
        break;
       
        default:
            $oJson->error = "Unknown context: '".$_POST["context"]."'";
    }
}
else $oJson->error = "No context found";

// Dan en streng repræsentation af JSON-objektet
$sJson = json_encode($oJson);

// Sæt passende headers og udskriv JSON-strengen
header("Content-Type: application/json; charset=utf-8");
header("Content-Length: ".strlen($sJson));

print $sJson;
?>
Avatar billede olebole Juniormester
21. marts 2009 - 17:31 #7
Switchen i PHP-dokumentet giver mulighed for at sætte andre værdier af parametren context. Dermed kan du i dit Ajax-kald bestemme, hvilken PHP-funktion, der skal behandle forespørgslen.

Der findes hurtigere afviklende måder at indsætte elementerne med DOM, men eksemplet giver en idé om, hvordan du begynder med Ajax  ;o)
Avatar billede olebole Juniormester
26. marts 2009 - 23:18 #8
Kom du videre?
Avatar billede default Nybegynder
24. august 2009 - 20:49 #9
Kom ikke videre nej. Lukker
Avatar billede olebole Juniormester
24. august 2009 - 20:50 #10
- selvtak
Avatar billede default Nybegynder
24. august 2009 - 20:51 #11
Vil du have points?
Avatar billede olebole Juniormester
24. august 2009 - 21:05 #12
Du kunne i det mindste lige smide en lille tak, når der er folk, som ganske gratis investerer sin fritid i at hjælpe, når du beder om det
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