2010-02-05 5 views
0

J'ai un petit problème avec une boîte de dialogue jQuery et la manière dont les scripts sont traités.Scripts de boîte de dialogue jQuery pour l'entrée val

Dans la boîte de dialogue html, je

<input id="test"> 

Si je

<script type="text/javascript> 
    $('#test').val("haha") 
</script> 

après l'entrée, il apparaît. Si je le mets avant, cela ne fonctionne pas. Maintenant, le problème est que j'essaie de changer la valeur de $ ('# test') en utilisant un déclencheur de clic, et je ne peux pas! L'alerte fonctionne et le remplacement initial de val fonctionne, ce qui signifie qu'il n'y a pas de zones d'entrée en double ou manquantes.

Le script tout comme il est maintenant, ne fonctionne pas:

<input type="button" class="testbutton" /> 
<input type="text" size="10" id="test" name="test" value=""> 

$('#test').val("currentvalue"); // This works 
     $('.testbutton').click(function() { 
       alert();  
       $('#test').val("haha"); 
     }); 

Mise à jour La boîte de dialogue affiche la valeur correcte dans #test une fois la boîte de dialogue est fermé puis rouvert. Serait-ce quelque chose qui me manque?

+0

Etes-vous sûr que 'val()' est ici? Afaik c'est pour ''. Essayez 'attr (" value ")' – ZeissS

+1

@ZeissS - 'val()' fonctionne bien pour les entrées –

+0

En effet, 'val()' est meilleur. 'attr ('value')' arrive à fonctionner pour les entrées car il traduit en JavaScript '.value' sur le noeud HTMLInputElement. Il * n'accède pas * à l'attribut HTML 'value', ce qui est complètement différent: l'attribut' value' correspond à la propriété JavaScript '.defaultValue', pas' .value'. – bobince

Répondre

0

Le problème a fini par être le # dans le test. Pour une raison quelconque, le remplacement fonctionne avec un identifiant de classe au lieu d'un identifiant id. Je suppose que c'est parce que le # ne remplacera qu'une seule instance, et pour une raison que je n'ai pas encore découverte, il y a plus d'une instance du dialogue (ou une instance cachée).

Merci pour toutes vos suggestions!

2

Mettez votre code jQuery dans $(document).ready(function() {...your code...}). Cela le fera exécuter après le navigateur crée l'arborescence DOM pour votre page. Sinon, javascript n'est pas capable de rechercher/manipuler les éléments DOM correctement. Il se présentera comme suit:

$(document).ready(function() { 
    $('.testbutton').click(function() { 
      $('#test').val("haha"); 
    }); 
}); 

Mise à jour:

Si votre code HTML est chargé dynamiquement, puis utilisez live pour lier gestionnaire d'événements:

$(document).ready(function() { 
    $('.testbutton').live("click", function() { 
      $('#test').val("haha"); 
    }); 
}); 
+0

Eh bien, si c'est un dialogue, il est possible qu'il soit chargé via AJAX, et qu'il s'agit d'un fragment HTML. Si tel est le cas, aucun événement "prêt" ne sera déclenché pour ce contenu. – Pointy

+0

Il devrait fonctionner ... – Rifat

+0

Non, ne fonctionne pas.Le dialogue est un événement post-DOM de toute façon, donc ajouter un document.ready dans une boîte de dialogue n'a pas vraiment de sens, je pense? – Rio

0

Je suppose que vous devriez envelopper votre code à l'intérieur d'un $ (function() {// code ici}); pour vous assurer que votre code est exécuté uniquement lorsque votre DOM est prêt.

+0

Encore une fois, si le contenu du dialogue est un fragment HTML chargé via AJAX, il n'y a pas d'événement "prêt". Bien sûr, je ne sais pas comment fonctionne son dialogue, car la question initiale ne décrit pas très bien l'environnement. – Pointy

+0

Si vous chargez le HTML via AJAX, vous devez exécuter la méthode bind après avoir chargé le code HTML dans le DOM, cela dépend du cas d'utilisation spécifique. –