Autor | Zpráva | ||
---|---|---|---|
Senky Profil |
#1 · Zasláno: 14. 11. 2009, 16:24:52 · Upravil/a: Senky
Zdravím. Už dávno sa pokúšam urobiť konečne schopný skript, ktorý by posielal údaje v pozadí stránky. Vyrobil som si takýto skript a html:
<td id="level" <?php if( (isset($identification['identification']) and $identification['type'] == "chlvl") or (isset($identification['identification']) and $identification['type'] == "admin") ){ ?> onclick="getElementById('level').innerHTML='<input id=new_level type=text value=<?php echo $member_row['m_level']; ?> style=width:20px> <input type=button value=Save onclick=savelevel(<?php echo $member_row['m_id']; ?>, getElementById(new_level).value)>'" <?php } ?>><?php echo $member_row['m_level']; ?></td> Tie údaje okolo v php sú kontroly, či užívateľ môže meniť levely (ide o guild stránku). Skrip, ktorý som sa pokúsil urobiť podľa w3schools je: function GetXmlHttpObject() { if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari return new XMLHttpRequest(); } if (window.ActiveXObject) { // code for IE6, IE5 return new ActiveXObject("Microsoft.XMLHTTP"); } return null; } function savelevel (user_id, value) { var xmlhttp; xmlhttp=GetXmlHttpObject(); if (xmlhttp==null) { alert ("Your browser does not support XMLHTTP!"); return; } xmlhttp.onreadystatechange=function() { if(xmlhttp.readyState==4) { document.getElementById('new_level').value=xmlhttp.responseText; } } var url = '/savelevel.php'; url = url + '?id= ' + user_id; url = url + '&level = ' + value; xmlhttp.open('GET',url,true); xmlhttp.send(null); } No a konečne savelevel.php je: <?php include "common.php"; $m_id = $_GET['id']; $m_level = $_GET['level']; mysql_query("UPDATE members SET m_level='$m_level' WHERE m_id='$m_id'"); echo $m_level; ?> Čo mi to ale spraví je, že ak kliknem na level, zobrazí sa namiesto neho input s rovnakým levelom a vedľa neho button Submit. Zmením level a kliknem na button. V tom sa level zmení naspäť na starý a ak skúsim refreshnuť stránku, tak zistím, že sa skutočne nezmenil ani v databáze. Vedel by mi niekto poradiť čo je na ňom zlé alebo čo by sa dalo upraviť tak, aby to fungovalo? Skúšam to na locale, tak prepáčte, že nemôžem dať aj odkaz... Ďakujem vopred... |
||
Chamurappi Profil |
#2 · Zasláno: 16. 11. 2009, 01:03:11
Reaguji na Senkyho:
„prepáčte, že nemôžem dať aj odkaz“ Bez odkazu můžu jen hádat. PHP skripty jsou tady k ničemu, zajímal by mě jejich výstup, tedy to, co baští prohlížeč. Nelíbí se mi ten HTML kód, který uvádíš nahoře. Nevím, co z té zašmodrchané patlaniny po interpretaci PHP vznikne, ale volání funkce „getElementById('level')“ musí selhat, pokud nemáš nikde nadefinovanou svoji funkci „getElementById“. Nechtěl jsi volat spíš document.getElementById('level')? |
||
_es Profil |
#3 · Zasláno: 16. 11. 2009, 01:22:31
Chamurappi:
„‚getElementById('level')‘ musí selhat“ V atribúte onclick by to mohlo fungovať, no nie je to celkom isté chovanie. Senky: Nie je výsledkom toho PHP kódu, že niektorý atribút onclick obsahuje medzeru a teda by ho bolo treba uzavrieť do úvodzoviek alebo apostrofov (...onclick=savelevel(...)? |
||
Chamurappi Profil |
#4 · Zasláno: 16. 11. 2009, 10:27:13
Reaguji na _es:
„V atribúte onclick by to mohlo fungovať“ Máš pravdu. Tenhle implicitní „with“ u atributů je docela matoucí. Jestli to dobře chápu, tak atribut zachytávající událost se vnitřně překládá na něco jako: new Function("event", "with(document) with (this) { " + hodnotaAtributu + " }"); |
||
Časová prodleva: 4 dny
|
|||
_es Profil |
#5 · Zasláno: 20. 11. 2009, 18:58:26 · Upravil/a: _es
Chamurappi:
„... atribut zachytávající událost se vnitřně překládá na ...“ Ja to skôr chápem tak, že definícia onclick objektu element cez atribút (<element onclick="príkazy">) je analogická tomuto príkazu v globálnom kóde v JavaScripte: with(document)/* prípadné nejaké ďalšie príkazy with podľa prehliadača a elementu */with(element)onclick=function(){príkazy}; |
||
Leo Profil |
#6 · Zasláno: 20. 11. 2009, 19:15:00
Ja jsem dodnes zil v predstave, ze
<htmlelement onclick="js_kod"> je to same jako v js objecthtmlelementu.onclick = function(){js_kod} jake with? getElementById('level') fungovat bude pokud v okamziku kdy dojde k udalosti bude o tomto id prohlizec vedet. Krome toho existuje klicove slovo this. Leo |
||
_es Profil |
#7 · Zasláno: 20. 11. 2009, 19:23:53
Leo:
Nie je to celkom to isté: Toto bude fungovať: <p id=p1 onclick="alert(id);"> document.getElementById('p1').onclick = function(){alert(id);}; |
||
Leo Profil |
#8 · Zasláno: 20. 11. 2009, 22:31:46
Aha, pravda, ale nikdy me priznam se nenapadlo to takhle pouzivat. Kdyz uz, tak pouzivam this.id. O duvod vic onclick jako atribut nepouzivat. Leo
|
||
_es Profil |
#9 · Zasláno: 20. 11. 2009, 23:04:37 · Upravil/a: _es
Leo:
„O duvod vic onclick jako atribut nepouzivat“ Ostatné atribúty, obsahujúce kód JavaScriptu, majú rovnakú nevýhodu či výhodu z hľadiska prístupu k vlastnostiam objektov či globálnym premenným. Ak má takýto kód načítať nejakú globálnu premennú x, tak musí vždy najprv overiť, či taká vlastnosť x neexistuje v objekte príslušného elementu, prípadne nejakých ďalších objektov, a objektu document. A nestačí to overiť len pri definícii atribútu, lebo tie objekty sa môžu zmeniť aj neskôr. Preto budú ovládače, definované cez atribúty, menej výkonné, ako keby boli definované až v kóde JavaScriptu. |
||
Chamurappi Profil |
#10 · Zasláno: 20. 11. 2009, 23:23:59
Reaguji na Lea:
„Aha, pravda, ale nikdy me priznam se nenapadlo to takhle pouzivat.“ Zrovna dneska na tuto podivnou vlastnost narazil pan anonymní. Reaguji na _es: „je analogická tomuto príkazu v globálnom kóde v JavaScripte“ Minimálně v Mozille je navíc ještě předávaný argument „event“ (v Exploreru ne, tam je k dispozici globální window.event). „/* prípadné nejaké ďalšie príkazy with podľa prehliadača a elementu */“ Fakt? Existují ještě další výjimky? Jaké třeba? |
||
_es Profil |
#11 · Zasláno: 20. 11. 2009, 23:33:00 · Upravil/a: _es
Chamurappi:
„Fakt? Existují ještě další výjimky? Jaké třeba?“ Neviem, či si to správne pamätám, nemám tu tú knihu pri sebe, no Mozilla by mala tuším obsahovať všetky nadradené (obsahujúce daný element) elementy a pri formulároch by v tej postupnosti objektov mal byť, aj v iných prehliadačoch, prípadný objekt nadradeného formulára. „Minimálně v Mozille je navíc ještě předávaný argument ‚event‘“ Nenapadá má teraz, či by sa aj toto dalo simulovať nejakou úpravou v nejakom príkaze JavaScriptu. Doplnenie: Možno by to šlo vnorením ďalšieho with a definovaním funkcie simulujúcej nejakú vlastnosť - getter v Mozille - vyššie verzie JavaScriptu. Alebo nejakou fintou s vnorenými funkciami. |
||
Leo Profil |
#12 · Zasláno: 21. 11. 2009, 10:59:16
_es:
"Neviem, či si to správne pamätám, nemám tu tú knihu pri sebe, no Mozilla by mala tuším obsahovať všetky nadradené (obsahujúce daný element) elementy a pri formulároch by v tej postupnosti objektov mal byť, aj v iných prehliadačoch, prípadný objekt nadradeného formulára." Takže zmiňovaný Flanagan píše (kap. 19.1.6 Obor platnosti ovladačů událostí): "Přesná skladba řetězu oborů platnosti nebyla nikdy standardizována je závislá na implementaci. Netscape 6 a Mozilla sem zahrnují všechny kontejnerové objekty (i věci jako je značka div) zatímco IE6 zůstává u menší sady zahrnující cílový prvek plus kontejnerový prvek Form (pokud existuje) a objekt Document. Bez ohledu na konkrétní prohliížeč je koncovým objektem v řetězu oborů platnosti objekt Window [...]" Myslím, že jsem tuhle kapitolu nikdy za těch 7 let co knížku mám nečetl - na začátku jsem uposlechl autorova pokynu že je to složité a je možné to přeskočit, a pak už jsme si myslel, že vím, jak to funguje a neměl potřebu se k tomu vracet. Zvláštní, že mi to nikdy v praxi neházelo klacky pod nohy, zatímco jiní na tom zhavarují ve svých skriptech hned. Leo |
||
_es Profil |
#13 · Zasláno: 21. 11. 2009, 12:25:27
Leo:
„Zvláštní, že mi to nikdy v praxi neházelo klacky pod nohy“ Možno si mal len trochu šťastia, prípadne nepoužíval v definícii ovládačov cez atribúty skrátený zápis - namiesto window.open() len open(). Alebo nenazval globálnu premennú rovnako ako nejakú vlastnosť nejakého objektu v tej postupnosti objektov. |
||
Leo Profil |
#14 · Zasláno: 21. 11. 2009, 13:05:39 · Upravil/a: Leo
_es:
"Možno si mal len trochu šťastia, prípadne nepoužíval v definícii ovládačov cez atribúty skrátený zápis - namiesto window.open() len open(). Alebo nenazval globálnu premennú rovnako ako nejakú vlastnosť nejakého objektu v tej postupnosti objektov." Je to víc věcí: 1, postupně jsem přestal používat registraci ovladače přes atribut úplně 2, pokud jsem ji použil, pak jsem kod v atributu redukoval na volani funkce bez argumentu 3, pro nazvy promennych pouzivam ceska slova bez diakritiky (takze se nedostanu do konfliktu s nazvy atributu), pripadne identifikatory zacinajici podtrzitkem Leo |
||
Časová prodleva: 15 let
|
0