2011-03-20 6 views
0

J'ai essayé plusieurs méthodes pour filtrer une classe à partir d'une sélection, y compris filter() et find() mais je n'arrive pas à la faire fonctionner. J'essaie de créer une fonction «Lights Out» pour la vidéo actuellement visionnée. C'est un simple code, je dois faire quelque chose de fondamentalement faux ...Le filtre jQuery .not() ne fonctionnera pas

Vous pouvez voir le code sur www.jaygeorge.co.uk/gwennan-sage/showreel. Que se passe-t-il? Lorsque vous passez la souris sur la barre 'Lights Out', tout devrait disparaître SAUF la vidéo la plus proche qui a une classe 'jouée' dessus.

$(document).ready(function(){ 
$(".lightsout").hover(function() { 
    $(this).next().addClass('playing');  
    $('body').not(".playing").animate({opacity: 0, backgroundColor: 'black'}, 1000); 
}); 

});

+0

Je pense que vous devriez utiliser une superposition div plutôt que de faire cela. –

+4

'$ ('body'). Not (". Playing ")' ne fonctionne définitivement pas. '$ ('body')' will * only * sélectionne l'élément 'body', pas n'importe quel autre élément. 'not()' filtre la sélection en cours. Ainsi, il supprime l'élément 'body' de la sélection s'il n'a pas la classe' playing'. –

+0

Hmmm mon ami a suggéré d'utiliser un message superposé div, mais cela signifie que la définition d'index z, je pensais qu'il y aurait une méthode plus simple, juste en cachant tout 'sauf le div .playing. Y a-t-il un autre moyen d'y parvenir? – SparrwHawk

Répondre

3

Vous avez mal compris la .not method:

Etant donné un objet jQuery qui représente un ensemble d'éléments DOM, le procédé .not() construit un nouvel objet jQuery à partir d'un sous-ensemble des éléments correspondant à . Le sélecteur fourni est testé contre chaque élément; les éléments qui ne correspondent pas au sélecteur seront inclus dans le résultat.

Cela signifie que votre requête $('body').not('.playing') sélectionne tous les corps quine font pas partie de la classe.playing. En ce qui concerne l'effet d'extinction, il est généralement mis en œuvre en créant une div de 100% de largeur et 100% de hauteur superposée au reste du contenu.

+0

Merci George, avez-vous un exemple de code pour créer l'effet d'éclairage? Je ne veux pas paraître paresseux, je suis juste un débutant jQuery et il me faudra quelques heures pour comprendre cela. – SparrwHawk

+2

@Sparrohawx jQuery TOOLS [Expose] (http://flowplayer.org/tools/toolbox/expose.html) brancher. Sérieusement, si vous recherchez "jquery lights out" sur Google, vous trouverez beaucoup de solutions. – Haochi

2

Modifier cette ligne

$('body').not(".playing").animate({opacity: 0, backgroundColor: 'black'}, 1000); 

à cette

$('body *').not(".playing").animate({opacity: 0, backgroundColor: 'black'}, 1000); 
+0

Merci pour la suggestion, mais cela n'a pas fonctionné. – SparrwHawk

+1

Je les ai essayés en utilisant jsfiddle et ça fonctionne: http://jsfiddle.net/LSF9Z/. Peut-être que vous pouvez également publier le code HTML pour mieux comprendre votre problème. –

+0

Salut jSang, j'ai mis à jour jsfiddle pour qu'il corresponde un peu plus à mon code - http://jsfiddle.net/LSF9Z/1/ mais il semble avoir des problèmes. Peut-être parce que c'est un objet? – SparrwHawk

1

code final pour tous ceux qui cherchent à ce sujet. Solution prise de http://www.jankoatwarpspeed.com/post/2009/05/17/Use-jQuery-to-turn-off-the-lights-while-watching-videos.aspx

//=Jay. Create div before Showreel. 
$(document).ready(function(){ 
    $('.videopress').before("<div class='lightsout'><p>Once the video starts playing hover your mouse here to dim the lights.</p></div>"); 
    $('body').before("<div id='curtain'></div>"); 
}); 

//=Jay. Showreel Curtain down 
$(document).ready(function(){ 
    $(".lightsout").hover(function(){ 
     $(this).next().addClass('playing'); 
     $('#curtain').delay(500).fadeIn(); 
    }, function(){ 
     $(this).next().removeClass('playing'); 
     $('#curtain').fadeOut(); 
    }); 
}); 

et le CSS ...

/*=Jay. IE6 doesn't support Fixed positioning which is needed for the curtain below.*/ 
.ltie7 .lightsout { 
    display: none; 
} 

.lightsout:hover { 
    cursor: none; 
} 

#curtain { 
    position: fixed; 
    display: none; 
    left:0; 
    top:0; 
    width:100%; 
    height: 100%; 
    z-index:1000; 
    background: black; 
} 

.playing { 
    position: relative; 
    z-index: 1001; 
}