Comunidad de diseño web y desarrollo en internet online

Problemas con suckerfish target desde flash

Citar            
MensajeEscrito el 27 Ago 2009 06:31 pm
Hola, antes de nada, muchas gracias por el tiempo que le dediquéis a esto (sea quien sea)

El cuerpo del delito podéis verlo aquí: http://ccan.eu/mapa

El problema es que estoy utilizando un javascript cuya función es la de simular la pseudo-clase :target en internet explorer: luego el problema está en ie, los demás navegadores funcionan sin ningún problema. El javascript lo saqué de aquí: http://htmldog.com/articles/suckerfish/target/ . Creo que es un código bastante conocido.

Código :

<script type="text/javascript">

function suckerfish(type, tag, parentId) {
   if (window.attachEvent) {
      window.attachEvent("onload", function() {
         var sfEls = (parentId==null)?document.getElementsByTagName(tag):document.getElementById(parentId).getElementsByTagName(tag);
         type(sfEls);
      });
   }
}

sfTarget = function(sfEls) {
   var aEls = document.getElementsByTagName("A");
   document.lastTarget = null;
   for (var i=0; i<sfEls.length; i++) {
      if (sfEls[i].id) {
         if (location.hash==("#" + sfEls[i].id)) {
            sfEls[i].className+=" sftarget";
            document.lastTarget=sfEls[i];
         }
         for (var j=0; j<aEls.length; j++) {
            if (aEls[j].hash==("#" + sfEls[i].id)) aEls[j].targetEl = sfEls[i];
            aEls[j].onclick = function() {
               if (document.lastTarget) document.lastTarget.className = document.lastTarget.className.replace(new RegExp(" sftarget\\b"), "");
               if (this.targetEl) this.targetEl.className+=" sftarget";
               document.lastTarget=this.targetEl;
               return true;
            }
         }
      }
   }
}

suckerfish(sfTarget, "LI");

</script>


Lo que ocurre es que la navegación a los enlaces del div flotante de la derecha está en el swf, razón por la que no funciona.

Podéis ver cómo debería de funcionar utilizando cualquier navegador que no sea explorer o, desde explorer, pinchando en los enlaces del div de debajo del mapa. Funciona a la perfección cuando se pincha en los enlaces en html, pero no al pinchar en los enlaces dentro del flash --> supongo que es una cuestión de carga del html: el navegador no lee el javascript cuando se pincha en los botones del flash.

Al pinchar en alguno de los botones que aparecen en el flash, un pequeño código en actionscript hace una llamada al script useLocationHash, que está justo antes del script de suckerfish:

Código :

function useLocationHash(sMyHash) {
window.location.hash = sMyHash;
         }


Aquí tienes un ejemplo de cómo son los botones en actionscript:

Código ActionScript :

on (press) {
   getURL("javascript: useLocationHash('pa2');");
}


Lo hago así en lugar de getURL("#pa2"); porque explorer acaba petando con la url al hash directamente, es otro problema que está documentado. --> http://pearstudios.com/javascript/locationHashAndFlash.html

Bien, todo esto esto es para hacer un highlight a los enlaces de los pdfs, que en cualquier navegador que respete los estándares funciona de maravilla, pero en explorer no, por eso hay que simular la pseudoclase :target dando una clase especial cuando aparece el hash en la url --> .sftarget es la clase.

El problema evidente es que ese código no está pensado para interactuar con flash, y hay que hacer alguna ñapa para que funcione. Mi primera idea ha sido forzar un window.location.reload(); desde flash, pero es una chapuza tremenda (hace una recarga que se ve a un kilómetro) y que también afecta a los navegadores que respetan los estándares, y no funciona del todo bien, pues si bien aplica los estilos a los enlaces a los pdfs, no hace el salto hacia arriba que debería generar el hash # --< puedes ver de lo que te hablo pinchando en los puntos 1 y 14 del flash.

Otra idea fue forzar el window.location.reload(); desde la función en javascript que se invoca desde flash, algo así:

Código :

         function useLocationHash(sMyHash) {
            window.location.hash = sMyHash;
                                window.location.reload();
         }

Pero entonces, el problema es el mismo: no funciona bien y me afecta al resto de navegadores.

Creo que la solución es integrar los dos javascript en uno, de tal manera que al invocar useLocationHash desde flash, también se ejecute el código que aplica los estilos. Y aquí es donde estoy perdido: no tengo ni pajolera idea de cómo integrar la función suckerfish dentro useLocationHash, de tal manera que cada vez que se pinche en un botón me haga las dos cosas. Supongo que es porque de javascript lo único que sé es C&P :oops:

Espero haberme explicado bien y que al menos sepáis por donde voy.
Muchísimas gracias.

salu2

Por solserpiente

1 de clabLevel



 

safari
Citar            
MensajeEscrito el 28 Ago 2009 10:09 am
Como sospechaba, la solución para poder simular la pseudoclase :target en explorer si el evento viene desde flash estaba en integrar dos funciones en una. Había que meter la lógica del primer javascript en la función useLocationHash.
El código final ha quedado así:

Código :

function useLocationHash(sMyHash) {
    window.location.hash = sMyHash;
    var sfEls = document.getElementsByTagName("LI");
    sfTarget(sfEls);
    }
sfTarget = function(sfEls) {
    var aEls = document.getElementsByTagName("A");
    document.lastTarget = null;
    for (var i=0; i<sfEls.length; i++) {
        if (sfEls[i].id) {
            if (location.hash==("#" + sfEls[i].id)) {
                sfEls[i].className+=" sftarget";
                document.lastTarget=sfEls[i];
            }
            else
                sfEls[i].className="";
            for (var j=0; j<aEls.length; j++) {
                if (aEls[j].hash==("#" + sfEls[i].id)) aEls[j].targetEl = sfEls[i];
                aEls[j].onclick = function() {
                    if (document.lastTarget) document.lastTarget.className = document.lastTarget.className.replace(new RegExp(" sftarget\\b"), "");
                    if (this.targetEl) this.targetEl.className+=" sftarget";
                    document.lastTarget=this.targetEl;
                    return true;
                }
            }
        }
    }
}


Muchísimas gracias a jdeveloper --> http://twitter.com/jdeveloper por arreglar el problema con dos líneas de código. Si alguien utiliza alguna vez este tip ya sabe a quién agradecérselo ^^

Por solserpiente

1 de clabLevel



 

safari

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.