Autor Zpráva
Senky
Profil
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
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
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
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 + " }");
_es
Profil
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};
A to asi so všetkými rovnakými nevýhodami, čo sa týka optimalizácií, ako pri použití príkazu with.
Leo
Profil
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
Leo:
Nie je to celkom to isté:
Toto bude fungovať:
<p id=p1 onclick="alert(id);">
No toto už fungovať nebude:
document.getElementById('p1').onclick = function(){alert(id);};
Leo
Profil
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
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
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
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
_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
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
_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

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: