ugrás a tartalomhoz

Ajax oldal betöltése után scriptek nem futnak

aspirany · 2008. Júl. 24. (Cs), 21.22
Sziasztok!

A probléma Ajax-al hívok be egy oldalt div-be

A betöltés után nem élnek a scriptjeim.Próbáltam úgy is hogy lokálissan beraktam az oldalba, de ezután sem megy.

Hol a hiba?

1 <html>
<script></script>
stb
<div>Ajax oldal</div>

Ajax oldal
<html>
stb...
tartalom click nem megy

2 <html>
<script></script>
stb
<div>Ajax oldal</div>

Ajax oldal
<html>
<script></script>
stb...
tartalom click így sem megy

köszönöm a segítséget
 
1

link?

solkprog · 2008. Júl. 24. (Cs), 21.49
Nem akarsz adni egy linket?
Egyébként azt a sok html elemet nem értem. Teljes forráskódot töltesz be ajax-al? (html elemtől elkezdve a záró html elemig betöltőd?)

üdv:
Balázs
2

igen

aspirany · 2008. Júl. 24. (Cs), 21.51
igen betöltöm az összes adatot; nincs kint élesben.
3

Nem túl egészséges.

solkprog · 2008. Júl. 24. (Cs), 22.01

<html>
	<script></script>
	<body>
		<html>
			<script></script>
			<body></body>
		</html>
	</body>
</html>
Szerintem ez nem túl egészséges. Elvileg egy html nyitó, és záró elem lehet csak a forrásban (iframe-et leszámoljuk).
Szerintem azt töltsd be ami valóban változik. (magyarán div-eket, span-eket tartalmazó adatot kérjél le)

üdv:
Balázs
4

magyarázat

aspirany · 2008. Júl. 24. (Cs), 22.09
Szóval adott egy form ami több funkciót lát el attól függöen hogy milyen paramétert kap.
de a lényeg hogy adatokat rögzítenek vele.Ebben van a javascript ami az ajax hívás után már nem működik.
nem találja a funkciókat

Van egy másik form amiben a paramétereket állítom. pl ID dátum ezeket átadom Ajaxba maj postolva betöltöm

a divbe

Tehát az egész formot újra töltöm a kapott paraméterek alapján.
5

Demo

solkprog · 2008. Júl. 25. (P), 12.19
Légyszíves csinálj egy leegyszerűsített demot a programodból és töltsd fel valahova.
Mert forráskód nélkül csak elbeszélünk egymás mellett.

üdv,
Balázs
6

okés feltöltva

aspirany · 2008. Júl. 25. (P), 14.42
www.spg.hu/ajax/1.html

amokor a calendar 1 betöltődik az input mezőbe kattintva egy naptárnak kellene előjönnie.

Ez a calendar egy nagyobb formban kellene hogy működjön amit ajaxal töltök be.
7

window.onload

solkprog · 2008. Júl. 25. (P), 18.19
Vedd ki azt sort ahol a naptár kreálod le window.onload eseményből és akkor jó lesz. (Ahogy néztem amikor lefog futni az a kódrészlet akkor már eleve kész lesz a oldal)

Lehet csak a demo miatt volt de:
Amikor bezáródik a naptár akkor azt valóban tüntesd el a kódból, ne csak display:none adj neki. Azért mondom mert ha az user 10 szer módosítja a dátumot akkor 11 szer fogja a kód létrehozni a naptárt, csak az első 10 nek display:none lesz a stílusa. De nyilván az volna szép ha eleve nem készítenél mindig új naptárt hanem az előzőt használnád, ezzel rögtön elejét vennéd annak hogy teleszemeled a html forrást.

Másik hogy légyszíves ne légy lusta:
<script>
helyet írd ki rendesen:
<script language="javascript" type="text/javascript">
(de ha valóban csak a demo miatt volt akkor elnézést, és vedd úgy hogy nem szóltam)

