Autor Zpráva
Cakewalk
Profil
Dobrý den,
předem upozorňuji, že JavaScriptu moc nerozumím. Mám modul který mi otáčí na stránkách náhodně vybrané zboží.
Na zkušebním webu jede vše bez problémů, ale na provozním hlásí chybu "document.getElementById má hodnotu null nebo není objekt".

Toto JavaScript, který hlásí chybu na řádku 34:

var xmlHttp

 function showUser(auction_id)
{ 
    xmlHttp=GetXmlHttpObject()
        if (xmlHttp==null)
            {
                alert ("Browser does not support HTTP Request")
                return
            }
            
 var url="rotate.php?auction_id="+auction_id

     xmlHttp.onreadystatechange=stateChanged 
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
}

 function stateChanged() 
    { 
        if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
            { 
                var update = new Array();
                if(xmlHttp.responseText.indexOf('||' != -1)) 
                    {
                        update = xmlHttp.responseText.split('||');
      
                         var half= update.length /2;
        
                         for (i=0;i<=update.length-1 ;i++)
                            {
                                if(i<half){
                                    
                                     document.getElementById(update[i]).innerHTML = update[half+i];
                                }
                     
                             }
                    }
            } 
    }

 function GetXmlHttpObject()
    {
        var xmlHttp=null;
        try
            {
                // Firefox, Opera 8.0+, Safari
                xmlHttp=new XMLHttpRequest();
            }
    catch (e)
        {
         //Internet Explorer
         try
              {
                  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
              }
    catch (e)
        {
              xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
          }
    }
return xmlHttp;
}

Nevíte, kde mám hledat podstatu chyby? Díky
Chamurappi
Profil
Reaguji na Cakewalka:
Element s daným ID neexistuje. Proto document.getElementById vrací null.
Cakewalk
Profil
Díky za reakci. To mě právě mate, protože existuje. Navíc přesně toto běží na zkušební webu a v pořádku. Porovnával jsem všechny kódy a jsou shodné.
Zkusil jsem to i na čisté instalaci systému bez jakýchkoliv změn a samozřejmě funguje.
Může získání ID bránit nějaký jiný kód? Např. jiný JavaScript?


Můžeš porovnat:
www.homebazar.cz

aukce.allelektro.cz
_es
Profil
Cakewalk:
if(xmlHttp.responseText.indexOf('||' != -1))
?

protože existuje
Zisti si najprv, aký argument predávaš metóde document.getElementById, teda akú má vtedy hodnotu výraz update[i].
Cakewalk
Profil
Na tvůj otazník neumím odpovědět. Tento script jsem nevymýšlel, je to koupený modul.

Měl jsem za to, že tato metoda zjišťuje interval otáčení, ale jak tak na to koukám, jsem dost vedle. Jak mám tedy zjistit hodnotu výrazu?

JavaScript neovládám!!!


Myslím si, že ale nebude chyba v kódu. Pokud to jinde běží, tak bych typoval na něco, co se s tím bije.
_es
Profil
Cakewalk:
je to koupený modul
Prečo to nereklamuješ?

Na tvůj otazník neumím odpovědět.
V dokumentácii Mozilly si môžeš pozrieť, aký má byť argument, vnútorná pravá zátvorka asi patrí inde.

