Autor Zpráva
xxxObiWan
Profil
Ahoj,
mám dva soubory:

index.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <title>Ajax</title>
  <script type="text/javascript">
  // Vytvoření Ajax objektu
  if( window.ActiveXObject ){
      ajax = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else if(window.XMLHttpRequest){
          ajax = new XMLHttpRequest();
  }
          
  // Funkce ajaxPokus()
  function ajaxPokus(){
          ajax.open("POST", "stranka.htm", true);
          ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
          ajax.onreadystatechange = function(){
                                           document.getElementById("ajaxObsah").innerHTML = "loading...";
                                           if( ajax.readyState==4 ){
                                               if( ajax.status==200 ){
                                                   document.getElementById("ajaxObsah").innerHTML = ajax.responseText;
                                               }
                                               else{
                                                   document.getElementById("ajaxObsah").innerHTML = 'Chyba 404, soubor nenalezen.';
                                               }
                                           }
                                       };
          ajax.send();
  }  
  </script>
</head>
<body>

<a href="#" onClick="ajaxPokus();">Ajax zkouška</a>

<div id="ajaxObsah">
</div>

</body>
</html>


a stranka.htm, která se vkládá do index.htm pomocí ajaxu:
Obsah ze souboru stranka.php

<script type="text/javascript">
alert('Javascriptova hlaska!');
</script>



Problém: Text "Obsah ze souboru stranka.php" se pomocí ajaxu načte, vložený alert() se ale neprovede. Jak to udělat, aby se pomocí ajaxu načítaly kromě html i javascripty?
Moc díky :-)
Chamurappi
Profil
Reaguji na xxxObiWana:
Viz Ajax Request.
xxxObiWan
Profil
Moderátor Chamurappi: Přesunuto z Ajax Request.

Ahoj,
mám stejný problém, a tím je načítání javascriptů pomocí ajaxu. Při volání ajaxu teď z responseText pomocí reg.výrazů vytáhnu obsah <script></script> a pak ho spustím přes eval(). To sice funguje, ale problém je, že eval zřejmě neumí vytvářet nové funkce. Viz příklad:

index.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <title>Ajax</title>
  <script type="text/javascript">
  // Vytvoření Ajax objektu
  if( window.ActiveXObject ){
      ajax = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else if(window.XMLHttpRequest){
          ajax = new XMLHttpRequest();
  }
          
  // Funkce ajaxPokus()
  function ajaxPokus(){
          ajax.open("POST", "stranka.htm", true);
          ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
          ajax.onreadystatechange = function(){
                                           document.getElementById("ajaxObsah").innerHTML = "loading...";
                                           if( ajax.readyState==4 ){
                                               if( ajax.status==200 ){
                                                   document.getElementById("ajaxObsah").innerHTML = ajax.responseText;
                                                   
                                                   // Provedení javascripů
                                                   var scripts = ajax.responseText.replace(/\r/g, "");
                                                   scripts = scripts.replace(/\n/g, "");
                                                   scripts = scripts.replace(/^.*<script type="text\/javascript">(.*)<\/script>.*$/im, "$1");
                                                   eval(scripts);
                                               }
                                               else{
                                                   document.getElementById("ajaxObsah").innerHTML = 'Chyba 404, soubor nenalezen.';
                                               }
                                           }
                                       };
          ajax.send();
  }  
  </script>
</head>
<body>

<a href="#" onClick="ajaxPokus();">Ajax zkouška</a>

<div id="ajaxObsah">
</div>

</body>
</html>


stranka.htm
<span onClick="nactenyJs();">Obsah ze souboru stranka.php</span>

<script type="text/javascript">
alert('Prvni alert!');

function nactenyJs(){
        alert("Druhy alert!");
}
</script>


Po načtení souboru stranka.htm přes ajax se první alert provede, druhý alert (po kliku na určený text) už ale ne. Konzole hlásí, že funkce nactenyJs() neexistuje. Problém je stejný ve FF i v IE. Nevíte někdo jak to udělat, aby to fungovalo jak má? Moc díky ;-)



EDIT: Tak jsem trochu googlil a testoval a na něco jsem přišel. Funkce nactenyJs() se sice vytvoří, ale jen uvnitř funkce eval. Je to jakoby lokální funkce, která zvenku evalu nejde vidět.
1 - Nějaké nápady?
2 - Jak vytvořit globální funkci, nebo aspoň globální proměnnou uvnitř funkce?
3 - Existuje v JS něco jako příkaz "global" ?
4 - Jde k lokálním funkcím přistupovat přes nějaké ukazatele? Něco jako:
ajaxJs = eval(scripts); 
ajaxJs->nactenyJs();  //provedení lokální funkce
xxxObiWan
Profil
Díky, napsal jsem upravený dotaz (s některýma mojima novýma poznatkama) tam, ale pochybuju že mi tam někdo odpoví. To téma už je tak zapadlé, že tam určitě nikdo nechodí...

Moderátor Chamurappi: To téma teď viděl kvůli tobě každý a řada lidí bude zbytečně přemýšlet nad původním dotazem (třebaže je podobný). Neposílal jsem ti ten odkaz proto, abys tam zopakoval otázku, ale proto, abys odtamtud vyčetl odpověď. Tohle už víckrát nedělej.
xxxObiWan
Profil
Moderátor Chamurappi: Přesunuto z Ajax Request.

Tak už jsem na to přišel (po hodině googlení na anglických fórech). Funkce vytvořená přes eval se musí uložit do proměnné, aby byla přístupná i zvenku:

Opravená stranka.htm
<span onClick="nactenyJs();">Obsah ze souboru stranka.php</span>

<script type="text/javascript">
alert('Prvni alert!');

nactenyJs = function(){
        alert("Druhy alert!");
}
</script>

...tohle už fungovat bude ;-)
xxxObiWan
Profil
Tak jsem zase narazil na problém :-(

Z neznámého důvodu, nedokáže eval zpracovat vytvoření více jak jedné funkce. Když v souboru stranka.htm vytvořím dvě js funkce:
<div onClick="alert2();">Druhy alert</div>
<div onClick="alert3();">Treti alert</div>

<script type="text/javascript">
alert('Prvni alert!');

alert2 = function(){
        alert("Druhy alert!");
}

alert3 = function(){
        alert("Treti alert!");
}
</script>

...kód nebude fungovat. Dokonce se neprovede ani první alert!

Prosím o návrhy jak to řešit..
Chamurappi
Profil
Reaguji na xxxObiWana:
Ta konstrukce, kterou sis našel, požírá konce řádků, takže se celý obsah <script> naskládá do jednoho řádku. Za přiřazení funkce do proměnné patří středník. Ten při klasickém odřádkování není povinný, proto ti to v normální stránce funguje.
xxxObiWan
Profil
Moc díky, nevěděl jsem jak napsat ten regulární výraz aby zahrnoval i konce řádků, tak jsem to obešel takhle. V javascriptech zatím nejsem moc zkušený :-) S těma středníkama mi to už funguje ;-)
Chamurappi
Profil
Reaguji na xxxObiWana:
nevěděl jsem jak napsat ten regulární výraz aby zahrnoval i konce řádků
Vyměň „.*“ za „(.|\r|\n)*“.

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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