2009-09-07 11 views
0

Après avoir inséré du nouveau html dans DOM, j'ai besoin d'ajouter des écouteurs.Y at-il une fonction onAvailable() dans jQuery?

Mais les nouveaux éléments ne sont pas disponibles à la fois.

Mon code:

$('#loader').clone().removeAttr('id').load("Views/chatBox.html").appendTo('body'); 
$('#chat') 
    .focus(function() { 
     $(this).addClass('jV'); 
    }) 
    .blur(function() { 
     $('#chat').removeClass('jV'); 
    }); 

Ce qui ne fonctionne pas.

Utiliser live() ne fonctionne toujours pas:

$('#chat').live('focus',function() { 
    $('#chat').addClass('jV'); 
}) 
.live('blur',function() { 
    $('#chat').removeClass('jV'); 
}); 
+0

Est-ce que #chat est chargé dans chatBox.html? – PetersenDidIt

+1

Il n'y a pas de raison de doubler ... –

+0

http://stackoverflow.com/questions/1387464/how-to-do-something-when-available-with-jquery – bastianneu

Répondre

0

Si #chat est dans le chatBox.html que vous chargez, vous pouvez profiter de la fonction de rappel que la charge a:

$('#loader').clone().removeAttr('id').load("Views/chatBox.html",function(){ 
    $('#chat').focus(function() { 
     $(this).addClass('jV'); 
    }) 
    .blur(function() { 
     $('#chat').removeClass('jV'); 
    }); 
}).appendTo('body'); 

http://docs.jquery.com/Ajax/load#urldatacallback

+0

Seulement celui-ci fonctionne! – omg

+0

Pourquoi les autres versions ne fonctionnent pas? Tout semble OK, non? – omg

+0

Live ne prend en charge qu'une courte liste d'événements. l'accent n'est pas l'un d'entre eux. Les docs jquery sont vos amis: http://docs.jquery.com/Events/live#typefn – PetersenDidIt

2

Utilisez jQuery.live() à la place. live() va lier les gestionnaires d'événements lorsque les éléments sont créés. Il nécessite jQuery 1.3+.

Editer: Il semble que le chat div n'est probablement pas encore chargé, donc c'est toujours un problème. Je vous suggère de changer quelque peu votre schéma. Tout d'abord, dans votre document ont une zone où tous les chats sont:

<div id="chat"></div> 

puis vous avez:

$(function() { 
    $("#chat div.chat").live("focus", function() { 
    $(this).addClass("jV"); 
    }).live("blur", function() { 
    $(this).removeClass("jV"); 
    }); 
}); 

La différence ici est que vous ajoutez divs avec une classe de conversation à la zone de discussion (qui a un ID de chat). Ensuite, vous faites simplement:

$('#loader').clone().removeAttr('id').load("Views/chatBox.html").appendTo('#chat'); 
+0

Il suffit de vérifier la documentation ... La dernière fois que je vérifié, tous les événements auxquels vous pouvez vous connecter normalement ne sont pas disponibles en utilisant live(). –

+0

@ Cletus, j'ai essayé de vivre(), mais ne fonctionne toujours pas. – omg

0

Si vous ajoutez des auditeurs à des éléments qui font partie des nouveaux éléments HTML/DOM créés à la volée, vous pouvez simplement attacher les événements à ces éléments créés lors de leur création en utilisant l'une des les gestionnaires d'événements jQuery appropriés. En cas de problème avec le contenu chargé en externe (comme les scripts/images), utilisez le gestionnaire d'événements .load() jQuery sur ces éléments pour les détecter lorsqu'ils sont disponibles dans le DOM et peuvent être manipulés. Comme mentionné par une autre affiche, .live() fonctionne aussi mais peut ne pas être nécessaire si vous avez le contrôle sur la création de l'élément vous-même - .live() ajoute une surcharge qui peut être excessive.

+0

Non, attacher directement les événements ne fonctionnera pas, j'ai collé mon code ici. – omg

0

Livequery fera ce que vous voulez. Il sera

« auto-magie événements se lient ou callbacks de tir pour éléments appariés, même après que la page a été chargée et le DOM mis à jour. »

Questions connexes