üdv,
Balázs
8

most igy néz ki

aspirany · 2008. Júl. 25. (P), 20.06
<script language="javascript" type="text/javascript">  

var cal1;

var dateFrom = null;
var dateTo = null;


cal1 = new dhtmlxCalendarObject('calInput1');







</script>


<p>    You can attach calendar to input object.1</p>
<table >
   <tr>
   
    <td valign="top"><strong>Click in a text fild</strong><br />
<input type="text" id="calInput1" style="width: 200px; font-size:12px;" readonly="true">
</td>
  </tr>
 
 
</table>


sajna nem fut
9

nem úgy nézz ki

solkprog · 2008. Júl. 25. (P), 21.00
Nálam most a kódod így néz ki:

<script language="javascript" type="text/javascript">  
	var cal1;
	var dateFrom = null;
	var dateTo = null;
</script>
(Rengetek sortöréssel a végén de nem ez a lényeg, hanem hogy a cal1 = new dhtmlxCalendarObject('calInput1'); sor nincs benne.) Legalábbis a firebug-om nem látja...

tipp: Töröld a sütiket hátha az miatt van az hogy nem azt látod amit én. (Egyébként a fenti kódoddal nála működött. Csak hát ahogy én látom nem az van a szerveren.)

üdv,
Balázs
10

köszi

aspirany · 2008. Júl. 25. (P), 21.14
igen mert a próbáltam úgy is hogy a call bent van de nem mük ,próbálom

köszi

valami nem ok nálam. visszaraktam a callt nem okés + cache ürit + süti ürit firebug mutatja hogy ok a cal1 bent van

lehet pofátlan?

átküldenéd a nálad levő xmlhttp.js + a html filéket
11

firebug

solkprog · 2008. Júl. 25. (P), 21.25
Átküldeném de firebugal írtam át a kódot. De holnapra/holnap megnézem localhoston is.

üdv,
Balázs
12

ha itt ülnél

aspirany · 2008. Júl. 25. (P), 21.28
ha itt ülnél melettem nem hinnéd el vissza raktama a hiányzo cal1 részletet és nem megy.

Nálad meg megy. az általam megadott linkről futtatod? gondolom igen :)

probálom IE6 és firefox 3 de nem ok
13

jelenleg nálam se jó.

solkprog · 2008. Júl. 25. (P), 21.33
Most nálam se jó. Látom hogy ott a sor de fáradt vagyok most nekiállni debuggolni.

Szerkesztve: Nem hagyott nyugodni. Nem kezdi el értelmezni a javascript kódot. (rakj bele egy alert ot a szerveren és elvileg meglátod). Viszont ha firebug-al elkezdem szerkeszteni (akárcsak egy entert rakod bele) akkor már értelmezni. Na mármost ez nem megoldás, ezért azt tanácsolom hogy a <script> részt JavaScriptből készítsd el ajax híváskor és utána csak a magát a js forrást ad hozzá a már html ben lévő <script> elemhez.
Elvileg így már jó kell legyen bár, az még zavar hogy a <script> elemet vagy a <head>-ba vagy a <body> elebe szokták beágyazni nem <div> ekbe. De ettől függetlenül szerintem értelmeznie kéne ott is.

Szerkesztve2: Cseréld meg a scriptet meg a táblázatot (ajax válaszban).

üdv,
Balázs
14

köszönöm

aspirany · 2008. Júl. 25. (P), 21.37
reménykedhetek hogy holnapra sikerül. anyit válltoztattam hogy a fuss script hivóját kivettem az ajánlat keres után.annyit megtennél hogy ránézel most
15

igazad van

aspirany · 2008. Júl. 25. (P), 22.14
berktam az enert és lám mük. közben megcseréltem a táblát és a scriptet. de nem mük ha nincs enter
16

magyarázat

jaczkog · 2008. Júl. 26. (Szo), 01.45
Hi

