2009-03-08 8 views
1

Hé les gars, d'abord laissez-moi juste dire Im un jQuery noob! Je veux faire un simple plugin qui remplit automatiquement un élément de sélection html, ça marche bien sur le premier élément mais quand je l'appelle à nouveau pour remplir une seconde il n'apporte rien. Voici mes appels dans l'onglet ajax où #product et # new-catégorie sont les éléments select:Les premiers problèmes de plugin jQuery

$(function(){ 

    $("#product").popSelect("products"); 

    $("#new-category").popSelect("categories"); 

}); 

HTML:

><select id="product" name="product"> 
>  < option value="">Select Product</option>     
></select >  
><select id="new-category" name="new-category"> 
>  < option value="">Select Category< /option>     
></select > 

Et voici le plug-in:

(function(jQuery){ 
jQuery.fn.popSelect = function(table) { 

    return jQuery(this).each(function(){    

     var obj = jQuery(this); 

     if(this.nodeName.toLowerCase() == 'select'){ 
      jQuery.getJSON("../app/modules/ajax/json.php", { table:table }, 
       function(data){     
        var options = '';   
        jQuery.each(data, function(i,item){           
         options += '<option value="' + item.id + '">' + item.title + '</option>';     
        });     
        obj.append(options);     
       });  
     }; 
    }); 
}; 
})(jQuery); 

Bizarrement, si je change la deuxième fonction appelez $("#new-category").popSelect("categories"); à $("[id^='new-category']").popSelect("categories"); il fonctionne alors très bien, y at-il ething mal avec mon sélecteur?

Merci pour toute aide!

+0

Je vous recommande d'utiliser (function ($) {// code}) (jQuery); - De cette façon, vous pouvez utiliser le raccourci $ à la place de jQuery à chaque fois :) –

+0

Merci! Comme je l'ai dit je suis assez nouveau à ce sujet, donc tous les conseils sont très appréciés! Va modifier cela dès que possible! – OtakuD

+0

avez-vous cela sur les internets quelque part, donc je peux le regarder? – mkoryak

Répondre

1

Je viens de répondre à une question similaire, fondamentalement you can't have two elements with the same ID on the same page, il provoque ce problème. Vous devrez utiliser une classe ou changer l'un des ID.

+0

N'y a-t-il aucun moyen de séparer les 3 onglets ajax? Sinon, je vais devoir mettre au rebut les onglets de l'interface utilisateur de jQuery et juste charger via des liens qui ne sont pas aussi beaux ... Merci, j'utilise des classes pour l'instant! – OtakuD

+0

Je ne pense pas, sans changer les Ids pour les rendre uniques, ou en utilisant des classes. Vous essayez fondamentalement d'aller à l'encontre de la spécification HTML, qui dans ce cas semble être quelque chose que tous les navigateurs prennent au sérieux – spmason

0

Je n'ai pas de réponse directe mais il semblerait que vous ayez 2 appels ajax actifs en cours en même temps, ce qui pourrait conduire à une certaine étrangeté?

+0

Hmm, ok les deux appels étant le $(). PopSelect() ;? Comment est-ce que je corrigerais ceci? Cela expliquerait aussi pourquoi changer le sélecteur en $ ("[id^= 'new-category']"). PopSelect ("categories"); corrige le problème? Merci pour votre contribution! – OtakuD

+0

peut-être parce qu'il faut plus de cycles pour résoudre le sélecteur [id^= 'new-category'] vs le formulaire fast-to-fetch # ... voyez-vous le même comportement sur Firefox et Internet Explorer? –

+0

Il ne devrait pas être trop difficile de vérifier cette théorie: créer une file d'attente et mettre les appels json dans cette file d'attente. Cela devrait les faire courir un à la fois ... –

0

Alors quelque chose comme ça?

(function($){ 
jQuery.fn.popSelect = function(table) { 

    return $(this).each(function(){   

     var obj = $(this); 

     if(this.nodeName.toLowerCase() == 'select'){ 
      obj.queue("fx", function(){$.getJSON("../app/modules/ajax/json.php", { table:table }, 
       function(data){     
        var options = '';   
        $.each(data, function(i,item){           
         options += '<option value="' + item.id + '">' + item.title + '</option>';     
        });    
        obj.append(options);     
       }); }); 
     }; 
    });};})(jQuery); 

Je n'obtiens aucune erreur mais il remplit seulement la première sélection, même réponse dans IE. Puzzling, même ajouter une fonction "wait" entre les appels et il n'a rien fait. Est-ce que le tag id == name tag est correct? Quelque chose que je viens de remarquer, en remplaçant "id = 'new-category'" par "id = 'newwcategory'" le fait fonctionner !? Y at-il quelque chose qui ne va pas avec "-" dans ids?

Merci encore pour toute l'aide jusqu'à présent!

+0

Il ne devrait pas y avoir de problème avec avoir des traits d'union dans les identifiants. voir http: // stackoverflow.com/questions/70579/what-is-a-value-for-id-attributes-in-html –

+0

Cependant, il peut y avoir un problème avec les traits d'union dans les valeurs d'option car ce sont des types CData. Voir http://htmlhelp.com/reference/html40/values.html –

+0

Hmm, mes valeurs d'option sont: item.id = entier et item.value = string (az) donc je ne peux pas voir un problème là, même changé la variable nom en vain. Désolé si j'ai mal compris quelque chose. – OtakuD

0

Ok J'ai depuis établi qu'il s'agit d'un problème avec les onglets de l'interface utilisateur jQuery car le plugin fonctionne parfaitement sans eux!Les éléments de l'onglet sélectionné ne coûtent pas être renseigné si l'onglet sélectionné précédemment avait un élément du même id par exemple:

premier onglet:

< select id = « new_category » name = « new_category » > < option value = ""> Sélectionner la catégorie

Deuxième Tab:

< select id = nom "produit" = "produit"> < option value = ""> Sélectionner un produit </option> </select>

< select id = "" name = "new_category new_category "> < option value =" "> sélectionner la catégorie </option> </select>

Thrid Tab:

< select id = nom "produit" = "produit"> < option value = ""> Sélectionner un produit </option> </select>

Allant de Tab 1 à l'onglet 2 - produit sera peuplé mais pas new_category et allant de tab 2 à l'onglet 3 - produit ne sera pas peuplée ...

-à-dire si un élément avec un équivalent identifiant à un onglet précédent existe dans l'onglet en cours , il ne sera pas peuplé et (possib ly?) l'élément précédent sera bien que je ne peux pas voir cela car il n'est pas chargé. Ive essayé de violer avec cache, mais il n'aide pas, en spécifiant l'ID de formulaire que son parent devrait résoudre ce problème, mais pourquoi est-il nécessaire, ne devrait pas les onglets être indépendant?

Merci pour toute information à ce sujet!