2010-12-09 3 views
2

J'ai une table et j'en ai besoin quand on clique sur un intervalle particulier, l'intervalle avant qu'il ne change d'une étiquette à un champ de texte. Ce qui suit est la table:Comment changer une étiquette en textfield avec jQuery quand son lien respectif est cliqué?

<table> 
    <tbody> 
     <tr> 
      <td><span class="spanName">John Doe</span>&nbsp;<span class="spanDefaultName">Alter</span></td> 
     </tr> 
     <tr> 
      <td><span class="spanName">Jayne Doe</span>&nbsp;<span class="spanDefaultName">Alter</span></td> 
     </tr> 
    </tbody> 
</table> 

Maintenant, supposons que le Alter après John Doe est cliqué, la durée avant qu'il doit changer de seulement John Doe à un champ de texte (Ceci est également valable pour tous les autres). Voici comment le résultat ressemblera si la durée alter John Doe est cliqué:

<table> 
    <tbody> 
     <tr> 
      <td><span class="spanName"><input type="text" /></span>&nbsp;<span class="spanDefaultName">Alter</span></td> 
     </tr> 
     <tr> 
      <td><span class="spanName">Jayne Doe</span>&nbsp;<span class="spanDefaultName">Alter</span></td> 
     </tr> 
    </tbody> 
</table> 

Si possible, et je pense qu'il est possible avec jQuery en utilisant: prochaine ou quelque chose de ce genre, je dois mettre en œuvre cela avec en utilisant seulement des classes et non des identifiants.

Aussi, si vous pensez que je devrais utiliser une ancre au lieu d'une portée, s'il vous plaît faites le moi savoir. J'utilise un span simplement à cause de: next et: fonctionnalités précédentes dans jQuery.

Toute aide serait grandement appréciée

Répondre

1

Quelque chose comme ceci:

$(".spanDefaultName").click(function() { 
    var text = $(this).prev("span").text(); 
    $(this).prev("span").hide(); 
    $(this).before('<input value="' + text + '" />'); 
    $(this).unbind("click"); 
}); 

Démo: http://jsfiddle.net/karim79/MWwyR/4/

+0

Le seul problème est la supprimerait la durée, en regardant son balisage, il voulait rester cette période. –

+0

C'était juste un exemple. Quoi qu'il en soit, changé pour '.hide()'. – karim79

+0

Cela fonctionne, et c'est très simple. Maintenant, comment puis-je l'implémenter de manière à ce que lorsque le lien de modification est cliqué et qu'il y ait le champ de texte, il revienne à l'étiquette? – seedg

0

Comment agit-il? $('span.clickable').click(function() { $(this).prevAll('span').last().html('<input ....>'); });

0

vous devriez être en mesure d'obtenir ce juste la façon dont il est en faisant:

$('.spanDefaultName').click(function() { 
    if($(this).prev().find(':input').length) { 
     var text = $(this).prev().val(); 
     $(this).prev().text(text); 
    } else { 
     var text = $(this).prev().text(); 
     $(this).prev().html('<input type="text" value="' + text + '"/>'); 
    } 
}); 

Cela obtenir le texte de la durée, de créer une zone de texte et insérez votre texte en elle. cela fonctionnera pour toutes les instances de ceci sur la page. Editer: selon la demande mise à jour, cette option bascule sur s'il y a un élément d'entrée dans l'intervalle requis. Si c'est le cas, il retournera au texte en utilisant la valeur de la zone de texte.

0

Je pense que cela devrait faire ce que vous voulez

$('span.spanDefaultName').click(function() { 

     val = $(this).prev().text(); 
     $(this).prev().remove(); 
     $(this).parent().prepend($('<input type="text" value="' + val + '" />')); 

    }); 

Bien que si vous allez soumettre ce formulaire à votre entrée aura besoin d'un attribut name

+0

Le balisage que vous ajoutez ne devrait pas être dans le sélecteur jquery, cela n'ajoutera pas de balisage mais recherchera un élément. –

+0

Ce n'est pas un sélecteur, il transforme le html en un objet jQuery. Cet exemple fonctionne, Si j'ai manqué quelque chose d'un problème de performance s'il vous plaît faites le moi savoir. –

+0

@Jerermy B, je ne peux pas commenter votre réponse ou la rejeter mais vous êtes manquant() après prev sur la dernière ligne de votre réponse. –

4

Vous obtiendrez la zone de texte sur clic, vous permettez pour ajuster le texte, puis sur flou, réglez la durée avec le nouveau texte entré. Example

JavaScript

$('.spanName').click(function() { 
    var $elem = $(this); 
    var text = $elem.text(); 
    var input = $('<input value="' + text + '" />') 
    $elem.text('').append(input); 
    input.select(); 

    input.blur(function() { 
     var text = input.val(); 
     input.parent().text(text); 
     input.remove(); 
    }); 
}); 

HTML

<table> 
    <tbody> 
     <tr> 
      <td><span class="spanName">John Doe</span>&nbsp;<span class="spanDefaultName">Alter</span></td> 
     </tr> 
     <tr> 
      <td><span class="spanName">Jayne Doe</span>&nbsp;<span class="spanDefaultName">Alter</span></td> 
     </tr> 
    </tbody> 
</table> 
Questions connexes