Attól hogy egy div innerHTML tulajdonságát megváltoztatod és írsz bele valami szöveget meg script-et, miért várod el, hogy a script lefusson?
Ki mondta, hogy ennek így kell működnie?
getElementById('inside').innerHTML = "<script>alert('valami')</script>";
Ez miért kellene hogy kiírjon bármit is?

Ha az xmlHttpRequest-től visszakapott adatok függvényében valamit futtatni akarsz, szerintem tedd meg akkor amikor azokat visszakapod.

Ui: Ha a firebug-ban átírod a forrást ("beleraksz egy enter-t"), újra feldolgozza a HTML-t, amiben már ott a script és ezért fut le. Nagyon jó dolog a firebug, de ne hagyjátok hogy becsapjon benneteket, és elhitesse hogy ez a normális működés.
17

példa

aspirany · 2008. Júl. 26. (Szo), 02.16
tudnál egy példát írni amire gondolsz köszi
18

nem tőlem kérded de

solkprog · 2008. Júl. 26. (Szo), 08.29
próbáld ezt lefuttatni:

document.body.innerHTML='<script>alert("ok")</script>';
A </script> nél megáll a tudomány. A te eseted ennél becsapósabb de nem ez a lényeg. Hanem hogy ezzel szemben a:

var newelement=document.createElement('script');
newelement.innerHTML='alert("ok");';
document.body.appendChild(newelement);
Már szépen lefut. (elvileg)

De ezt írtam a 13. bejegyzésemben (első szerkesztés után) hogy így add hozzá a js-t a html hez.
jaczkog: Valóban most bedőltem a firebug szép ruhájának és ezért kicsit félre is vezettem a kérdezőt emiatt. Elnézést tőle.

üdv,
Balázs
21

hiba

jaczkog · 2008. Júl. 26. (Szo), 11.49
Az első kódban azért áll meg a tudomány, mert a HTML parser a </script> string-et a scriptet lezáró HTML tag-nek értelmezi, és leszarja, hogy idézőjelben/aposztrófban van.
A másik hozzászólásomban láthatod, hogy ezt milyen trükkel szokás megkerülni.
Más kérdés, hogy még soha nem volt rá szükségem. Szerintem a szöveg kiíratás nem erre való.
26

tudom ám.

solkprog · 2008. Júl. 26. (Szo), 19.46
Tudom hogy az első kódom miért nem fut le. Csak gondoltam nem kell megmagyarázzam hogy miért nem nem jó. (hiába na lustaság nagy úr..)
A másik kódom meg nem kell megkerülni csak kijavítani. Lásd a másik hozzászólásom

üdv,
Balázs
19

példa

jaczkog · 2008. Júl. 26. (Szo), 11.34

<body>
<div id="inside">&nbsp;</div>

<script type="text/javascript" language="javascript">
obj = document.getElementById('inside');

obj.innerHTML = "<scr" + "ipt>alert(1)</scr" + "ipt>";

document.write("<scr" + "ipt>alert(2)</scr" + "ipt>");

var scriptElement = document.createElement('script');
scriptElement.innerHTML = "alert(3)";
document.body.appendChild(scriptElement);

var scriptElement2 = document.createElement('script');
scriptElement2.src = "alert4.js";
document.body.appendChild(scriptElement2);

</script>
</body>
Ahogy megbeszéltük, az alert(1) nem fut le.
Talán az alert(2) a legegyszerűbb. (És nem mellékesen működik.)
Az alert(3), amit solkprog javasolt nem csúnya megoldás, de most kipróbáltam és IE6 alatt nem működik. (Vagy csak nálam van valami gebasz.)
A 4. megoldás állítólag működik, de túl macerás és lusta vagyok kipróbálni.

Ezekkel csak az a baj, hogy a kérdező valószínűleg valami előre megírt AJAX lib-et használ, és nincs hatással a visszakapott szöveg kiírására. De ha nem is így van, akkor is nehéz elválasztani a ténylegesen kiírandó szöveget és a futtatni kívánt script-et.

