Jump to content
Didyo

Percorrer elementos de uma DIV com nodetype e childdren childNodes

Recommended Posts

Olá a todos,

Estou usando um o PhotoSwipe para slider de imagens.

Ele percorre os elementos das DIVs com classe desejada e apresenta as fotos de cada galeria.

<div class="my-gallery" style="" itemscope itemtype="http://schema.org/ImageGallery">
    <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
      <a href="https://farm2.staticflickr.com/1043/5186867718_06b2e9e551_b.jpg" itemprop="contentUrl" data-size="964x1024">
          <img src="https://farm2.staticflickr.com/1043/5186867718_06b2e9e551_m.jpg" itemprop="thumbnail" alt="Image description" />
      </a>
      <figcaption itemprop="caption description">Image caption 2</figcaption>
    </figure>

    <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
      <a href="https://farm7.staticflickr.com/6175/6176698785_7dee72237e_b.jpg" itemprop="contentUrl" data-size="1024x683">
          <img src="https://farm7.staticflickr.com/6175/6176698785_7dee72237e_m.jpg" itemprop="thumbnail" alt="Image description" />
      </a>
      <figcaption itemprop="caption description">Image caption 3</figcaption>
    </figure>
</div>

Pode haver várias galerias.

O javascript é assim:

var initPhotoSwipeFromDOM = function(gallerySelector) {

    // parse slide data (url, title, size ...) from DOM elements 
    // (children of gallerySelector)
    var parseThumbnailElements = function(el) {
        var thumbElements = el.childNodes,
            numNodes = thumbElements.length,
            items = [],
            figureEl,
            linkEl,
            size,
            item;

        for(var i = 0; i < numNodes; i++) {

            figureEl = thumbElements[i]; // <figure> element

            // include only element nodes 
            if(figureEl.nodeType !== 1) {
                continue;
            }

            linkEl = figureEl.children[0]; // <a> element

            size = linkEl.getAttribute('data-size').split('x');

            // create slide object
            item = {
                src: linkEl.getAttribute('href'),
                w: parseInt(size[0], 10),
                h: parseInt(size[1], 10)
            };



            if(figureEl.children.length > 1) {
                // <figcaption> content
                item.title = figureEl.children[1].innerHTML; 
            }

            if(linkEl.children.length > 0) {
                // <img> thumbnail element, retrieving thumbnail url
                item.msrc = linkEl.children[0].getAttribute('src');
            } 

            item.el = figureEl; // save link to element for getThumbBoundsFn
            items.push(item);
        }

        return items;
    };

    // find nearest parent element
    var closest = function closest(el, fn) {
        return el && ( fn(el) ? el : closest(el.parentNode, fn) );
    };

    // triggers when user clicks on thumbnail
    var onThumbnailsClick = function(e) {
        e = e || window.event;
        e.preventDefault ? e.preventDefault() : e.returnValue = false;

        var eTarget = e.target || e.srcElement;

        // find root element of slide
        var clickedListItem = closest(eTarget, function(el) {
            return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
        });

        if(!clickedListItem) {
            return;
        }

        // find index of clicked item by looping through all child nodes
        // alternatively, you may define index via data- attribute
        var clickedGallery = clickedListItem.parentNode,
            childNodes = clickedListItem.parentNode.childNodes,
            numChildNodes = childNodes.length,
            nodeIndex = 0,
            index;

        for (var i = 0; i < numChildNodes; i++) {
            if(childNodes[i].nodeType !== 1) { 
                continue; 
            }

            if(childNodes[i] === clickedListItem) {
                index = nodeIndex;
                break;
            }
            nodeIndex++;
        }



        if(index >= 0) {
            // open PhotoSwipe if valid index found
            openPhotoSwipe( index, clickedGallery );
        }
        return false;
    };

    // parse picture index and gallery index from URL (#&pid=1&gid=2)
    var photoswipeParseHash = function() {
        var hash = window.location.hash.substring(1),
        params = {};

        if(hash.length < 5) {
            return params;
        }

        var vars = hash.split('&');
        for (var i = 0; i < vars.length; i++) {
            if(!vars[i]) {
                continue;
            }
            var pair = vars[i].split('=');  
            if(pair.length < 2) {
                continue;
            }           
            params[pair[0]] = pair[1];
        }

        if(params.gid) {
            params.gid = parseInt(params.gid, 10);
        }

        return params;
    };

    var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) {
        var pswpElement = document.querySelectorAll('.pswp')[0],
            gallery,
            options,
            items;

        items = parseThumbnailElements(galleryElement);

        // define options (if needed)
        options = {

            // define gallery index (for URL)
            galleryUID: galleryElement.getAttribute('data-pswp-uid'),

            getThumbBoundsFn: function(index) {
                // See Options -> getThumbBoundsFn section of documentation for more info
                var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail
                    pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
                    rect = thumbnail.getBoundingClientRect(); 

                return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
            }

        };

        // PhotoSwipe opened from URL
        if(fromURL) {
            if(options.galleryPIDs) {
                // parse real index when custom PIDs are used 
                // http://photoswipe.com/documentation/faq.html#custom-pid-in-url
                for(var j = 0; j < items.length; j++) {
                    if(items[j].pid == index) {
                        options.index = j;
                        break;
                    }
                }
            } else {
                // in URL indexes start from 1
                options.index = parseInt(index, 10) - 1;
            }
        } else {
            options.index = parseInt(index, 10);
        }

        // exit if index not found
        if( isNaN(options.index) ) {
            return;
        }

        if(disableAnimation) {
            options.showAnimationDuration = 0;
        }

        // Pass data to PhotoSwipe and initialize it
        gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
        gallery.init();
    };

    // loop through all gallery elements and bind events
    var galleryElements = document.querySelectorAll( gallerySelector );

    for(var i = 0, l = galleryElements.length; i < l; i++) {
        galleryElements[i].setAttribute('data-pswp-uid', i+1);
        galleryElements[i].onclick = onThumbnailsClick;
    }

    // Parse URL and open gallery if it contains #&pid=3&gid=1
    var hashData = photoswipeParseHash();
    if(hashData.pid && hashData.gid) {
        openPhotoSwipe( hashData.pid ,  galleryElements[ hashData.gid - 1 ], true, true );
    }
};

