Autor Zpráva
tito100
Profil
zdravým. potrebujem poradit.
vám vlastný objekt v js, ktorý mení vlastnosti style zadaného divu . v opere,mozile,safari mi to funguje bez jedinej js chyby.
ovšem v IE mi po nájdení kur¨zorom na odkaz test napíše následovnú chybu "Zpráva: 'tipDiv.style' má hodnotu null nebo není objekt."
tu su potrebné useky z ködu
style:
    .bublina {position: fixed;
             position: "absolute";
             top: 90px; left: 80%; visibility:hidden; z-index:100;
            }

html :
<link rel="stylesheet" href="adminclas.css" type="text/css" />
<script language="JavaScript" src="js/global_functions.js"></script>
<script language="JavaScript" src="js/admin_tabs.js"></script>
<script language="JavaScript" src="js/help_text.js"></script>
<script language="JavaScript" src="js/admin_ajax.js"></script>

</head>
<body onscroll="f_track_scroll()">

<div id="tipDiv" class="bublina"></div>
<div id="winAdminDiv" class="bublina"></div>
<div id="ajaxDiv" class="bublina"></div>
<script language="JavaScript" src="js/adminjs.js"></script>

<a href="#" onmouseover="help1.show(event,'poznamka)"> test </a>

admin.js:
var help1 = new HelpDesk('tipDiv',true);
var WinAdmin = new HelpDesk('winAdminDiv',false,1,1,0,0);
var AjaxInfo = new HelpDesk('ajaxDiv',false,1,1);

help_text.js:
function HelpDesk(DivName,folow, posx, posy, offX, offY) 
{

  this.FollowMouse = folow;
  this.Time1;
  this.Time2;
  this.Showed=false;
  if (!offX) this.OffX = 20; else this.OffX = offX;
  if (!offY) this.OffY = 12; else this.OffY = offY;
  this.DivName = DivName;
  this.Static = false;

  this.DivId = getIds(DivName)

	this.DivCss = this.DivId.style;

  this.scroll = f_track_scroll;

  if (!posx) posx=0;
  if (!posx) posy=0;
  if (posx!=0 && posy!=0)
  {
    this.PosX=posx;
    this.PosY=posy;
    this.Static=true;
    this.DivId.style.pixelTop = document.body.scrollTop + posy;
    document.onscroll = this.scroll;

  }

  
  this.show = f_show;
  this.trackMouse = f_TrackMouse;
  this.position = f_Position;
  this.close = f_close;

	if (this.DivId && this.FollowMouse && !this.Static) 
  {
		document.onmousemove = this.trackMouse;
	}
}
function f_show(evt,argHtml) {
  if (argHtml=='') return;
	if (!this.DivId) return;
	if (this.Time1) clearTimeout(this.Time1);
  if (this.Time2) clearTimeout(this.Time2);
  g_idds=this;
	this.Showed = true;
	if (ie4||ie5||ns5) {
	 	this.DivId.innerHTML = argHtml;
	}

	if (!this.FollowMouse && !this.Static)
    this.position(evt);
	else 
    this.Time1=setTimeout("getIds('" + this.DivName + "').style.visibility='visible'",100);
}

global functions:
var dom = (document.getElementById) ? true : false;
var ns5 = (!document.all && dom || window.opera) ? true: false;
var ie5 = ((navigator.userAgent.indexOf("MSIE")>-1) && dom) ? true : false;
var ie4 = (document.all && !dom) ? true : false;
var nodyn = (!ns5 && !ie4 && !ie5 && !dom) ? true : false;


// get tag ID
function getIds(arg)
{
  if (nodyn) return;
  return (ie4)? document.all[arg]: (ie5||ns5)? document.getElementById(arg): null;
}
Chamurappi
Profil
Reaguji na tita100:
Prosím o odkaz na živou ukázku.
Joker
Profil
tito100:
Asi to nevyřeší problém, ale podle mě v té části "global functions" je hned několik chyb.
1. Divně pojmenované proměnné- co znamená "ns5"?
2. Skutečně tu stránku zajímá IE4 nebo IE5?
3. Výsledkem logického výrazu je true nebo false, místo konstrukcí "Pokud výsledek je true, vrať true, pokud výsledek je false, vrať false" stačí udělat "Vrať výsledek" :)
Boolean holt doplácí na to, že má jen dvě hodnoty, u integeru málokoho napadne něco jako: (x==0) ? return 0 : (x==1) ? return 1 : (x==2) ?... :-)
4. Funkce getIds má (jestli to dobře chápu) vrátit prvek s daným ID (proč se ale jmenuje getIds?!) Proč teda kašle na proměnnou dom, ve které má uložené, jestli prohlížeč umí getElementById, a místo toho dělá obskurní testy na prohlížeč?
Rychle jde vrácení prvku s daným ID vyřešit asi takhle:
return(document.getElementById ? document.getElementById(arg) : document.all ? document.all[arg] : null);
Chamurappi
Profil
Reaguji na Jokera:
3. Výsledkem logického výrazu je true nebo false
To v JavaScriptu není tak úplně pravda (i když pro potřeby uvedeného skriptu na tom nezáleží). Platí, že:
1) Výsledkem logického AND je buď poslední pravdivá hodnota, nebo první nepravdivá hodnota.
2) Výsledkem logického OR je buď první pravdivá hodnota, nebo poslední nepravdivá hodnota.

Tebou uvedený řádek skriptu jde tedy napsat i tak, že se obejde bez ternárního operátoru:
return document.getElementById && document.getElementById(arg) || document.all && document.all[arg] || null;
… což asi nikdo neocení. Ale existuje mnoho případů, kdy mohou chytré operátory výrazně zjednodušit zápis.
Joker
Profil
Chamurappi:
To v JavaScriptu není tak úplně pravda
No opravdu. Díky za informaci.
(2 && 2)
-> 2

(2 && 2) === true
-> false

...to poněkud mění pohled na věc.

Tebou uvedený řádek skriptu jde tedy napsat i tak, že se obejde bez ternárního operátoru
Mně to přišlo už tak na hranici přehlednosti :-)
tito100
Profil
Chamurappi:
zivou ukazku by som rad ukazal. momentalne to však nieje možne.
Joker:
IE5 , IE4 - z optimalizaciou nemam skusenosti. ten usek som skopiroval z ukažky, kde to fungovalo. to iste plati aj o funkcii get_ids . do nej som len skopiroval jeden riadom z toho. Chamurappi
:-) . tento riadok sa da normalne pochopit.
použil som ho a funguje to.
dakujem za vaše odpovede

až na jeden detail. zase je to len u IE.
pri pouziti tohto objektu. ktory v podstate služi ako funkcia na zmenu pozicie tagu, a zmenu jeho vlastnosti "visibility" .
ked to vsak v IE pozijem. tak dany tag sa roztiahne širkou na širku obrazovky.
mohli by ste mi poradit ako to fixnut na sirku obsahu tagu ?

Vaše odpověď

Mohlo by se hodit

Nezapomeňte na odkaz na živou ukázku problému.

Prosím používejte diakritiku a interpunkci.

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