2011-08-07 8 views
0

J'ai créé une fonction appelée billingOptions() associée à un élément dropdown (select). Lorsqu'un utilisateur sélectionne une option dans la liste déroulante, la fonction est exécutée.Jquery onChange exécute cette fonction

La liste déroulante sera ajoutée dynamiquement à la page ... à chaque fois que vous ajoutez la fonction billingOptions() onChange. J'essaie d'utiliser Jquery pour trouver l'instance la plus proche du class = rate dans la liste déroulante qui a été modifiée. Gardez à l'esprit que les listes déroulantes sont ajoutées dynamiquement afin qu'il puisse y avoir plusieurs instances de .rate ...

J'ai essayé d'utiliser "ceci" et "le plus proche" pour trouver le cours le plus proche (je ne suis même pas sûr que vous peut utiliser une classe avec la fonction la plus proche). Voici le code:

*** on m'a demandé de fournir la structure exacte du HTML (. Les lignes de la table sont générées dynamiquement Le tableau est statique).

<table id="billTasks"> 
<tr> <input class="taskNameInput" type="text" size="52" placeholder="Task Name" name="task:1" disabled="disabled"> <select class="billOptions" onchange="billingOptions(this)"> 
<option class="fixedRate">Bill Fixed Rate</option> 
<option class="hourly">Bill Hourly</option> 
</select> 
<input type="text" name="fixedRate" placeholder="Rate" class="fieldWidth100 rate"/> 
</tr> 
</table> 

function billingOptions(){ 
$(this).closest('.rate').hide(); 
} 

*** EDIT: ce code ne fonctionne pas. Le but est de cacher l'élément input.rate.

+1

cela semble bien, à quel problème faites-vous face? – Mrchief

+0

est-ce que cela fonctionne correctement? http://jsfiddle.net/vzfyz/ –

+0

rien ne se passe. J'ai édité le code pour montrer l'entrée avec la classe .rate. –

Répondre

0

Edit: Tout d'abord, vous êtes la moitié droite de votre préoccupation que this n'est pas passé à la fonction. Il est étant passé, mais il n'est pas utilisé. Donnez votre fonction d'un paramètre nommé, et référence au lieu de this:

function billingOptions(el) 
{ 
    $(el).something()... 
} 

est-.rate toujours l'élément suivant? Si oui:

$(el).next(".rate").hide(); 

Est-ce que .rate est toujours un frère? Y aura-t-il un seul .rate frère ou sœur? Si oui:

$(el).siblings(".rate").hide(); 

Will .rate partagent un parent commun avec votre sélection, et être la seule instance de .rate dans ce parent commun? Si oui:

$(el).closest(".commonParentClassName").find(".rate").hide(); 

Si aucune de ces méthodes ne vous convient, veuillez fournir plus de détails sur la structure de votre code HTML.

Modifier: Merci d'avoir posté la structure de votre code HTML. Il vous manque <td> dans votre code HTML. En supposant que votre code réel comprend le <td>, et en supposant qu'il n'y a qu'une seule .rate par ligne, essayez ceci:

function billingOptions(el) 
{ 
    $(el).closest("tr").find(".rate").hide(); 
} 
+0

aucun de ceux-ci travaillé. Voici le code HTML généré: (les lignes de la table sont générées dynamiquement.La table est statique).

< select class = "billOptions" onchange = "billingOptions (this)">

+0

@mitch - J'ai mis à jour ma réponse avec quelque chose qui va probablement résoudre votre problème. Voir le paragraphe ajouté en haut de ma réponse. – gilly3

+0

@mitch - J'ai posté une solution qui utilise votre code HTML et référence correctement le paramètre passé à la fonction. Voir mon édition en bas. – gilly3

0

Vous avez pas vraiment posé une question, autre que fonctionne le plus proche avec une classe, je mis en place ce violon pour vous montrer qu'il fait:

http://jsfiddle.net/JAjFF/

Si vous pouvez nous dire ce qui est la question, avez-vous essayé le code ci-dessus, ça marche? Quel est le problème sinon? Ensuite, je vais modifier ma réponse.

+0

Non, désolé ... ça ne marche pas. J'ai ajouté plus de détails à ma question originale. Désolé pour ça. –

+0

Je pense que c'est le problème, mais qu'est-ce que j'utilise pour un ancêtre? --closest parcourt l'arbre DOM vers le haut, en commençant par l'élément sélectionné. Si l'élément que vous recherchez n'est pas un ancêtre de l'élément sélectionné, le plus proche ne le trouvera pas. –

0

Il est difficile de savoir exactement ce que votre code essaie de faire, mais il y a quelques problèmes avec elle .Premièrement, vous transmettez un élément DOM dans votre fonction, mais votre fonction n'a aucun paramètre déclaré et vous n'accédez pas à l'argument que vous transmettez. En outre, this fait référence à l'objet Window, pas à élément que vous voulez. Changement à cette (en passant dans un argument nommé et en utilisant que la place de this) résoudrait que:

function billingOptions(elem){ 
    $(elem).closest('.rate').hide(); 
} 

Vous pouvez également utiliser la collection arguments au lieu d'utiliser un argument nommé, mais je suggère la méthode ci-dessus au-dessus de ça.

Le problème suivant est que la méthode closest grimpe l'arborescence DOM jusqu'à ce qu'elle trouve le premier élément qui correspond au sélecteur que vous lui transmettez. Dans votre cas, comme this fait référence à l'objet Window, closest ne va pas trouver un ancêtre correspondant à votre sélecteur.

Il est également peu probable que la fonction ci-dessus résoudra ce problème, car d'après l'apparence de votre code, .rate n'est pas un ancêtre de l'élément sélectionné. Je voudrais vraiment plus d'informations sur la façon dont votre HTML est structuré pour vous aider à sélectionner l'élément correct .rate (par exemple, y aura-t-il toujours un seul élément .rate, dans le même conteneur que le select? Si tel est le cas, voici un working example).

+0

Pourquoi la downvote? –

+0

'ceci' n'est pas déterminé par la présence ou l'absence de paramètres. Si la fonction est utilisée de cette façon, cela fonctionnera: '$ (". BillOptions "). Change (billingOptions)'. jQuery n'impose pas que les gestionnaires d'événements soient des fonctions anonymes. – gilly3

+0

Je sais que ce n'est pas ... c'est pourquoi dans mon exemple, j'ai changé 'this' en un autre nom de variable. Dans la fonction publiée dans la question, 'this' fait référence à l'objet Window. –

0

Est-ce que le plus proche() fonctionne avec un div? OUI, mais il est pour les éléments ancêtres

Si votre élément .rate est sur le même niveau que votre élément SELECT, vous devez utiliser .siblings()

Si votre élément est .rate dans votre élément SELECT, vous devez utiliser .children()

Si votre élément .rate est juste à l'extérieur de votre élément SELECT, vous devez utiliser .parent()

Si votre élément est .rate plus de quelques niveaux au-dessus de votre élément SELECT , vous devriez alors utiliser. le plus proche() pour trouver le plus proche.

Aussi, votre fonction est bien, vous avez juste besoin de mettre à jour votre sélecteur.