// execute above function
initPhotoSwipeFromDOM('.my-gallery');

Funciona perfeitamente. Link do exemplo http://photoswipe.com/documentation/getting-started.html 

No entanto, estou tentando mesclar com o JSSOR slider.

No exemplo, ele percorre em busca dos filhos da tag FIGURE (a , img,  figcaption).

Lembrando que as tags <figure> são filhas da div.my-gallery

Para usar com o JSSOR a tags <figuere> devem ficar dentro de DIVs.

<div class='my-gallery'>
	<div>
      <figure>
          <a href=''> 
              <img src=''>
          </a>
          <figcaption></figcaption>
      </figure>	
  	</div>
  
	<div>
      <figure>
          <a href=''> 
              <img src=''>
          </a>
          <figcaption></figcaption>
      </figure>	  	
  	</div>
</div>

E por isso o código abre apenas uma imagem por vez, enquanto que deveria abrir todas da galeria para ir passando uma a uma.

 

Na parte do código abaixo, troquei FIGURE por DIV e tentei mais algumas alterações sem sucesso.

// find root element of slide
        var clickedListItem = closest(eTarget, function(el) {
            return (el.tagName && el.tagName.toUpperCase() === 'FIGURE'); //FIGURE
        });

Acredito que seja simples para quem tem experiência nessa parte.