Jak mám tedy zjistit hodnotu výrazu?
Dáš na dané miesto trebárs alert(výraz); a po otestovaní to zase zmažeš.
Cakewalk
Profil
No zkusil jsem to reklamovat u autora (z Litvy) a bez odezvy. Respektive odezva byla s tím, že jaký je problém, když to vlastně všude jinde funguje :(

Toto zkusím a uvidíme. Zatím díky.


Tak jsem opravil podle dokumentace „if(xmlHttp.responseText.indexOf('||' != -1))“ na „if(xmlHttp.responseText.indexOf('||') != -1)“

Nicméně na zkušebním webu, kde script běží bez chyby to žádný vliv na klíčení hrachu nemělo. Na provozním webu se již chyba neobjevuje, ale script stejně nejede.
_es
Profil
Cakewalk:
No zkusil jsem to reklamovat u autora (z Litvy) a bez odezvy. Respektive odezva byla s tím, že jaký je problém, když to vlastně všude jinde funguje :(
A skúsil si ho požiadať, aby sa ti pozrel na to, či si to nejako nesprávne neimplementoval, respektíve neokopíroval? Čo ti mal asi tak napísať, ak ho asi informoval, že to „nejako nefunguje“? Ak tam je jedna taká chyba v zátvorkách, tak tam bude možno podobných chýb viac. Ten „koupený modul“ je čo? Ten externý skript alebo JS kód vložený do HTML? Má snáď nejakú dokumentáciu, tak to podľa nej skontroluj.
Cakewalk
Profil
Naiplementované je to správně. Celý modul se skládá ze dvou samostatných scriptů (JS a PHP) + několik řádků kódu, které se vkládali do scriptů systému.
V implementaci chyba není. Je to přesně podle zadání a pokud to na jiných webech funguje, tak asi v tom provedení chyba není.

Přes dokumentaci (jestli se to tak dá nazvat) to bylo kontrolované snad tisíckrát, i když na těch pár řádcích toho moc ke zkontrolování není.

Modul má dělat následující. Pokud je v administraci nastavená 0 v intervalu otáčení, tak zůstává zachovaný obsah přední stránky (jedné tabulky). Pokud je nastavený interval, tak se tabulka nahradí právě tabulkou z přiloženého scriptu a v zadaný interval se otáčí zobrazené zboží.
Když tak nad tím uvažuji, tak se po opravě podle rady script tváří, že je zadaný interval 0?!

Pro jistotu:

JavaScript je výše

PHP

<?php
if(empty($_SERVER['HTTP_REFERER'])) exit;
session_start();


 include('includes/global.php');
include('language/english/site.lang.php');

 $item= new item();


 $auction_id=htmlentities($_GET["auction_id"], ENT_QUOTES);

 $id_array = explode(",",$auction_id);
$number = count($id_array);


 $values=mysql_query("SELECT A.auction_id, A.start_price,  A.currency, A.name, A.max_bid, A.end_time, AM.media_url
        FROM " . DB_PREFIX . "auctions A
        LEFT JOIN " . DB_PREFIX . "auction_media AM ON AM.auction_id=A.auction_id
        WHERE
        A.closed=0 AND A.active=1 AND A.approved=1 AND A.deleted=0 AND A.creation_in_progress=0 AND
        A.list_in!='store' AND A.hpfeat=1
        GROUP BY A.auction_id 
        ORDER BY RAND() LIMIT 0," . $number);
        

        
 foreach($id_array as $value){
    $spans.='featured_picture_'.$value.'||featured_title_'.$value.'||featured_details_'.$value.'||';
}

 while($item_details = mysql_fetch_array($values)){

     $auction_link = process_link('auction_details', array('name' => $item_details['name'], 'auction_id' => $item_details['auction_id']));
    
     $image_link = '<a href="'.$auction_link.'"><img src="'.((!empty($item_details["media_url"])) ? 'thumbnail.php?pic=' . $item_details["media_url"] . '&w=' . $layout['hpfeat_width'] . '&sq=Y' : 'themes/' . $setts['default_theme'] . '/img/system/noimg.gif').'" border="0" alt="'.$item_details['name'].'"></a>';
    

     $details = 
    "<b>".MSG_START_BID.":</b> ".$fees->display_amount($item_details['start_price'], $item_details['currency'])."<br>".
    "<b>".MSG_CURRENT_BID.":</b> ".$fees->display_amount($item_details['max_bid'], $item_details['currency'])."<br>".
    "<b>".MSG_ENDS.":</b> ".show_date($item_details['end_time']); 
    
     $spans.=$image_link.'||<a href="'.$auction_link.'">'.$item_details["name"].'</a>||'.$details.'||';
}

 print substr($spans,'',-2);
?>

A do úvodní stránky se vkládá:

<script type="text/javascript" language="Javascript" src="rotate.js"></script>

 <script language="JavaScript">
function repeat() {


         timer=setTimeout("repeat()",<?=$layout['hpfeat_rotate'];?>);
        showUser(document.getElementById('feat_auc').value);    
}
</script> 

pak dále

<?
$value = implode(",",$auction_ids);
?>
<input type='hidden' value='<?=$value;?>' name='feat_auctions' id='feat_auc'/>
a na konci stránky

<? if ($layout['hpfeat_nb'] && $layout['hpfeat_rotate']>0) { ?>
    <script language="JavaScript">
    repeat();
    </script>
<? }?>

To ti ale asi moc nepomůže:(
_es
Profil
Cakewalk:
No z tých dvoch odkazov v [#3] je ktorá je tvoja stránka? Alebo, kde sa dá overiť, ako to nefunguje, teda živá ukážka? Čakáš snáď, že si to niekto v hlave skompiluje a odhalí ti všetky preklepy a nenápadné chyby? Ako máme zistiť, čo za číslo, či niečo iné, vygeneruje PHP z kódu <?=$layout['hpfeat_rotate'];?>?
Ešte ma napadá Časté potíže, zajímavosti a poučné debaty » Používejte var a príkazy by mali byť v JS oddeľovaný bodkočiarkou (;) a nie len odriadkovaním.

Naiplementované je to správně.
Vzhľadom na tú chybu v zátvorkách mám o tom pochybnosti.
Cakewalk
Profil
1. na aukce.allelektro.cz běží správně. Tabulka "přednostní aukce" se po 10s mění.
2. na www.homebazar.cz neběží. Stejný systém, stejné nastavení, stejná implementace.

To by si byl fakt machr, kdyby jsi to zvládl v hlavě :D

Chyba v závorkách byla ve vytvořeném scriptu. Zde se nic neimplementovalo ;)


Navíc znovu konstatuji, že i přes "chybu v závorkách" script na zkušebním webu funguje ;)
_es
Profil
Cakewalk:
Chyba v závorkách byla ve vytvořeném scriptu. Zde se nic neimplementovalo ;)
Ani po niekoľkonásobnom prečítaní tomu nerozumiem - veď pomocou toho skriptu to je implementované - či nie?

Stejný systém, stejné nastavení, stejná implementace.
A to už ako, ak je JS kód iný?
Cakewalk
Profil
Ten řetězec na homebazar.cz bych neřešil. Není to podstatné.

"A to už ako, ak je JS kód iný?"

V čem je jiný.

rotate.js i rotate.php jsou identické.
Cakewalk
Profil
Tento kód je obsah souboru rotate.js, který se nečítá na úvodní stránce.
_es
Profil
Cakewalk:
Tak skús najprv vymazať skripty, ktoré tam máš voči tomu inému webu navyše a ak to fungovať bude a potrebuješ ich, tak ich skúsiť premiestniť na iné miesto v kóde.
Tori
Profil
Cakewalk:
Když si otevřete v prohlížeči tu adresu, na kterou se posílá xhttp request, i s těmi ID v parametru - zobrazí se nějaký obsah? Nemůže být problém někde v php, že prostě kvůli nějaké chybě na jednom serveru nevrací nikdy žádná data?
Cakewalk
Profil
Zajímavá myšlenka. No pokud jsem to udělal dobře, tak na obou adresách se nezobrazuje nic ;)

Ten PHP kód projdu, ale neměla by tam být chyba. Ještě mě jen tak napadlo, ale asi je to hloupost, jestli nemůže být chyba např. v hostingu?
Tori
Profil
Cakewalk:
No já jsem si hodila nějaké breakpointy do funkce stateChanged() a zatímco na fungujícím webu je v .responseText nějaké HTML, tak na nefunkčním je .responseText prázdné. Proto se ptám, jestli máte jistotu, že vůbec ze serveru něco přijde na ten požadavek.
Cakewalk
Profil
Aha, no jistotu nemám. Jak to mám zjistit?
Cakewalk
Profil
Tak problém byl vyřešen a to dost banálně. Na hostingu mne přehodili na server z jinou verzí PHP a už to běží bez problémů. Díky všem za rady a podněty.

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:

Prosím používejte diakritiku a interpunkci.

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