Il y a environ un mois, la question de Mitt est restée sans réponse. Malheureusement, je me retrouve dans la même situation maintenant.
http://api.jquery.com/change/#comment-133939395
Voici la situation: jQuery est utilisé pour capturer les modifications d’un bouton radio. Lorsque le bouton radio est sélectionné, j'active une zone d'édition. Lorsque le bouton radio est désélectionné, je souhaite que la zone d'édition soit désactivée.
L'activation fonctionne. Lorsque je choisis un bouton radio différent dans le groupe, l'événement change
est déclenché non. Est-ce que quelqu'un sait comment réparer ceci?
<input type="radio" id="r1" name="someRadioGroup"/>
<script type="text/javascript">
$("#r1").change(function () {
if ($("#r1").attr("checked")) {
$('#r1edit:input').removeAttr('disabled');
}
else {
$('#r1edit:input').attr('disabled', true);
}
});
</script>
On dirait que la fonction change()
n'est appelée que lorsque vous cochez une case d'option, pas lorsque vous la décochez. La solution que j'ai utilisée consiste à lier l'événement change à chaque bouton radio:
$("#r1, #r2, #r3").change(function () {
Ou vous pouvez donner le même nom à tous les boutons radio:
$("input[name=someRadioGroup]:radio").change(function () {
Voici un exemple de travail jsfiddle (mis à jour à partir du commentaire de Chris Porter).
Selon le commentaire de @ Ray, vous devriez éviter d'utiliser des noms avec .
en eux. Ces noms fonctionnent dans jQuery 1.7.2 mais pas dans les autres versions ( exemple jsfiddle. ).
<input id='r1' type='radio' class='rg' name="asdf"/>
<input id='r2' type='radio' class='rg' name="asdf"/>
<input id='r3' type='radio' class='rg' name="asdf"/>
<input id='r4' type='radio' class='rg' name="asdf"/><br/>
<input type='text' id='r1edit'/>
jquery part
$(".rg").change(function () {
if ($("#r1").attr("checked")) {
$('#r1edit:input').removeAttr('disabled');
}
else {
$('#r1edit:input').attr('disabled', 'disabled');
}
});
Vous pouvez vous connecter à tous les boutons radio en même temps par leur nom:
$('input[name=someRadioGroup]:radio').change(...);
Exemple de travail ici: http://jsfiddle.net/Ey4fa/
Cela fonctionne normalement pour moi:
if ($("#r1").is(":checked")) {}
Mon problème était similaire et cela a fonctionné pour moi:
$('body').on('change', '.radioClassNameHere', function() { ...
Supposons que ces boutons radio se trouvent dans une div
qui porte l'identifiant radioButtons
et que les boutons radio ont le même nom (par exemple commonName
), puis:
$('#radioButtons').on('change', 'input[name=commonName]:radio', function (e) {
console.log('You have changed the selected radio button!');
});
L'événement change
qui ne se déclenche pas lors de la désélection est le comportement souhaité. Vous devez utiliser un sélecteur sur l’ensemble du groupe de radio plutôt que sur le bouton radio unique. Et votre groupe de radio devrait avoir le même nom (avec des valeurs différentes)
Considérons le code suivant:
$('input[name="job[video_need]"]').on('change', function () {
var value;
if ($(this).val() == 'none') {
value = 'hide';
} else {
value = 'show';
}
$('#video-script-collapse').collapse(value);
});
J'ai le même cas d'utilisation que le vôtre, c'est-à-dire afficher une zone de saisie lorsqu'un bouton radio particulier est sélectionné. Si l'événement était également déclenché par une désélection, j'aurais deux événements à chaque fois.
Avec Ajax, pour moi a travaillé:
Html:
<div id='anID'>
<form name="nameOfForm">
<p><b>Your headline</b></p>
<input type='radio' name='nameOfRadio' value='seed'
<?php if ($interviewStage == 'seed') {echo" checked ";}?>
onchange='funcInterviewStage()'><label>Your label</label><br>
</form>
</div>
Javascript:
function funcInterviewStage() {
var dis = document.nameOfForm.nameOfRadio.value;
//Auswahltafel anzeigen
if (dis == "") {
document.getElementById("anID").innerHTML = "";
return;
} else {
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("anID").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("GET","/includes/[name].php?id="+dis,true);
xmlhttp.send();
}
}
Et php:
//// Get Value
$id = mysqli_real_escape_string($db, $_GET['id']);
//// Insert to database
$insert = mysqli_query($db, "UPDATE [TABLE] SET [column] = '$id' WHERE [...]");
//// Show radio buttons again
$mysqliAbfrage = mysqli_query($db, "SELECT [column] FROM [Table] WHERE [...]");
while ($row = mysqli_fetch_object($mysqliAbfrage)) {
...
}
echo"
<form name='nameOfForm'>
<p><b>Your headline</b></p>
<input type='radio' name='nameOfRadio' value='seed'"; if ($interviewStage == 'seed') {echo" checked ";} echo" onchange='funcInterviewStage()'><label>Yourr Label</label><br>
<input type='radio' name='nameOfRadio' value='startup'"; if ($interviewStage == 'startup') {echo" checked ";} echo" onchange='funcInterviewStage()'><label>Your label</label><br>
</form> ";
Même problème ici, cela a bien fonctionné:
$('input[name="someRadioGroup"]').change(function() {
$('#r1edit:input').prop('disabled', !$("#r1").is(':checked'));
});