Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: IE ja event handlerit

Dramo [08.02.2010 21:55:15]

#

Olettaisin että "ongelma" on tässä: http://support.microsoft.com/kb/887741/

Eli siis jos jossakin elementissä on even handler (onclick, onmouseover jne..) joka kutsuu suoraan funktiota, ei sitä suoriteta vaan aletaan herjaamaan. ("Arvoksi on annettava objekti")

Minulla on siis seuraavanlaiset funktionkikkareet, jotka hyödyntävät Prototypeä ja Scriptaculousta.

function hideall() {
	['realcontent', 'ahbcontent', 'kuracontent', 'mapacontent'].each(Element.hide);
}

function show(itemID) {
	hideall();
	Effect.Appear(itemID);
}

Eli siis parilla elementillä on onmouseover="show('jokudiv')", jolloin hiiren mennessä sen päälle sen pitäisi piilottaa nuo tietyt divit ja näyttää jokudiv. Tämä toimii mainosti Firefoxilla ja Operalla, mutta ei IE:llä. Olen niin aloittelija etten ihan tajua artikkelissa esitettyä workaroundia, eli voisiko joku neuvoa vähän tarkemmin kuinka saan kutsutuksi nuo funktiot. (Vaiko mitenkään?)

Metabolix [08.02.2010 22:14:50]

#

Teet jo nykyään tuon aivan oikein (kuten artikkelikin neuvoo). Vika on luultavasti jossain muualla. Tutki asiaa ensiksi laittamalla show-funktioon vain alert, jolloin näet, kutsutaanko funktiota:

function show(itemID) {
  return alert("show(" + itemID + ")");
}

Jos funktiota kutsutaan oikein, virhe on muualla koodissasi. Voit vaikka laittaa show-funktioon try-catch-rakenteen ja etsiä virhettä heittämällä poikkeuksia:

function show(itemID) {
  var e;
  try {
    hideall();
    throw "hideall() tehty!";
    Effect.Appear(itemID);
  } catch (e) {
    alert(e);
  }
}

Dramo [09.02.2010 01:59:18]

#

Kiitos, kokeilin noita mutta toimivat ihan odotetusti. (Paitsi IE:llä.)

Pienen hiekkalaatikkoilun jälkeen:

Opera ja Firefox suorittavat koodin oikein, ilman mitään mukinoita. IE herjaa riveille 35,36, ja 37 seuraavaa: Arvoksi on annettava objekti. Nämä rivit ovat

<button onclick="fshow('one')">One</button>
<button onclick="fshow('two')">Two</button>
<button onclick="fshow('three')">Three</button>

(Vaihdoin funktion fshowksi koska show meni ilmeisesti Prototypen kanssa sekaisin, mutta tämä ei silti korjannut ongelmaa.)

Sain koodin toimimaan näin:

<button onclick="['one', 'two', 'three'].each(Element.hide); Effect.Appear('one')">One</button> ... jne

Rumaa ja epäkätevää mutta toimii myös IE:llä. Parempia ehdotuksia otetaan vastaan.

Merri [09.02.2010 07:57:52]

#

Suosittelisin välttämään JavaScriptin sotkemista HTML:n sekaan. Tee sen sijaan nappulat viitteellisiksi ja lisää event muilla keinoin. Alla vähän esimerkkiä, joka ei välttämättä toimi (en ole testannut):

<p id="buttons">
    <button class="one">One</button>
    <button class="two">Two</button>
    <button class="three">Three</button>
</p>
<!-- head-elementissä -->
<script type="text/javascript">
window.onload = function() {
    $('buttons').descendants().each().onclick = function() {
        if( (typeof(this.className) == 'string') && this.className.length > 0 ) {
            fshow(this.className);
        }
    }
}
</script>

Ei välttämättä elegantein ratkaisu, minkä Prototypellä saa aikaiseksi, mutta idean pitäisi tulla selväksi. En tiedä korjaako tämä IE:n ongelmia, mutta ainakin funktioiden pitäisi vähintäänkin päätyä samaan nimiavaruuteen.

Metabolix [09.02.2010 11:32:23]

#

Merrin ehdotuksesta toimivaksi ja elegantiksi muokattu versio:

<button class="js_show" name="one">One</button>
<button class="js_show" name="two">Two</button>
<button class="js_show" name="three">Three</button>
function button_click() {
    show(this.name);
}
Event.observe(window, "load", function() {
    $$('.js_show').each(function(button) {
        button.observe("click", button_click);
    });
});

Voit myös testata vastaavaa koodia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta