Safari onclick op a href

Pagina: 1
Acties:

  • Ytsejammer
  • Registratie: Oktober 2004
  • Laatst online: 06-09 22:34
Het volgende werkt in Firefox, Opera en IE. Maar niet in Safari. Wie kan me vertellen waarom?

Het onderwerp heb ik wat aangepast maar het principe is hetzelfde:
Er is een lijstje van auto's. Op elke auto kan geklikt worden zodat de eigenschappen eronder zichtbaar worden middels de style-eigenschap display, de interne div's worden dan zichtbaar.

Ik heb voor <a> gekozen omdat het dan duidelijker wordt dat de items aangeklikt kunnen worden. De <a>'s zijn dus altijd zichtbaar, de div's alleen na het onclick event. Zo ziet zo'n lijstje eruit:

HTML:
1
2
3
4
5
6
7
8
<div class="auto" id="4253">
 <a href="#" class="titel">
  <div class="merk" id="merk_4253">Ford</div>
  <div class="type" id="type_4253">focus</div>
 </a>
 <div class="kleur" id="kleur_4253">rood</div>
 <div class="bouwjaar" id="bouw_4253">2005</div>
</div>

zo'n lijstje kan zich dus oneindig herhalen (voor andere auto's uiteraard).

Dan volgt er een scriptje met het onclick event. De functie getElementsByClass is een zelf geschreven functie die alle elementen met de opgegeven className in een array teruggeeft.
(Ik weet het: het opvragen van de parentNode in aExpand is niet echt nodig)

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
automerken = function() {
    var autos= getElementsByClass("titel");
    for(var i=0; i < merken.length; i++) 
        merken[i].onclick=aExpand;
}
aExpand=function(e) {
    var merk = this.parentNode;
    var autos = getElementsByClass("autos", merk);
    if(autos[0].style.display == "none")
        autos[0].style.display = "block";
    else
    autos[0].style.display = "none";
   return false;
}

Alleen Safari weigert de div's weer te geven (dus uit te klappen). En returned bovendien geen false omdat er een # achter het url verschijnt. Wie weet waar het probleem schuilt of heeft er een oplossing?

Code kan tussen code tags voor de overzichtelijkheid ;)

[ Voor 4% gewijzigd door BtM909 op 31-05-2007 14:36 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:27

crisp

Devver

Pixelated

Een a-element mag geen blocklevel elementen (zoals div) bevatten, en verder mogen id's niet enkel numeriek zijn ;)

Intentionally left blank


  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11 15:46

OkkE

CSS influencer :+

Ik kan je niet helpen met je probleem, maar ik zie wel 2 puntjes in je HTML die ik wilde melden:
• Een ID mag niet uitsluitend uit nummers bestaan (en volgens mij ook niet mee beginnen).
• Een A element mag geen block (zoals DIV) elementen bevatten.

Denk niet dat deze puntjes het probleem zijn, maar het is sowieso netter om het met correcte HTML op te bouwen. :) Denk dat een DL een mooie vervanger is. Succes.

// Edit: Grrr, crisp! ;)

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 30-11 21:13

--MeAngry--

aka Qonstrukt

Als bovengenoemde punten het probleem al niet vormen, zou ik sowieso eens kijken of de onclick functie wel aan de A wordt gehangen. Gooi er een alert in of iets dergelijks.

Tesla Model Y RWD (2024)


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:27

crisp

Devver

Pixelated

Het daadwerkelijke probleem kan 'm ook nog in de functie getElementsByClass() zitten ;)

Intentionally left blank


  • C.44
  • Registratie: Juni 2001
  • Laatst online: 05-08-2020

C.44

TurboCharged Supra Driver

getElementsByClass is inderdaad geen bestaande functie, er zijn uiteraard wel manieren om toch een dergelijke (werkende) functie te bouwen.
Zie hier: klik!

