2011-09-29 3 views
1

Je n'ai pas été en mesure de trouver une réponse à ceci:jQuery sélectionner la variable élément

Mon HTML (simplifié) ressemble à ceci (il y a plusieurs contrôles différents sur la page: champs de texte, comboboxes, etc. .):

... 
<input name="name" onfocus="showHint(this, 'Please enter your name')" onblur="hideHint()" ...> 
... 

Une dans la fonction javascript showHint que je fais quelque chose comme:

function showFormEntryHint(control, text) 
{ 
    localOffset = 30; 
    $('#entry_hint').html(text); 
    var position = $(control).offset(); 
    position.left += $(this).offset() + localOffset; 
    position.top -= 5; 
    $('#entry_hint').position(position); 
    $('#entry_hint').fadeIn(); 
} 

l'idée est de positionner le div #entry_hint côté de la gare Le champ qui invoquait la fonction. Malheureusement, le sélecteur $(control) ne semble pas fonctionner - et .offset() retourne toujours {left: 0, top: 0}.

Une idée de comment je peux faire fonctionner ça? Merci beaucoup!

+1

Je recommande une bibliothèque d'info-bulles précalculée. – thomasfedb

+0

@thomasfedb: ce serait bien, mais les choses que nous devons coller dans cette info-bulle sont bien plus que du texte. Ce serait essentiellement xml/xslt chargé par ajax. –

+0

Juste une question rapide - pourquoi ne pas avoir une classe pour les champs de saisie, et définir les événements dans votre bloc de script? :) – Jeff

Répondre

0

bien juste se débarrasser du contrôle et vous pouvez utiliser $ (this) comme vous le faites pour position.left. pas sûr de ce que vous essayez d'accomplir avec $ (contrôle).

+0

Je ne sais pas exactement comment cela fonctionnerait. J'ai une douzaine de contrôles sur la page - quand 'showHint' a été invoqué, le contrôle, qui l'a invoqué est passé en paramètre. Est-ce que woud '$ (this)' évaluerait? –

+0

position.left + = $ (this) .offset() + localOffset; pour cette ligne, vous utilisez $ (this), ce qui devrait être équivalent à ce que vous essayez d'accomplir avec $ (contrôle) car pour le contrôle, vous le passez simplement "this" en premier lieu ... – Evan

+0

Oui! Apparemment, c'était exactement le problème. J'ai raté ce '$ (ceci)'! Quand j'ai remplacé la ligne par 'position.left + = $ (contrôle) .width() + localOffset;' - tout a fonctionné parfaitement. Même si vous n'avez pas répondu directement à ma question, vous m'avez indiqué la source du problème! –

2

Vous utilisez de toute façon jQuery; pourquoi s'en tenir aux gestionnaires d'événements de style DOMO?

le faire comme ceci:

<!-- simplified --> 
<input id='someInput' /> 

<script type='text/javascript'> 
jQuery(function($) { 

    // this is where we attach the event handlers 
    $('input#someInput') 
    .focus(function() { 
     showFormEntryHint(this, 'Please enter your name.'); 
    }) 
    .blur(function() { 
     hideHint(); 
    }); 
}); 
</script> 

Sauf que cependant, vous pouvez également rechercher des plug-ins ready-made pour faire le travail de poids pour vous si vous n'avez pas besoin d'une logique beaucoup plus personnalisé.

+0

Merci. Je vais probablement passer à l'utilisation de cette façon - mais je devais comprendre pourquoi ma solution originale ne fonctionnait pas correctement. –

Questions connexes