2011-11-14 2 views
0

En utilisant JQuery, je charge un div d'une page HTML externe dans fancybox et je construis le lien en utilisant des variables. Il faut deux clics pour l'ouvrir. Le premier, je crois, ne fait que l'initier. Mais je ne sais pas comment le réparer. Y a-t-il une meilleure façon de faire cela?Fancybox prend 2 clics pour ouvrir le contenu chargé dynamiquement

Le code HTML est ici:

<a class="BannerVideoAwesome fancybox" id="series900" border="0" href="/mkting/Videos/Speakers.html"><img src="/images/titles/CM/series-speakers-video.jpg" border="0" align="left" /></a> 

Le jQuery est ici:

$('a.BannerVideoAwesome').live('click', function(e){ 
    e.preventDefault(); 
    var url = $(this).attr('href'); 
    var grabVid = '#' + $(this).attr('id'); 
    vidObject = url + grabVid; 
    var vidContents = vidObject.html(); 
    alert(vidContents); 
    $.fancybox({ 
      //'href': url, 
      'content':'vidContents' 
        }); 

Merci beaucoup d'avance pour toute personne d'aide peut me donner. J'ai lutté avec cela pendant des jours.

+0

Est-ce qui se passe dans tous les navigateurs? –

+0

Est-ce que cela aide? http://stackoverflow.com/questions/6510194/why-does-fancybox-require-two-clicks-activate –

Répondre

0

Je pense que le titre de votre message est un peu trompeur. Quoi qu'il en soit, si j'ai bien compris, vous voulez juste charger un contenu partiel (DIV) à partir d'un fichier html externe dans fancybox. Dans votre exemple, le fichier contient un episodeSpeakers.html DIV avec ID = « series900 »

<div id="series900">selected content</div> 

Si ce qui précède est exact, alors vous n'avez pas besoin d'utiliser en direct jQuery(), mais la liaison fancybox à un Cliquez sur() et utilisez ajax et dataFilter pour sélectionner le contenu.

Avec le même html, ce script devrait faire l'affaire:

$("a.BannerVideoAwesome").click(function() { 
var grabVid = "#"+$(this).attr('id'); 
$.fancybox(this,{ 
'type': 'ajax', 
'ajax': { 
    dataFilter: function(data) { 
    var vidContents = $(data); 
    vidContents = $(grabVid, vidContents); 
    return(vidContents); 
    } // datafilter 
} // ajax 
}); // fancybox 
return false; 
}); //click 

ou vous pouvez utiliser

$("a.BannerVideoAwesome").click(function(event) { 
event.preventDefault(); 
. 
. 

au lieu de

return false; 

IMPORTANT: En raison de problèmes de navigateur, n'utilisez pas la solution dataFilter ci-dessus. Il serait préférable d'utiliser la méthode inline de fancybox, en ajoutant le contenu partiel (à partir du fichier html externe) dans une DIV divisée dans votre document html appelant, puis déplacez-le de là dans fancybox. Il faut (bien sûr) ajouter un tel DIV. .: par exemple

<div style="display: none;"> 
<div id="fancyContent"></div> 
</div> 

Ensuite, utilisez ce script:

$("a.BannerVideoAwesome").click(function() { 
var grabVid = "#"+$(this).attr('id'); 
$.ajax({ 
type: "GET", // default 
dataType: "html",  
cache: false,      
url: this.href, 
success: function (data) { 
    $("#fancyContent").html(grabVid ? $("<div>").append(data).find(grabVid) : data); 
    $.fancybox({ 
    'href': "#fancyContent", 
    'onCleanup': function() { 
    var fancyContent = this.href; 
    $(fancyContent).unwrap().empty(); 
    } // onCleanup 
    }); // fancybox 
} // success 
}); //ajax 
return false; 
}); //click 

qui fonctionne sur la plupart des navigateurs. BTW, l'option onCleanup fixe this bug

+0

En fin de compte, je pense que le problème que j'avais était davantage lié au contenu que je chargeais dans fancybox, qui était un lecteur vidéo de Limelight. J'ai fini par initier le lecteur au chargement de la page, puis fancybox ouvert à droite avec ce code: $ ('a.BannerVideoAwesome'). Live ("clic", fonction (ev) { \t ev.preventDefault(); \t var grabVid = '#' + $ (this) .attr ("id"); // \t alerte (grabVid); \t .fancybox $ (ce, { \t \t \t \t \t 'type': « ajax », 'ajax': {DataFilter: function (données) { \t \t retour $ (données) .filter (grabVid) [0]}} 01 }); }); – codeNameLily

+0

J'ai testé DataFilter et cela ne fonctionne pas correctement dans tous les navigateurs. Si j'étais vous, je testerais le code sur différents navigateurs, si vous voulez une vraie compatibilité cross-navigateur bien sûr. – JFK

3

Essayez de passer de cliquez sur événement dans mouseover.

$('a.BannerVideoAwesome').live('mouseover', function(e){ 
... 
+0

pourquoi/comment cela fonctionne-t-il? ça a résolu mon problème, merci! –

+0

Normalement, fancybox fonctionne dès que l'élément a été chargé.Dans votre cas, vous affectez fancybox à un élément seulement après le clic, ce qui signifie que vous devez cliquer à nouveau sur l'élément pour lancer fancybox après que vous avez assigné en premier clic. Vous devez donc l'assigner avant de cliquer sur un élément, et dans ce cas, le survol de la souris fonctionnera avant le clic. –

0
$('a.BannerVideoAwesome').live('click', function (event) { 
    $.fancybox(this,{ 
     'autoDimensions': true, 
     'autoScale': true, 
     'transitionIn': 'none', 
     'transitionOut': 'none', 
     'type': 'ajax', 
     'padding': 0 
    }); 
    event.preventDefault(); 
}); 
Questions connexes