Autor Zpráva
peta
Profil
Nevim, kam to presne zaradit, narazil jsem ve FF (mozna i jinde) na takovy zajimavy problem, kdyz jsem experimentoval po case s ajaxem pomoci script tagu.
Neni mi uplne jasne, proc nejde menit src u tagu script, ale tag jde vypsat pomoci document.write. Pripadne, jestli nekde delam chybu?
<?php
if (isset($_GET['ip']))
    {
    header("content-type: application/x-javascript");
    $serverIP=$_SERVER['REMOTE_ADDR'];
    echo "document.write(\"Your IP address is: <b>" . $serverIP . "</b> all test\")";
    }
else
    {
    //header("content-type: text/html");
?>
Test ip check.
<br>* <script type="text/javascript" src="all.php?ip"></script> html - true
<br>* <script type="text/javascript" id="bbb" src="bbb"></script> script.src - false
<span id='aaa'></span>
<script type="text/javascript">
var url, str;
url = 'all.php?ip';
str = '<br>* <script src="' + url + '"><\/script>';
document.write(str + ' document.write - true');
document.getElementById('bbb').src = url;
document.getElementById('aaa').innerHTML = str + ' span.innerHTML - false';
document.write('<br><a href="' + url + '">' + url + '<\/a>');
</script>
<?php } ?>
_es
Profil
peta:
Z uvedeného kódu a popisu nie je celkom jasné, čo má byť „problém“, ani kde nastáva. Prečo posielaš prehliadaču takú divnú HTTP hlavičku pre JS (4.riadok), keď okrem toho by to podľa HTML kódu mal byť typ text/javascript?
peta
Profil
_es:
Aha. Ma to delat to, ze jak to vypise hvezdicky, tak vedle se ma objevit ip adresa na kazdem z tech ctyr radku. Ve dvou pripadech se nic neobjevi. On ten script se 2x zavola a 2x nee (zvyraznil jsem to v kodu, o ktere radky se jedna). Ten samy i s tou hlavickou, ktera se ti nelibi.
"content-type: application/x-javascript" - to jsem vygoogloval vcera priklad, kde to tak bylo a fungoval mi, tak jsem to neresil.
_es
Profil
peta:
A na adrese "bbb" je čo?
Pomocou vlastnosti innerHTML nejdú pridávať elementy script - to je známe.
peta
Profil
bbb je tam proto, ze to ve FF bez nej hlasi do konzoly error. Priklad jsem upravil, aby to bylo trosku jasnejsi, co kdy funguje.
<?php
if (isset($_GET['ip']))
    {
//    header("content-type: application/x-javascript");
    header("content-type: application/javascript");
    $serverIP=$_SERVER['REMOTE_ADDR'];
//    echo "alert(123);";
    echo "document.getElementById('uspech').innerHTML += '+';";
    $str = "\"Your IP address is: <b>" . $serverIP . "</b> (" . $_GET['ip'] . ") \"";
    if (in_array($_GET['ip'],array(3)))
        {
        $str = "document.getElementById('cc').innerHTML = $str;";
        }
    else    {
        $str = "document.write($str)";
        }
    echo $str;
    }
else
    {
    //header("content-type: text/html");
?>
<body>
<div id="uspech"></div>
Test ip check.
<br>* <script src="all.php?ip=1" type="text/javascript"></script> html - true
<br>* <script src="x" id="bbb" type="text/javascript"></script> script.src - false, IE9 true
<br>* <span id="cc"></span><span id="cccc"><script id="ccc" type="text/javascript"></script></span> script.src DOM, IE8+ - false (funguje innerHTML, ale odmita document.write)
<span id='aaa'></span>
<script type="text/javascript">
var url, str;
url = 'all.php?ip=';
str = '<br>* <script src="{url}" type="text/javascript"><\/script>';
document.write(str.replace("{url}",url+5) + ' document.write - true');
document.getElementById('bbb').src = url+2;
document.getElementById('aaa').innerHTML = str.replace("{url}",url+4) + ' span.innerHTML - false';

var a, b, c;
c = document.getElementById('ccc');
b = document.getElementById('cccc');
a = document.createElement("SCRIPT");        
a.setAttribute("type","text/javascript");                
a.setAttribute("id","ccc");
a.setAttribute("src",url+3);    //Varování: Volání document.write() z asynchronně nahraného externího skriptu bylo ignorováno.
//b = document.getElementsByTagName('BODY')[0];
if (a == null) {               
   b.appendChild(a);
} else {
   //c.parentNode.removeChild(c); 
   b.replaceChild(a, c);
}

//document.write('<br><a href="' + url + '">' + url + '<\/a>');
</script>
</body>
<?php } ?>
_es
Profil
peta:
Cez innerHTML externý JS skript do dokumentu naozaj nepridáš.

Varování: Volání document.write() z asynchronně nahraného externího skriptu bylo ignorováno.
Viď aj Časté potíže, zajímavosti a poučné debaty » Psaní metodou document.write po načtení stránky maže stránku.