Agradeço a colaboração de todos.

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By ester nascimento
      "Através de um valor inicial e um valor final informados pelo usuário apresente a soma dos números ímpares deste intervalo. (Para somar coloque o sinal de + na frente do window. prompt). Verificar a necessidade de efetuar a troca dos valores das variáveis caso o segundo número digitado seja menor que o primeiro. "   Fiz este exercício assim, mas gostaria de saber se tem algum código mais simplificado  
       
       
      <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>exercicio3</title> </head> <script language="Javascript"> var ma = 0; var me = 999; var aux=0; var aux2=0; for (var i = 0; i < 2; i++) { aux = window.prompt("Digite um numero"); if (aux > ma) { ma = aux; } if (aux < me) { me = aux; } } while(me<ma) { aux=me%2; if (aux!=0) { aux2=aux2+me; } me++ } document.write("Soma dos números: "+aux2); </script> </html>    
    • By felp10
      Para que você possa resolver este exercício, definimos para você as funções maeDe e paiDe, que, recebendo um filho (string), retorna o nome (string) da mãe ou pai conforme apropriado. Exemplo:
      paiDe(cleoPires) "Fábio Júnior" maeDe(cleoPires) "Glória Pires"
      Agora é a sua vez de criar as funções: temAMesmaMae que tem dois filhos por parâmetro e retornará true oufalse se eles realmente compartilharem a mesma mãe. Sabendo disso você pode usar a função que nós lhe damos maeDe.
      temOMesmoPai que como o anterior, pega dois filhos por parâmetro e retorne true oufalse se eles compartilharem o mesmo pai. Sabendo disso você pode usar a função que nós lhe damos paiDe.
      E saoMeioIrmaos, que, recebendo dois filhos por parâmetro, nos diga se de fato são meio-irmãos. Você deve usar as duas funções anteriores aqui. Lembre-se que os meios irmãos são dados quando, dois filhos compartilham a mesma mãe, mas NÃO o mesmo pai ou vice-versa. Bem, se ambos têm a mesma mãe e o mesmo pai, nesse caso eles seriam irmãos! 
      O teste me da esse resultado e não estou conseguindo entender o porque minha lógica está errada quero ajuda para entender não solução por favor, obrigado.
       Sua solução não passou as provas
      Resultados do teste:  cleoPires e fiuk são meio irmãos Ver detalhes  sandy e junior não são meio irmãos  sandy e fiuk não são meio irmãos  junior e fiuk não são meio irmãos Ok, vamos a minha solução!
       
      function maeDe(filho){ return "Glória Pires" } function paiDe(filho){ return "Fábio Júnior" } function temAMesmaMae(filho1, filho2){ return maeDe(filho1) == maeDe(filho2); } function temOMesmoPai(filho1, filho2){ return paiDe(filho1) == paiDe(filho2); } function saoMeioIrmaos(filho1, filho2){ return temAMesmaMae(filho1, filho2) != temOMesmoPai(filho1, filho2); }  
    • By DenisFS
      Olá, gostaria de saber como é possível criar esse tipo de efeito em um site,  como definir propriedades desse tipo, como se fosse um quebra cabeça ? Que tipo de tecnologia devo utilizar etc...
       
      segue o link : https://www.aidesign.com/
       
      ps: estou falando do formato dos componentes, não do efeito de hover.
    • By iSilvaMarcelo
      Estou usando esse código(
       
      <script>
        window.onload = function() {
          var imprimir = document.querySelector("#imprimir");
              imprimir.onclick = function() {
                imprimir.style.display = 'none';
                window.print();
                      
                var time = window.setTimeout(function() {
                  imprimir.style.display = 'block';
                }, 1000);
              }
        }
      </script>
       
       
      ) para impressão da tabela que estou puxando no banco de dados. Porém ele está imprimindo a tabela junto com a página.
      Usei esses esse diferente (
      <script>
      document.getElementById('btn').onclick = function() {
         var conteudo = document.getElementById('sua_div').innerHTML,
         tela_impressao = window.open('about:blank');
         
         tela_impressao.document.write(conteudo);
         tela_impressao.window.print();
         tela_impressao.window.close();
      };
      </script>
      ) Deu certo, mais tirou todo o css da tabela, fora que ficou a tabela muito longo para uma pagina.
      Tem como eu alterar a fonte de impressão e colocar o css que implementei junto?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.