Reputation: 36
I'm trying to set the value of the input[type=hidden]
that is closest to the tag <img src="off.png">
or <img src="on.png">
Is there something I don't get. Any suggestions?
$(document).on('click', 'img.toggle', function() {
var atr = $(this).attr("src");
var ths = $(this);
if (atr == "off.png") {
$(this).attr("src", "on.png");
$("input[type='hidden']").closest(ths).val("on");
}
if (atr == "on.png") {
$(this).attr("src", "off.png");
$("input[type='hidden']").closest(ths).val("off");
}
console.log($("input[type='hidden']").closest(ths).val());
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<fieldset>
<legend>Instalacja elektryczna:</legend>
<div class="separator">
Posiadana instalacja 3 fazowa
<input class="xForm" type="hidden" name="instalacja_trojfazowa" />
<img class="toggle" src="off.png" />
</div>
<div class="separator">
Instalacja posiada "Neutral"
<input class="xForm" type="hidden" name="posiada_neutral" />
<img class="toggle" src="off.png" />
</div>
<div class="separator">
Instalacja posiada "Uziemienie"
<input class="xForm" type="hidden" name="posiada_uziemienie" />
<img class="toggle" src="off.png" />
</div>
<div class="separator">
Napięcie na 1 fazę +-10%
<input class="xForm" type="text" name="napiecie_nafaze" />
</div>
<div class="separator">
Nie znam tych parametrów
<input class="xForm" type="hidden" name="nie_znamparel" />
<img class="toggle" src="off.png" />
</div>
</fieldset>
Upvotes: 1
Views: 50
Reputation: 2232
In your structute you need to use siblings , becouse img
and input:hidden
are at the same level, closest is looking in the parents and returns the first match
$(document).on('click', 'img.toggle', function () {
var atr = $(this).attr("src");
var ths = $(this);
var sibling = $(this).siblings('input:hidden')
if (atr == "off.png") {
$(this).attr("src", "on.png");
$(sibling).val("on");
}
if (atr == "on.png") {
$(this).attr("src", "off.png");
$(sibling).val("off");
}
alert($(sibling).val());
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<fieldset>
<legend>Instalacja elektryczna:</legend>
<div class="separator">Posiadana instalacja 3 fazowa <input class="xForm" type="hidden" name="instalacja_trojfazowa" /><img class="toggle" src="off.png" /></div>
<div class="separator">Instalacja posiada "Neutral" <input class="xForm" type="hidden" name="posiada_neutral" /><img class="toggle" src="off.png" /></div>
<div class="separator">Instalacja posiada "Uziemienie" <input class="xForm" type="hidden" name="posiada_uziemienie" /><img class="toggle" src="off.png" /></div>
<div class="separator">Napięcie na 1 fazę +-10% <input class="xForm" type="text" name="napiecie_nafaze" /></div>
<div class="separator">Nie znam tych parametrów <input class="xForm" type="hidden" name="nie_znamparel" /><img class="toggle" src="off.png" /></div>
</fieldset>
Upvotes: 0
Reputation: 943537
Look at the description of closest:
Description: For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
<input>
and <img>
are both void elements. They can't have children. The <img>
therefore cannot be the ancestor of the <input>
.
Your elements are siblings. Use the prev
method instead.
Better yet, don't use JavaScript at all. Make the hidden input a checkbox and put the image in its <label>
Upvotes: 2