Salve a tutti, è da un molto tempo che non scrivo più qui, da quando ho abbandonato l'utilizzo di Flash per passare all'html e css...
Il mio problema riguarda l'utilizzo di jquery per realizzare una funzione "on document ready" e altre "on click" ...
In particolare ho un portfolio progetti che raccoglie tutti i progetti realizzati ed inseriti dall'utente, ogni 15 elementi creo un pagina, e successivamente creo uno slider con il plug-in BxSlider, cliccando su determinati tasti attivo/disattivo i progetti in base alla tipologia riordinandoli.
-Ogni progetto è composto da un div e tutti i progetti sono racchiusi in un unico div contenitore:
<div id="anteprima_progetti">
<div class="phps_anteprima_sottopagine esterni">
[img]images/fusinaz-epinel_thumb.jpg[/img]
<h3>Fusinaz - Epinel</h3>
</div>
<div class="phps_anteprima_sottopagine interni">
[img]images/lodigiani-verrand_thumb.jpg[/img]
<h3>Lodigiani - Verrand</h3>
</div>
<div class="phps_anteprima_sottopagine ristrutturazioni">
[img]images/castello-laruine_thumb.jpg[/img]
<h3>Castello - La Ruine</h3>
</div>
<div class="phps_anteprima_sottopagine ristrutturazioni">
[img]images/papa-mama-villair_thumb.jpg[/img]
<h3>Papa&Mama - Villair</h3>
</div>
</div>
-Durante il caricamento della pagina creo un div contenitore class="blocco" ogni 15 div (class="phps_anteprima_sottopagine"); successivamente inglobo ogni div class="blocco" in un div contenitore class="cont_prog_slider"; infine creo lo slider attraverso il plug-in BxSlider:
<script type="text/javascript">
$(document).ready(function(){
var divs = $(".phps_anteprima_sottopagine");
for(var i = 0; i < divs.length; i+=15) {
divs.slice(i, i+15).wrapAll("<div class='blocco'></div>");
}
$(".blocco").wrapAll("<div class='cont_prog_slider'></div>");
var slider = $('.cont_prog_slider').bxSlider({
pagerType:'short',
infiniteLoop: false,
speed:2000
});
});
</script>
In questo modo genero uno slider orizzontale con le pagine composte da 15 progetti ciascuna...
-A questo punto l'utente cliccando sulle voci di un menu, seleziona/deseleziona le tipologie progetti che gli interessa:
<div id="filter_menu">
<span id="tipo-attivo">Tutti</span>
<div>
<span id="esterni-sel">esterni</span>
<span id="interni-sel">interni</span>
<span id="ristrutturazioni-sel">ristrutturazioni</span>
<span id="tutti-sel">tutti</span>
</div>
<span id="close-open">X</span>
</div>
-Cliccando su una voce la funzione:
se lo slider generato durante il caricamento della pagina è valido:
1A-distrugge lo slider ( destroySlider - public methods BxSlider - http://bxslider.com/options )ed imposta la varibile slider = null
se lo slider generato durante il caricamento della pagina NON è valido:
1B- distrugge lo slider generato "onclick" (slider_sel)
2-elimina i div "blocco"
3- elimina il div "cont_prog_slider"
4- nasconde i div progetto non selezionati
5- raggruppa SOLO i div selezionati in div "blocco" (sempre ogni 15)
6- raggruppa i div "blocco" in un unico contenitore div "cont_prog_slider"
7- genera un nuovo slider
<script type="text/javascript">
$(document).ready(function(){
$("#esterni-sel").click(function () {
if (slider_sel == null) {
//non esiste
alert ("slider_sel non esiste: distruggo slider");
slider.destroySlider();
slider = null;
} else {
//esiste
alert ("slider_sel esiste: distruggo slider_sel");
slider_sel.destroySlider();
}
$('.phps_anteprima_sottopagine').unwrap();
$('.cont_prog_slider div').unwrap();
$(".interni").hide("slow");
$(".ristrutturazioni").hide("slow");
$(".esterni").show("slow");
var divs = $(".esterni");
f or(var i = 0; i < divs.length; i+=15) {
divs.slice(i, i+15).wrapAll("<div class='blocco'></div>");
}
$(".blocco").wrapAll("<div class='cont_prog_slider'></div>");
var slider_sel = $('.cont_prog_slider').bxSlider({
pagerType:'short',
i nfiniteLoop: false,
speed:2000
});
});
$("#interni-sel").click(function () {
if (slider_sel == null) {
//non esiste
alert ("slider_sel non esiste: distruggo slider");
slider.destroySlider();
slider = null;
} else {
//esiste
alert ("slider_sel esiste!!!: distruggo slider_sel");
slider_sel.destroySlider();
}
$('.phps_anteprima_sottopagine').unwrap();
$('.cont_prog_slider div').unwrap();
$(".esterni").hide("slow");
$(".ristrutturazioni").hide("slow");
$(".interni").show("slow");
var divs = $(".interni");
for(var i = 0; i < divs.length; i+=15) {
divs.slice(i, i+15).wrapAll("<div class='blocco'></div>");
}
$(".blocco").wrapAll("<div class='cont_prog_slider'></div>");
var slider_sel = $('.cont_prog_slider').bxSlider({
pagerType:'short',
infiniteLoop: false,
speed:2000
});
});
$("#ristrutturazioni-sel").click(function () {
if (slider_sel == null) {
//non esiste
alert ("slider_sel non esiste: distruggo slider");
slider.destroySlider();
slider = null;
} else {
//esiste
alert ("slider_sel esiste!!!: distruggo slider_sel");
slider_sel.destroySlider();
}
$('.phps_anteprima_sottopagine').unwrap();
$('.cont_prog_slider div').unwrap();
$(".esterni").hide("slow");
$(".interni").hide("slow");
$(".ristrutturazioni").show("slow");
var divs = $(".ristrutturazioni");
for(var i = 0; i < divs.length; i+=15) {
divs.slice(i, i+15).wrapAll("<div class='blocco'></div>");
}
$(".blocco").wrapAll("<div class='cont_prog_slider'></div>");
var slider_sel = $('.cont_prog_slider').bxSlider({
pagerType:'short',
infiniteLoop: false,
speed:2000
});
});
});
</script>
Il problema è questo:
Per il primo slider generato on document ready, tutto funziona, quando clicco per la prima volta su una delle voci, riconosce che la variabile "slider" esiste per cui distrugge questo slider facendo generare quello nuovo (slider_sel) senza problemi.
Il problema si pone quando clicco su un' altra delle voci, non riconosce la varibile var slider_sel generata con il click precendente e così non mi distrugge lo slider prima di ricrearlo....
Premetto che non sono un programmatore javascriot e che di solito il mio utilizzo delle jquery si limita a piccole righe singole di codice, fin qui sono riuscito ad arrivare attraverso le varie guide ed esempi trovati su questo forum e su altri, ma qui proprio non riesci a capire cosa non faccia funzionare il tutto
PS:
ho provato ad utilizzare anche un altro public method messo a disposizione su BxSlider.com, ReloadSlider, ma ricarica lo stesso slider senza i nuovi elementi selezionati...
inoltre, il sito come potrete vedere ha un layout liquido con dimensioni dei div in percentuale, il che ha limitato le mie possibili soluzioni al problema
Ho scelto le jquery anzichè il javascript puro per scongiurare possibili problemi di compatibilità cross-browser...
Spero che qualcuno possa aiutarmi perchè sono ormai due giorni che ci lavoro senza successo... grazie in anticipo![]()
Qui potete trovare la pagina di prova del sito online: http://www.jeanclaudechiementin.com/.../progetti.html