A javaslatom az lenne, hogy minden ilyen spéci visszatérési értékű dologhoz írj külön függvényt:

function getSzoveg(obj)
{
	var xmlHttp = getXmlHttpObject();
	if (xmlHttp != null) {
		xmlHttp.open("GET", "ajax.php?action=getSzoveg");
		
		xmlHttp.onreadystatechange = function() {
			if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
				if (xmlHttp.responseText != 'false')
					obj.innerHTML = xmlHttp.responseText;
			}
		}
		xmlHttp.send(null);
	}
}

function getNaptarasCucc(obj)
{
	var xmlHttp = getXmlHttpObject();
	if (xmlHttp != null) {
		xmlHttp.open("GET", "ajax.php?action=getNaptarasCucc");
		
		xmlHttp.onreadystatechange = function() {
			if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
				if (xmlHttp.responseText != 'false') {
					obj.innerHTML = xmlHttp.responseText;
					
					
					/* ide jöhet bármi script */
					var cal1;

					var dateFrom = null;
					var dateTo = null;


					cal1 = new dhtmlxCalendarObject('calInput1');
					
					/* *** */
				}
			}
		}
		xmlHttp.send(null);
	}
}
Így értettem, hogy "akkor amikor visszakapod".
20

köszönöm

aspirany · 2008. Júl. 26. (Szo), 11.46
köszi kipróbálom, az a baj hogy jövőhéten szabi, de közben dolgozom ezen a témán ,lessz nálam laptop.

de ezt még ma lezongorázom

köszönöm hogy az idődból szántál rám pár percet.

egyébként

<link rel="STYLESHEET" type="text/css" href="calendar/dhtmlxcalendar.css">
<script src="calendar/dhtmlxcommon.js"></script>
<script src="calendar/dhtmlxcalendar.js"></script>

ezeket a külső fájlban helyezem el

aminek belül kéne lennie.

<script ....>
alert('ok')
cal_vasarlasido = new dhtmlxCalendarObject('cal_vasarlasido', false,{isMonthEditable: true,isYearEditable: true})
 cal_vasarlasido.loadUserLanguage('hu')_vasarlasido.setYearsRange(1900, 2500)
cal_vasarlasido.setOnClickHandler(vasarlasido)
cal_vasarlasido.draw()
  function vasarlasido(date) {document.getElementById('vasarlasido').value = cal_vasarlasido.getFormatedDate(null,date)document.getElementById('cal_vasarlasido').style.display = 'none'dateFrom = new Date(date)return true}

function showCalendar(calnev) {document.getElementById(calnev).style.display = 'block')
</script>
<form ...>
<table>

 
<div id="cal_vasarlasido" style="display:none; position:absolute;"></div><input type="text" name="vasarlasido" id="vasarlasido<?php echo $i;?>" readonly="true"><img onClick="showCalendar('cal_vasarlasido')" src="js/calendar/imgs/calendar.gif">  
 
</table>
</form>


több calendar elem van a formon
22

nincs mit

jaczkog · 2008. Júl. 26. (Szo), 12.07
Nem egyszerű a dolog, ilyen tervezést még nem láttam indokoltnak, de ez most nem erről szól.

Ha mindenáron a szerveroldalról szeretnél javascript-et küldeni, akkor sajnos neked kell értelmezni a responseText-et, és eldönteni hogy mit kell kiírni és mit kell futtatni a fent leírt módon.

Viszont ha lenne saját naptár cuccod, akkor az input mező onfocus / onclick eseményére kapásból be tudnád rakni a megfelelő dolgokat, nem kéne ilyen kötötten generálni a naptárat.

Én mindenképpen ez utóbbit választanám, már csak a kihívás kedvéért is. :)

Jobban belegondolva, lehet hogy ezzel is meg lehetne oldani, hogy minden naptárral kapcsolatos script-et onclick-be raksz. Talán ez lenne a legegyszerűbb.
23