Čo keby si z toho chaotického kódu ten „problém“ nejako vyextrahoval na jeden či dva riadky kódu?
peta
Profil
_es:
Ale, ten problem je v tom, ze nefunguje vsech 5 pokusu a document.write v tom jednom pokusu hlasi error. kazdy ten pokus se v javascriptu zapisuje jinak. Dobre, ozelme document.write a innerHTML. Pak zbyva jeste
document.getElementById('bbb').src = url+2; FF nic, IE funguje
Proc to ve FF nefunguje?
A, co kdyz neozelim document.write? Muj script je na konci stranky a jeste se nedokoncil, stranka neni zavrena, ne? Ikdyz, tohle je sporne, on nastavi src, ukonci se a <script> uz pak natahuje kod nezavisle. Tim bych si to vysvetlit dovedl, ale nemam dukazy.

Vypis, ktery ten program udela ve FF (localhost://), vypada asi takto (zjistovani IP je jen testovaci php kod, jak uz jsem psal, co jsem si cely priklad zkopiroval nekde z webu a upravil):
+++
Test ip check.
* Your IP address is: 127.0.0.1 (1) html - true
* script.src - false, IE9 true
* Your IP address is: 127.0.0.1 (3) script.src DOM, IE8+ - false (funguje innerHTML, ale odmita document.write)
* span.innerHTML - false
* Your IP address is: 127.0.0.1 (5) document.write - true 
_es
Profil
peta:
A, co kdyz neozelim document.write? Muj script je na konci stranky a jeste se nedokoncil, stranka neni zavrena, ne?
No ale na rozdiel od skriptu „na pevno“ v HTML kóde je to načítane asynchrónne - čo ak by sa načítal skript až po uzavretí stránky? Zákazom document.write vlastne prehliadač zabraňuje ťažko odhaliteľnej náhodnej chybe. Metóda document.write slúži na vloženie nejakého obsahu do vstupu HTML parsera počas vytvárania celej stránky - teda za koniec už vytvoreného obsahu. Ty sa nejako snažíš cez tú metódu vložiť nejaký obsah doprostred stránky - teda ti to logicky nefunguje. Ak chceš upraviť už vytvorený obsah, použi iné metódy na to určené.
Prečo dávaš skriptom atribúty ako src="bbb" či src="x"? Asi na tých adresách nie je žiadny obsah a prehliadač musí čakať, až server vráti nejakú chybovú správu.
peta
Profil
_es: [#5] Protoze mi konzola hlasi chybu. Nemuzes ladit javascript, kdyz mas konzolu plnou chybovych hlaseni. Mam pocit, ze jeden z tech prikladu nefungoval, pokud nebylo src nadefinovane. Naprosto nelogicky hlasil error, ze src neexistuje.
_es
Profil
peta:
Protoze mi konzola hlasi chybu.
Čiže chybu „opravíš“ tak, že ju nahradíš inou chybou... Akú vlastne chybu? V akom prehliadači? Skúšal som v rôznych prehliadačoch
<!doctype html><meta charset="utf-8"><script id=x></script> a ani v jednom nevznikla v chybovej konzole v dôsledku toho nejaká chyba.
peta
Profil
_es: Tak si nastav vetsi citlivost, treba na warningy. Co ja s tim, ja potrebuji videt vsechno.
Joker
Profil
peta [#11]: Ani mně to nevypsalo žádnou chybu jakékoliv úrovně v žádném prohlížeči, kde jsem to zkoušel.

Ve kterém prohlížeči kód z [#10] generuje nějakou chybu?
_es
Profil
peta:
si nastav vetsi citlivost, treba na warningy
V ktorom konkrétnom prehliadači spôsobí súbor s uvedeným HTML kódom ([#10]), pri nejakej špeciálnej „citlivosti“, nejaký záznam v jeho chybovej konzole?
peta
Profil
_es: Kod v #10 mi nevyhodil zadnou chybu. To jsem psal uz v #9.
_es
Profil
peta:
Kod v #10 mi nevyhodil zadnou chybu. To jsem psal uz v #9.
Nemohol si v #9 vedieť, že ti kód v #10 „nevyhodil“ chybu. V čase snáď cestovať nevieš.

Prečo dávaš skriptom atribúty ako src="bbb" či src="x"?“ ([#8]) (Iná otázka tam nie je.)
- „Protoze mi konzola hlasi chybu.“„...jeden z tech prikladu nefungoval, pokud nebylo src nadefinovane. Naprosto nelogicky hlasil error, ze src neexistuje.“ (peta [#9])
Takže aká konzola v akom prehliadači ti hlási na neexistujúci atribút src v elemente script nejakú chybu?
peta
Profil
_es: A jo, to se ptal Joker, ohledne kodu 10 :)
Momentalne mi to nehlasi FF nehlasi. Jenze mezitim, dva dny zpet, jsem udelal update prohlizece. Ale samozrejme to mohlo byt zpusobene i jinou casti kodu, kterou uz jsem smazal. V kazdem pripade je to pro mne nezajimave a offtopic, abych to zpetne zjistoval.
Joker
Profil
peta:
V kazdem pripade je to pro mne nezajimave a offtopic, abych to zpetne zjistoval.
Mám za to, že podstatu problému řeší _es [#4] a zbytek diskuse byl o tom, jestli má smysl do elementu <script> dávat nesmyslný src, aby tam byl alespoň nějaký. Čili závěr je, že nemá.
_es
Profil
Joker:
podstatu problému řeší _es [#4]
A ešte to, že nemá zmysel v asynchrónne načítanom skripte používať metódu document.write - preto aj Firefox túto metódu v tomto prípade preventívne blokuje.
Joker
Profil
_es:
To jsem právě myslel.

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: