Avatar billede mik789 Nybegynder
17. marts 2004 - 01:22 Der er 17 kommentarer og
2 løsninger

oplysninger om muse-events

I forlængelse af sp. http://www.eksperten.dk/spm/478192 prøver jeg at forstå det med events....

Jeg kan uden videre gøre sådan:

<div onclick="alert(event.clientX+'/'+event.clientY);">Hvor er markøren?</div>

Men hvis jeg prøver at anvende roenvings løsning fra sp. ovenfor til at lave et simpelt tooltip går det galt i Gecko browserne (men ikke i IE). Jeg siger:

<style type="text/css">
#tip {
    position: absolute;
    display: none;
    background-color: #ececec;
    color: #000099;
    border: 1px solid #000066;
    padding: 3px;
    font-size: 12px;
}
</style>

<script type="text/javascript">
function showMe(elm){
  var st = document.getElementById(elm).style;
  st.display = 'inline';
  st.top = event.clientY + 16 + 'px';
  st.left = event.clientX + 16 + 'px';
}

function hideMe(tt){
  document.getElementById(tt).style.display = 'none';
}
</script>

<div id="tip">Dette er et Tooltip!</div>

<p><a href="#" onmouseover="showMe('tip');" onmouseout="hideMe('tip');">Tooltip link</a></p>

Dette fungerer i IE, men ikke i Gecko browserne som siger: "event is not defined" og derfor ikke placerer tooltipboksen det rigtige sted. Hvis jeg staver "Event" med stort som her, giver det ingen fejl, men det virker alligevel ikke.

Så der er noget jeg ikke har fået fat i. Hvad skal der til?

//mik
Avatar billede roenving Novice
17. marts 2004 - 01:32 #1
Der er (desværre !-) _meget_ stor forskel på event-objekter og deres opførsel i IE og Gecko-browsere ...

For det første er event ikke et generisk objekt i Mozilla m.m., men en tilføjet parameter, så du skal i dine kald og funktioner gøre sådan:

showMe('tip',event)

function showMe(elm,e){

-- og så bruge e i stedet for event

For det andet er der en hulens masse properties og virkemåder som er forskellige, dog ikke lige på clientX/Y-tingen, så den er ret nem !o]
Avatar billede olebole Juniormester
17. marts 2004 - 01:32 #2
<ole>

Gecko og IE har helt forskellig implementering af events. Prøv:

<script type="text/JavaScript">
function bla(e) {
    alert(e.clientY);
}
window.onload = function() {
    document.getElementById("ib").onclick = bla;
}
</script>

<br><br><br><br><br><br><br><br><br><br>

<div id="ib">TEST</div>

/mvh
</bole>
Avatar billede olebole Juniormester
17. marts 2004 - 01:35 #3
... eller:

<script type="text/JavaScript">
function bla(e) {
    alert(e.clientY);
}
</script>

<br><br><br><br><br><br><br><br><br><br>

<div id="ib" onclick="bla(event)">TEST</div>
Avatar billede mik789 Nybegynder
17. marts 2004 - 01:35 #4
ok, så den løsning du havde i det andet sp. var en ren IE-ting? (Det tænkte jeg også, fordi han også brugte scrollLeft og scrollTop som kun er IE, ikke?).
Avatar billede mik789 Nybegynder
17. marts 2004 - 01:38 #5
ok, så det ER pga forskelle i browserne - igenigen...
det tumler vi videre med i morgen, nu er det gonat folkens ;-)
Avatar billede roenving Novice
17. marts 2004 - 01:43 #6
Jo !-)

Og en crossbrowser-udgave af oles eksempel kunne være:

<script type="text/JavaScript">
function bla(e) {
    if(navigator.userAgent.indexOf('MSIE')>-1)e=event;
    alert(e.clientY);
}
window.onload = function() {
    document.getElementById("ib").onclick = bla;
}
</script>

<br><br><br><br><br><br><br><br><br><br>

<div id="ib">TEST</div>
Avatar billede olebole Juniormester
17. marts 2004 - 01:46 #7
Forskellen er at window.Event i Gecko er en prototype-constructor, hvor window.event i IE er et object ... eller rettere en instans af et object
Avatar billede olebole Juniormester
17. marts 2004 - 01:49 #8
Eller bare:
  if (window.event) e=window.event;  ;o)
Avatar billede olebole Juniormester
17. marts 2004 - 01:50 #9
Den sidste kommentar var en anden version af roenvings:
  if(navigator.userAgent.indexOf('MSIE')>-1)e=event;