Toyota Supra 3.0i Turbo Targa in Panther Black Mica - 300D || 30D || 10-20 || 50mm 1.8 mk1 || 18-55 || 17-85 || 75-300 || Giottos || Manfrotto || Cullmann || Kenko || Hoya


  • Ytsejammer
  • Registratie: Oktober 2004
  • Laatst online: 06-09 22:34
crisp schreef op donderdag 31 mei 2007 @ 15:19:
Een a-element mag geen blocklevel elementen (zoals div) bevatten, en verder mogen id's niet enkel numeriek zijn ;)
Thnx voor jullie reacties. in het voorbeeld had ik idd een numerieke id staan. In het echt is dit niet het geval (nl zoiets als idnaam_123). Verder heb ik van de A een DIV gemaakt met exact hetzelfde resultaat; alleen Safari die niet mee wil werken terwijl het in Opera, Firefox en IE perfect werkt.

Het zou idd in de getElementsByClass kunnen zitten maar dan zou het in alle browsers niet moeten werken neem ik aan. Maar goed in het geval jullie nog iets geks zien:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
function getElementsByClass(className, obj, tagName) {
    if(!tagName) tagName = "*";
    if(!obj) obj = document;
    var childNodes = obj.getElementsByTagName(tagName);
    var elements = new Array();
    var i= -1;
    for(x in childNodes)
         if (childNodes[x].className==className)
            elements[++i] = childNodes[x];
    return elements;
}

dit keer wel in code tags, sorrie voor de vorige keer :)

  • Ytsejammer
  • Registratie: Oktober 2004
  • Laatst online: 06-09 22:34
Safari kent de 'in' niet in de for-lus:

JavaScript:
1
for(x in childNodes)

Is opgelost met de standaard manier:

JavaScript:
1
for(var i=0; i < childNodes.length; i++)

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:27

crisp

Devver

Pixelated

Ytsejammer schreef op vrijdag 01 juni 2007 @ 17:01:
Safari kent de 'in' niet in de for-lus:

JavaScript:
1
for(x in childNodes)

Is opgelost met de standaard manier:

JavaScript:
1
for(var i=0; i < childNodes.length; i++)
for-in itereert over alle properties van een object, als je bijvoorbeeld dit voorbeeld neemt met een document met 1 paragraaf:
JavaScript:
1
2
3
4
5
6
window.onload = function()
{
    var p = document.getElementsByTagName('p');
    for (var i in p)
        alert(i);
}

dan krijg je in Firefox respectievelijk '0', 'length', 'item' en 'namedItem' als properties. Niet zondermeer dus for-in gebruiken op built-in Objects.

Als ik je een alternatief mag geven:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function getElementsByClassName(className, nodeName, parentElement, callback)
{
    if (!nodeName)
        nodeName = '*';

    if (!parentElement)
        parentElement = document;

    var results = [], s, i = 0, element;

    if (document.evaluate && className.indexOf('|') == -1)
    {
        s = document.evaluate(
            ".//" + nodeName + "[contains(concat(' ', @class, ' '), ' " + className + " ')]",
            parentElement,
            null,
            XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
            null
        );

        while ((element = s.snapshotItem(i++)))
        {
            results.push(element);
            if (callback)
                callback(element);
        }
    }
    else
    {
        s = parentElement.getElementsByTagName(nodeName);
        var re = new RegExp('(^|\\s)' + className + '(\\s|$)'), elementClassName;

        while ((element = s[i++]))
        {
            elementClassName = element.className;
            if (    elementClassName.length &&
                (   elementClassName == className ||
                    re.test(elementClassName)
                )
            )
            {
                results.push(element);
                if (callback)
                    callback(element);
            }
        }
    }

    return results;
}

Deze gebruikt het veel snellere Xpath indien beschikbaar. Dit is eventueel nog uit te breiden wanneer getElementsByClassName native ondersteunt gaat worden (daar zijn plannen voor) :)

Intentionally left blank

Pagina: 1