Autor Zpráva
opicak
Profil
Dobrý den, chtěl bych se zeptat, zda neznáte řešení tohoto kódu, bez použití funkce eval. Chtěl bych podotknout, že toto je jen příklad. Důvodem, proč to řeším tímto způsobem je, že z databáze vypisuji několik řádku a potřebuji, aby každý řádek byl v novém divu. V mém případě nelze použít innerHTML.

<script>
    function ajax(text)
    {
        var xml = new XMLHttpRequest();
        xml.open("GET", "test.php?text="+text);
        xml.onreadystatechange = function()
        {
            if(xml.readyState==4 && xml.status==200)
            {          
                eval(xml.responseText);
            }
        }
        xml.send(null);
        }
    }
</script>

test.php
echo "
  var div = document.createElement('DIV');
  div.innerHTML = '".htmlspecialchars($_GET["text"])."';
  document.getElementById('result').appendChild(div);
";
Someone
Profil
Jestli to chápu správně, tak to v souboru test.php vypadá nějak takto:

while($row = $sql->fetch_object()) {
    echo "
      var div = document.createElement('DIV');
      div.innerHTML = '".htmlspecialchars($_GET["text"])."';
      document.getElementById('result').appendChild(div);
    ";
}

Můžeš si data vypsat v JSONu a v javascriptu to projet cyklem:

//Test.php
$results = array();
$sql       = $mysqli->query("SELECT * FROM tabulka");
while($row = $sql->fetch_object()) {
    $results[] = $row;
}
echo json_encode($results);

//Javascript
<script>
    function ajax(text)
    {
        var xml = new XMLHttpRequest();
        xml.open("GET", "test.php?text="+text);
        xml.onreadystatechange = function()
        {
            if(xml.readyState==4 && xml.status==200)
            {          
                  var response = JSON.parse(xml.responseText);
                  for(var a=0;a<response.length;a++) {
                      var row = response[a];
                      var div = document.createElement('div');
                            div.appendChild(document.createTextNode(row.sloupecZDB));
                      document.getElementById('result').appendChild(div);
                  }
            }
        }
        xml.send(null);
        }
    }
</script>
opicak
Profil
Ptám se, protože jsem četl, že eval zpomaluje script.
Someone
Profil
opicak:
Je zbytečné eval používat. Proč si nevrátíš jen text, který chceš dát do divu a ten zpracuješ v js:
místo:
eval(xml.responseText);
takhle:
var div = document.createElement('div');
      div.append(document.createTextNode(xml.responseText));
document.getElementById('result').appendChild(div);
opicak
Profil
Ano, to jsem také chtěl udělat, ale chci každý řádek vypsat do divu. V tom případě by to znamenalo, že bych tam musel dát split řetězce, ale co kdyby nějaký sloupec v databázi obsahoval znak(řetězec), podle kterého rozděluju řetězec.

K tomu json, to se musí nainstalovat? Nemám s tímto zkušenosti.
Someone
Profil
opicak:
Udělej to tak, jak jsem psal v [#2]. V php si jednotlivé řádky z db uložíš do pole (řádek 5), poté to pomocí php funkce json_encode enkóduješ do JSON formátu, který umí JS zpracovat a vypíšeš (řádek 7). Tento text dostane JS script a rozparsuje ho pomocí vlastní funkce (řádek 10). No a pak ho už jen projedeš cyklem a vypíšeš viz. řádky 11-16.
opicak
Profil
Díky za pomoc, funguje to perfektně.
Chamurappi
Profil
Reaguji na Someone:
Objekt JSON nemá nativní podporu ve starších prohlížečích, použij eval("(" + xml.responseText + ")").
Podporu nativního XMLHttpRequestu jde v Explorerech vypnout a někteří lidé ji vypnutou mají.

jsem četl, že eval zpomaluje script
Proč jsi vůbec chtěl načítat skript AJAXem a ne jako <script>?

V mém případě nelze použít innerHTML.
Pročpak ne? Zřejmě proto, že by sis tím mohl rozbít zbytek obsahu elementu. To jde řešit snadno — vyrobit si při přijetí odpovědi ze serveru <div>, hodit do jeho innerHTML responseText a pak dokud má firstChild, volat s firstChildem appendChild na cílovém elementu.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0