Avatar billede roenving Novice
17. marts 2004 - 01:52 #10
-- så kan du måske lige opdatere på hvor Opera og nogle af de andre browsere er henne i det spil (mac-tingene og f.eks. konqueror ?-)
Avatar billede olebole Juniormester
17. marts 2004 - 02:01 #11
'Konkylien' ved jeg ikke - men Opera æder vist begge event-modeller  :)
Avatar billede roenving Novice
17. marts 2004 - 02:04 #12
Oki, tak !-)
Avatar billede mik789 Nybegynder
17. marts 2004 - 08:09 #13
gomorgen, folkens!
Har nu prøvet at gå videre med mit lille tootip script efter jeres model her og er nu nået frem til flg. der dur i både IE og Gecko:

<script type="text/javascript"><!--
function showMe(e){
  if(window.event) var e = event;
  var s = document.getElementById('tip').style;
  s.display='inline';
  s.top = e.clientY + 16 + 'px';
  s.left= e.clientX + 16 + 'px';
}
window.onload = function(){
  document.getElementById('link').onmouseover = showMe;
}
 
function hideMe(elm){
  document.getElementById(elm).style.display = 'none';
}
//--></script>

<a id="link" href="#" onmouseout="hideMe('tip');">Tooltip link</a>

Men det er jo ikke så praktisk når ID'erne ('tip' og 'link') er angivet i funktionen. Det er bare ikke lige til at se hvordan jeg får dem erstattet af nogle variabel parametre der kan kaldes i funktionen, når denne nu er gjort anonym, for så er der jo ikke noget funktionskald hvor jeg kan indsætte de konkrete ID'er.

Og så lige et generelt sp. til oles script:

function bla(e) {
    alert(e.clientY);
}
window.onload = function() {
    document.getElementById("ib").onclick = bla;
}

- ja, det ofte i forbindelse med events man ser denne konstruktion med en anonym funktion. Hvad er meningen med den konstruktion? Hvorfor bruger man den? Hvad er fidusen ved den?
//
Avatar billede mik789 Nybegynder
17. marts 2004 - 08:23 #14
og kan selvfølgelig lige strammes yderligere op:

<script type="text/javascript"><!--
function showMe(e){
  if(window.event) var e = event;
  var s = document.getElementById('tip').style;
  s.display='inline';
  s.top = e.clientY + 16 + 'px';
  s.left= e.clientX + 16 + 'px';
}

function hideMe(){
  document.getElementById('tip').style.display='none';
}

window.onload = function(){
  document.getElementById('link').onmouseover = showMe;
  document.getElementById('link').onmouseout = hideMe;
}
 
//--></script>

<a id="link" href="#">Tooltip link</a>

men stadig, hvorfor egentlig denne konstruktion?
Avatar billede olebole Juniormester
17. marts 2004 - 13:14 #15
Du kunne f.eks. også skrive:

function bla(e) {
    alert(e.clientY);
}
function myLoad() {
    document.getElementById("ib").onclick = bla;
}
window.onload = myLoad;

Det andet er bare slankere  :)
Avatar billede mik789 Nybegynder
18. marts 2004 - 14:53 #16
Nu har jeg gjort tooltip funktionen generisk:

<script type="text/javascript">
function show(e,txt){
  if(window.event) var e = event; // for IE
  var t = document.getElementById('tip');
  t.innerHTML=txt;
  t.style.display='inline';
  t.style.top = e.clientY + 16 + 'px';
  t.style.left= e.clientX + 16 + 'px';
 
}

function hide(){
  document.getElementById('tip').style.display='none';
}
</script>

<a href="#" onmouseover="show(event,'Her du!');" onmouseout="hide();">Tooltip link</a>

Det er vel også den slankeste udgave det kan blive til, ikke? Eller kan man gøre noget à la oles anonyme funktion? Men hvordan får man så teksten ind, som jo vil være forskellig fra link til link?

Anyway, læg svar! og tak for hjælpen begge
//mik
Avatar billede roenving Novice
18. marts 2004 - 15:02 #17
Hvis du vil anonymisere kan du bruge en global variabel, men det slanker vel ikke ?-)

var txt;
function show(){
...

<a href="#" onmouseover="txt='Her du!';show();" onmouseout="hide();">Tooltip link</a>

-- bare så du kan se ideen !-)

-- og ellers velbekomme '-)
Avatar billede olebole Juniormester
18. marts 2004 - 15:21 #18
;o)
Avatar billede roenving Novice
18. marts 2004 - 17:10 #19
-- og tak for points ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester