Hinzufügen einer Klasse mit display none, um ein element nach jQuery hide / show produziert unerwartete Ergebnisse
Habe ich eingekocht, den code aus einer viel größeren Anwendung, das problem zu replizieren.
Hinzufügen einer Klasse, enthält nur display: none;
Liste Elemente nach ausgeblendet wurden (hide()
) und dann angezeigt (show()
) verlässt das element mit einem style="display: list-element;"
und verlässt jene Elemente sichtbar, weil der inline-style überschreibt die Klassen. Als ein Beispiel kann hier gefunden werden - http://jsfiddle.net/jayblanchard/x5bpjogj/2/ werden Sie wollen, um die browser-Konsole zu sehen, die änderungen an der DOM-wie hier gezeigt -
Hier ist die CSS -
.anchor-control-hidden {
display: none;
}
Hier ist der JavaScript - /jQuery -
var anchor = 'F1';
$('[data-anchor="'+anchor+'"]').find('.anchor-control').hide().show(); //this is done to replicate the problem
setAnchorControlButtons(anchor);
function setAnchorControlButtons(anchor){
state = $('[data-anchor="'+anchor+'"]').attr('data-status');
$('[data-anchor="'+anchor+'"]').find('.anchor-control').addClass('anchor-control-hidden');
if( $('[data-anchor="'+anchor+'"]').attr('data-ahv') == 'null' ) {
var ahvExists = false;
} else {
var ahvExists = true;
}
switch(state) {
case 'laid':
if( ahvExists ) {
$('[data-anchor="'+anchor+'"]').find('.anchor-fetch, .anchor-raise').removeClass('anchor-control-hidden');
} else {
$('[data-anchor="'+anchor+'"]').find('.anchor-rack, .anchor-fetch').removeClass('anchor-control-hidden');
}
break;
}
}
Und schließlich die markup -
<div data-anchor="F1" data-status="laid" data-ahv="null">
<ul class="anchor-controls">
<li class="anchor-control anchor-lay" data-action="anchor-lay">
<div class="anchor-tile"><span class="button-label" style="top: 31%;">Lay</span>
</div>
</li>
<li class="anchor-control anchor-drop" data-action="anchor-drop">
<div class="anchor-tile"><span class="button-label" style="top: 31%;">Drop</span>
</div>
</li>
<li class="anchor-control anchor-fetch" data-action="anchor-fetch">
<div class="anchor-tile"><span class="button-label" style="top: 31%;">Fetch</span>
</div>
</li>
<li class="anchor-control anchor-raise" data-action="anchor-raise">
<div class="anchor-tile"><span class="button-label" style="top: 31%;">Raise</span>
</div>
</li>
<li class="anchor-control anchor-retrieve" data-action="anchor-retrieve">
<div class="anchor-tile"><span class="button-label" style="top: 31%;">Retrieve</span>
</div>
</li>
<li class="anchor-control anchor-rack" data-action="anchor-rack">
<div class="anchor-tile"><span class="button-label" style="top: 31%;">Rack</span>
</div>
</li>
</ul>
</div>
Habe ich abgestreift alle irrelevant, CSS und markup. Im Beispiel nur zwei der Elemente der Liste (rack-und fetch) sollte sichtbar sein. Ändern der data-ahv
- Attribut auf die div
führen sollte, dass nur zwei Listenelemente (heben und zu Holen) dargestellt werden.
Ich habe versucht, das entfernen Sie das style-Attribut aus der Liste Element, und das ergibt andere ungewöhnliche Verhalten. Muss ich beenden mit hide()
und show()
zu Gunsten von expliziten Klassen-oder kann dieses Problem gelöst werden, in irgendeiner anderen Art und Weise?
- basierend auf diese Antwort http://stackoverflow.com/a/6553745/2359055 es scheint, Sie können es einfach hinzufügen .css('display', "), wie Sie in diesem http://jsfiddle.net/x5bpjogj/4/
- Das ist eine der Methoden, die ich zuvor versucht und es hat seltsame Nebenwirkungen zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich aktualisiert Ihre Geige. Ich sehe keine sonderbare Verhalten durch hinzufügen
removeAttr
.removeAttr()
produzieren andere seltsame Verhalten in der Regelung der gesamten Anwendung. Es nicht die Frage geklärt werden, warum das style-Attribut ist immer noch da.display
alsblock
oder was Sie wollen, oder fügen Sie es im style-Attribut. Haben Sie es ausprobiert? Was genau Sie wollen, zu halten, im style-Attribut nach der show versteckt?style=""
oder anderer Klassen zu ersetzenhide()
undshow()
. Manchmal wird der style-tag wird verwendet, um zu erleichtern, anderen Veranstaltungen, jQuery tun könnten, wie fades oder andere Animationen. Wenn Sie entfernen Sie das style-Attribut, ist es nicht mehr verfügbar zu diesen Veranstaltungen.In diesem Fall die code-Basis musste umgestaltet werden und die Verwendung von
.hide()
und.show()
musste entfernt werden, zugunsten von Klassen gelten diedisplay
Eigenschaft mehr explizit. Dies erlaubt es, das Verhalten zu mehr vorhersehbar und für weitere Funktionen zu dem Projekt Hinzugefügt werden, mit so wenig Schmerzen wie möglich.