2010-08-18 22 views
1

Je veux être en mesure de définir la valeur d'un champ caché à la valeur d'un attribut rel dans un lien:jQuery pour définir la valeur d'un champ masqué?

$("#currentDir").val($(".jstree-clicked").attr("rel")); 

Mais cela ne fonctionne pas. Cette expression simple fonctionne très bien cependant:

$("#currentDir").val("TEST"); 

qui définit le champ caché avec id = CurrentDir à la valeur « TEST ». Mais pourquoi l'autre expression ne fonctionne-t-elle pas?

EDIT:

Comme l'a souligné, l'élément avec la jstree-clicked classe n'existe pas lorsque cette déclaration est appelée. Et comme je l'ai commenté ci-dessous, je suppose qu'il doit entrer en rappel. Mais je ne sais pas où (j'ai essayé plusieurs endroits, mais aucun d'entre eux ne fonctionne).

Voici le code JsTree:

<script type="text/javascript"> 
     var url; 
     $(function() { 
      $("#demo2") 
      .bind("loaded.jstree", function() { 
       alert($(".jstree-clicked").length); //This works as a callback, but unfortunately the cookie seems to not have been set yet... 

       $("a").click(function() { 
        url = "?url=" + $(this).attr("rel"); 
        $('#result').load('/Customers/Files/' + encodeURI(url)); 
        $('#currentDir').val($(this).attr("rel"));  
       }); 

      }).jstree({ 
       "html_data": { 
        "ajax": { 
         "url": "/Customers/Directories/" 
        } 
       }, 
       "ui": { 
        "select_limit": 2, 
        "select_multiple_modifier": "alt", 
        "selected_parent_close": "select_parent"//, 
       }, 
       "themes": { 
        "theme": "classic", 
        "dots": true, 
        "icons": true 
       }, 
       "plugins": ["themes", "html_data", "ui", "cookies"] 
      }); 

    }); 

    </script> 

Comme vous pouvez le voir, je l'ai déjà un rappel qui définit la valeur du champ caché CurrentDir en cliquant dessus. Mais comme il y aura aussi des postbacks, je recharge la page avec un plugin cookie qui positionne le JsTree au même niveau que précédemment, avec jstree-cliqué signifiant un dossier sélectionné. Donc, la fonction click fonctionne bien, et définit le currentDir, mais après une publication je dois entrer dans un autre callback (je suppose avec l'énoncé que j'ai demandé ici, ie après que l'arbre a été créé.)

« t pense qu'il ya vraiment ici que plusieurs personnes ont demandé, il a la classe et tout, mais je vais donner la même chose, de Firebug toute source html affichage Point:

<a rel="HtmlHelpers" class="jstree-clicked"><ins class="jstree-icon">&nbsp;</ins>HtmlHelpers</a> 

le problème semble que ce soit ne l'a pas encore quand la fonction est appelée. Donc, encore une fois, toute aide pour obtenir la déclaration au bon endroit (un rappel?) Apprécié!

EDIT 2:

Ok, alors je suis un rappel qui déclenche en fait après que l'arbre est chargé (voir plus dans la partie .bind ci-dessus avec un commentaire). Mais il semble que même si l'arbre est chargé (confirmé par une boîte d'alerte indiquant le nombre d'éléments), le plugin cookies ne semble pas avoir été lancé, donc la déclaration que je cherche est toujours inutile. L'instruction que j'ai insérée maintenant est celle suggérée dans l'une des réponses, pour vérifier si un élément jstree-cliqué existe et ce n'est toujours pas le cas. Donc, quelqu'un sait comment je peux obtenir cette invocation après que le cookie ait défini la classe jstree-clicked?

+0

s'il vous plaît donnez-nous votre code html contenant les éléments impliqués – jigfox

+0

+1, code s'il vous plaît –

+0

Le code que vous avez fonctionne très bien pour moi, le problème doit se trouver ailleurs. http://jsfiddle.net/e66kQ/ –

Répondre

0

Après beaucoup de googler, j'ai finalement trouvé la réponse. Si l'option cookie est utilisé, il faut utiliser cette place à la partie de liaison du jquery:

.bind("reselect.jstree", function() { 

Ensuite, le rappel ne déclenche qu'après le cookie a fixé l'élément sélectionné, et il fonctionne.

2

Cela n'a rien à voir avec la définition de la valeur mais l'obtention de la valeur à partir de l'attribut .jstree-clicked.

Essayez d'utiliser ce code pour voir si l'élément existe:

alert($(".jstree-clicked").length); 

Si elle retourne autre chose que> = 1 vous savez l'élément n'existe pas.

Même si vous avez plus d'un élément, la méthode .attr() renverra l'attribut souhaité pour les premiers éléments connus, alors peut-être votre .jstree-clicked classe existe ailleurs sans attribut rel.

http://api.jquery.com/attr/

+0

Vous avez raison, merci! Il n'y a aucun élément avec cette classe lorsque cette instruction est appelée. Vraisemblablement parce que le HTML lui-même est créé par le plugin JsTree. Je suppose que je dois insérer la déclaration comme un rappel pour la fonction JsTree, mais étant si nouveau à jQuery je suis confus quant à l'endroit où cela devrait aller. Je vais mettre à jour ma question avec un peu plus de code et j'espère avoir de l'aide pour savoir où faire ça! – Anders

+0

Ok, mais n'oubliez pas que si vous liez un événement à un élément (par exemple, cliquez, changez, etc.), vous devrez utiliser des méthodes spéciales pour que bind fonctionne après la création dynamique du code, mais pas avec les sélecteurs. Si vous utilisez firebug avec firefow, vous pourrez voir le HTML (arborescence DOM) tel qu'il est modifié par jQuery. –

+0

Ok, pas sûr que je suis :-) Je viens de poster le code complet, s'il vous plaît jeter un coup d'oeil et me montrer ce que j'ai besoin de faire ... Merci! – Anders