azért

aspirany · 2008. Júl. 26. (Szo), 12.16
azért választottam a dhtmlx componenseket mert készen vannak, ha simán kell használni őket akkor egyszerű,kényelmes,de az AJAX-al nem számoltam.És ez csak az egyik rész, a másik van egy másik komponens a window ami modális abalakot készít (nagyon pöpec) bár a dhtmlgoodies nak is vannak ilyen jellegű cuccai , ott a naptár működött ajax-al ,
25

alert(3) kis módosítással tökéletes.

solkprog · 2008. Júl. 26. (Szo), 19.37
alert(1): Nálam nem jó.
alert(2): Működni működik de azt hiszem ezzel egyetértünk hogy ez nem túl szép módszer.
alert(3) ("megoldásom"): Át kell írni az innerHTML et text -re és jó lesz IE ben is.
alert(4): Szép megoldás és az is működik.

Bár annyira nem teszteltem le az "alert(3)" illetve "alert(4)" et de úgy vettem észre hogy nem zavar be a többi kód (html, stb) életébe.

üdv,
Balázs
27

kipróbáltam

aspirany · 2008. Júl. 27. (V), 01.12
function munkalap_onload()
{


if(ajaxRequest.readyState > 0 || ajaxRequest.readyState < 4)
{
/*var ajaxDisplay = document.getElementById('munkalapok');
ajaxDisplay.innerHTML = "<img src=loading.gif />";*/
 
}

if (ajaxRequest.readyState == 0 ||ajaxRequest.readyState == 4)
{
  params = "";
  ajaxRequest.open("POST","calendar1.html", true);
  ajaxRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  ajaxRequest.onreadystatechange = handleMunkalapMessages;
  ajaxRequest.send(params);
}

}
function handleMunkalapMessages()
{
if(ajaxRequest.readyState == 4 && ajaxRequest.status == 200)
{

//
var cal1, cal2, mCal, mDCal, newStyleSheet;
    //
var dateFrom = null;
var dateTo = null;

cal1 = new dhtmlxCalendarObject('calInput1');
}
}


hibával elszáll firefox
24

script dinamikus betöltése

Hodicska Gergely · 2008. Júl. 26. (Szo), 13.21
Elég sok módszer van arra, hogy egy scriptet dinamikusan tölts be. A legtöbb JS library nyújt erre megoldást, pl.: http://ajaxian.com/archives/getting-around-the-blocking-of-script. Ennek előnye, hogy egyből olyan megoldást nyújt, hogy a script betöltődésen nem blokkolja az egyéb elemek betöltődését. A témában kapcsolatban érdmes megnézni Steve Souders legújabb előadását: http://sites.google.com/site/io/even-faster-web-sites. Itt bemutat jópár lehetséges technikát, kiemelve mindegyiknek az előnyeit. Ezenkívül bemutatja a cuzillion, ami egy iszonyatosan hasznos eszköz azok kezében, akik frontenddel foglalkoznak.


Üdv,
Felhő
28

ajax fetcher

aspirany · 2008. Aug. 3. (V), 18.00
ajax fetcherrel működik,de ez mégsem olyan mintha én írtam volna

illetve a DHTMLX -esek válasza

The simple injecting html data in page will not execute code in script section ( at least not in FF )
You need to use any lib which can handle inline js in loaded code, or use your own custom code to resolve problem, something similar to next.

document.getElementById(obj).innerHTML = ajaxRequest.responseText;

var z = ajaxRequest.responseText.match(/<script[^>]*>[^\f]*?<\/script>/g);
if (z)
for (var i=0; i<z.length; i++){
if (window.execScript)
window.execScript(z[i].replace(/<([\/]{0,1})script[^>]*>/g,""));
else
window.eval(z[i].replace(/<([\/]{0,1})script[^>]*>/g,""));
}