2010-08-24 4 views
14

Ich bin die Abrufen der Breite von Elementen mit jQuery und würde es bevorzugen, wenn ich eine Angabe haben könnte, ob es eine explizite Breite (und Höhe) angegeben wurde.Erkennung der Breite: Auto in jQuery

Dadurch wird die implizite Breite des div in Bezug auf die Anzahl der Pixel, die es auf dem Bildschirm des Clients belegt, angezeigt. Gibt es eine Möglichkeit, dass, wenn die Breite fehlt oder als width: auto festgelegt ist, dass es mit jQuery überprüft werden kann?

Das heißt, anstelle des obigen Beispiels, das eine ganze Zahl zurückgibt, würde es entweder auto oder undefined zurückgeben. Oder gibt es alternativ eine isAuto Funktion?

+0

Eine etwas andere, aber verwandte Frage: http://StackOverflow.com/q/8816660/583539 – moey

Antwort

8

Ich glaube nicht, dass es für den Moment möglich ist. Zumindest nicht in einem anderen Browser als IE. IE implementiert element.currentStyle, die Stile darstellt, bei denen sie in der CSS-Datei geschrieben wurden. Auf der anderen Seite implementiert der Rest der Browser window.getComputedStyle, die die berechneten Werte dieser Stile zurückgibt. Das ist, was Sie dort erhalten, ein numerischer Wert anstelle von Auto.

Die einzige Möglichkeit wäre es, CSS-Deklarationen von document.styleSheets zu analysieren.

Referenzen:

+0

Siehe @prdaturs Antwort auf .prop(). Dies kann "auto" zurückgeben. –

+1

@RobertWaddell, das nur für Stile funktioniert, die innerhalb eines 'style' * Attributs * deklariert sind. Es wird für nichts anderes funktionieren. https://jsfiddle.net/6m3p4rqp/ –

+0

@ ionut-g-stan Interessanterweise gibt es einen mittleren Grund: Wenn width automatisch programmgesteuert (jQuery) festgelegt wird, funktioniert die Verwendung von .prop() zum Abrufen der Breite. Kein Wunder, dass es hier eine Inkonsistenz zwischen den Lösungen gibt. Es scheint zu funktionieren, wenn es inline oder programmatisch gesetzt ist, aber nicht, wenn es rein in CSS-Regeln eingestellt ist. Sie können diese Geige sehen, um die obige Note in Aktion zu sehen. https://jsfiddle.net/bvh1e5ud/ By the way, würde ich mein Downvote entfernen, aber es ist in. –

0

Ich bin nicht ganz sicher, ob ich Ihre Frage richtig beantworte, aber wenn Sie width() function verwenden, erhalten Sie eine Ganzzahl, die die gerenderte Breite in Pixeln darstellt.

+0

Ja, das Problem, das es tut, auch wenn keine Breite explizit in der CSS für das Element angegeben ist.

gibt einen ganzzahligen Wert zurück. Ich möchte, dass es "auto" zurückgibt (oder um herauszufinden, ob es automatisch ist oder nicht). –

+2

Dies ist eine schwierige Frage, denn selbst mit '$ ('element'). Css (" width ");' scheint immer einen Wert für die Pixelbreite eines Objekts zurückzugeben. Auch wenn es auf 100% eingestellt ist. Dies entspricht im Wesentlichen der Verwendung des in der ersten Antwort vorgeschlagenen GetComputedStyle. – Nilloc

0
  1. erstellen Funktion
  2. CSS
  3. Element ID Pass funktionieren
  4. schreiben, einen Fall, wo Aussage über die Breite Eigenschaft des Elements ID

NOTE durchgeführt werden: auf mulitple Elemente zu verwenden wäre weise eine Schleife mit einer Reihe von Elementnamen zu verwenden

4

$('#test')[0].style.width=="auto" funktionieren sollte: http://jsfiddle.net/KxTLE/ und http://jsfiddle.net/KxTLE/1/

jQuery.fn.isAuto=function() { 
if(this[0]) { 
    var ele=$(this[0]); 
    if(this[0].style.width=='auto' || ele.outerWidth()==ele.parent().width()) { 
     return true; 
    } else { 
     return false; 
    } 
} 
return undefined; 
}; 

und Beispiel Versuchen: http://jsfiddle.net/KxTLE/6/

+0

Nizza Konzept, aber this.style ist streng auf Inline-Stile beschränkt. Ich denke, ich habe es nicht spezifiziert, aber das wird offensichtlich ein kleines Problem sein. Obwohl es so aussieht, wird es ein Problem geben, egal was passiert. –

2

Soweit ich weiß, gibt es keine native jQuery-Funktion, um automatische Breiten oder Höhen zu erkennen. Also habe ich ein Plugin dafür geschrieben.

$.fn.isAuto = function(dimension){ 
    if (dimension == 'width'){ 
     var originalWidth = this.innerWidth(); 
     var marginLeft = parseInt(this.css('margin-left')); 
     var testMarginWidth = marginLeft+50; 
     this.css('margin-left', testMarginWidth); 
     var newWidth = this.innerWidth(); 
     this.css('margin-left', marginLeft); 
     if(newWidth<originalWidth){ 
      return true;  
     } 
     else{ 
      return false; 
     } 
    } 
    else if(dimension == 'height'){ 
     var originalHeight = this.height(); 
     this.append('<div id="test"></div>'); 
     var testHeight = originalHeight+500; 
     $('#test').css({height: testHeight}); 
     var newHeight = this.height(); 
     $('#test').remove(); 
     if(newHeight>originalHeight){ 
      return true;  
     } 
     else{ 
      return false; 
     } 
    } 
}; 

Ursprünglich hatte ich es geschrieben Höhe zu tun, so dass ich es nur Breite erweitert.Sie nennen es einfach so:

$('#element').isAuto('width'); 

oder

$('#element').isAuto('height'); 

hier ein fiddle ist das Plugin-Funktionalität demonstriert.

+0

Das gab mir den Hinweis, den ich brauchte. Ich musste überprüfen, ob die Höhe eines Blocks manuell eingestellt wurde oder nicht. Fügen Sie schnell ein 1px div hinzu und überprüfen Sie, ob die Höhe geändert wurde. Nun ... zumindest in Chrome bisher. – notacouch

+0

Ihre ISAuto ("Breite") funktionierte nicht in IE10 in meiner App. Das Ändern des Randes hatte keine Auswirkung (nicht einmal eine marginale;)) auf die innere Breite. Der angehängte Code, der dem Höhencode ähnlicher ist, hat jedoch richtig funktioniert. –

8

Dies wird entweder Zeichenfolge "Auto" oder "180px" auf absolute Werte erhalten.

$('element').prop('style').width 

zur Breite oder

$('element').prop('style').height 

zur Höhe.