Zentrieren einer div mit einem "Loading..." spinner.gif mit jQuery und Ajax.BeginForm
Das Setup
Ich soll sehr einfach zu bedienen MVC-Assistenten. Die Kirsche auf dem Kuchen ist ein spinner gif angezeigt wird, wenn ich das ändern Schritt im Assistenten. Ich möchte es zentrieren auf der Seite, unabhängig von der Größe des browser-Fensters.
Können Sie dazu ein Beispiel an:
BITTE NICHT DEN ASSISTENTEN ABGESCHLOSSEN HABEN, ES SEI DENN, SIE HABEN EINE ENZEPHALITIS...
Das Problem
Problem ist, ich habe einen zentrierten CSS-layout, gesteuert mit der folgenden Regel:
#PageContainer
{
position:relative;
width:800px;
left:50%;
margin:0px 0px 0px -400px;
text-align:left;
}
Und diese Regel scheint zu interagieren stark mit dem jquery-code, der zentriert das div mit dem spinner gif. Dh, es spielt keine center.
Den Code
Mein MVC-form-code:
@using (Ajax.BeginForm(Model.Step.ActionName,
null,
new AjaxOptions { UpdateTargetId = "wizardStep", OnBegin="isValid", LoadingElementId="PleaseWait" },
new {@name="wizardForm", @id="wizardForm" } ))
{
@* do ajax stuff, see my "Loading... panel below *@
<div id="PleaseWait" style="display:none;">
Please Wait...
</div>
}
jQuery-code ist:
<script type="text/javascript">
jQuery.fn.center = function () {
this.css("position", "absolute");
this.css("top", ($(window).height() - this.height())/ 2 + $(window).scrollTop() + "px");
this.css("left", ($(window).width() - this.width()) / 2 + $(window).scrollLeft() + "px");
return this;
}
});
function isValid() {
$('#PleaseWait').center();
if (true) //In case i whant to return true
{
return true;
}
else //I whant to return false
{
$('#PleaseWait').hide(); //Manually hide the LoadingElementId
return false;
}
}
</script>
Meine Analyse
Als jQuery-code legt fest, bis das div-panel, um eine absolute position, es hat daher eine absolute position in Bezug auf das erste übergeordnete Element, das nicht über die position statisch (Standard).
Daher als Ergebnis die Marge hack verwendet, um die Mitte der Seite, es ist etwas, das schleichend in die jQuery-Berechnung, stört den apple-Warenkorb.
Ie:
Die jQuery-Berechnung basiert auf der Größe der Fenster, aber die position der #Bittewarten-panel positioniert ist, mit Bezug auf die #PageContainer div (div ist Bestandteil des Layouts). Offensichtlich sind diese zwei ganz verschiedene Dinge. Daher dachte ich, ich würde damit durchkommen, herauszufinden, die Konstante Werte zu subtrahieren Sie Links und oben sind die Berechnungen für die #Bittewarten div.
Aber die Ergebnisse sind unvorhersehbar, und ich bin jetzt zu verwirrt, um es herauszufinden. Hilfe!!!
Jede Hilfe sehr geschätzt.
JOB GEMACHT!:
Problem sortiert. Siehe Jim angenommen wird, ist die Antwort für die Ideen, die meine follow-up zu beantworten, die für die volle Umsetzung.
InformationsquelleAutor awrigley | 2010-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
aw,
weiß nicht, warum dies nicht eingetreten zu mir früher. Sie überwinden könnten, die gesamte Ausgabe der zusätzliche div in der master-Vorlage mit jquery. a la:
es kann oder kann nicht angemessen sein, aber sicherlich würde es zu begrenzen, nur die Seiten, die aktiv aufgerufen, die spinner....
ja, ich weiß, 'kpd' ganz gut. spielen ein "bisschen Musik" und verwendet werden, um in einer band mit einem Kerl namens 'eggo' von der kpd. Fragen Sie Ihren BIL, wenn er ihn kennt (ich bin sicher, er wird!!).. kleine Welt... und ja, feel free to get in touch, wenn Sie sind, auf diese Weise haben wir eine nette Gruppe von Freunden im Torhaus (der Flotte), wo es immer viel Musik/soziale Spaß zu haben.. 🙂 - ok, muss man zurück zur Aufgabe in der hand 'das Wochenende clearup'!!
InformationsquelleAutor jim tollan
Haben Sie daran gedacht, mit BlockUI, scheint ein guter Kandidat für diese. Ich habe es auf eines unserer Projekte vor und es ist sehr sehr gut.
InformationsquelleAutor Jamie
Hack 1:
Habe ich "löste" das problem, die habe ich verschoben in die #Bittewarten div ganz oben auf der site-master-Ansicht. So, #PageContanier, mit Ihrer relativen position, ist nicht die Interaktion mit dem set-up. Es funktioniert jetzt.
Der Nachteil ist, dass jetzt JEDE Seite in der app hat das div (mit style="display:none;"). Nur einige von Ihnen jemals brauchen es.
Hack 2:
Einer Verbesserung auf Hack 1 erstellen Sie ein Platzhalter für den Inhalt nur unter dem body-tag. So, von den Seiten, wo Sie es brauchen, können Sie Spritzen, was auch immer div, die Sie brauchen, um einen zentrierten panel auf Ihren Seiten.
Dies beseitigt die Redundanz, die in Seiten, die nicht die Platten, und gibt Ihnen eine Menge Flexibilität. Der Nachteil ist aber, dass jedes mal, wenn Sie den code zu schreiben. Nicht gerade TROCKEN, so...
Look Mum, no Hacks!:
Dank Jim ' s Vorschlag (siehe akzeptierte Antwort), habe ich geknackt das Problem. Nicht mehr hacks erforderlich.
Kann ich mit einem reinen jQuery-Lösung, wie folgt (falls javascript deaktiviert ist, passiert nichts, das ist gut).
Also:
Erstellte ich ein Utilities.js Datei und legen Sie dort die folgende Funktion ein:
Meiner Assistenten.aspx-view lege ich den folgenden jQuery-code:
Die isValid () - Funktion verwendet wird, wie vorher, in meiner MVC AJAX-Formular (siehe unten).
MVC Ajax-Formular nicht ändern. Ie:
Wenn javascript deaktiviert ist, wird die Lösung noch funktioniert. Die spinner gif nicht zeigen, das ist das richtige Verhalten, da es keine asynch Anfrage, nur eine Seite zu aktualisieren.
Und mit diesem kleinen Rahmen, der hack oben beschrieben ist nicht mehr erforderlich: nur die Seiten, die Sie explizit anfordern müssen es die Bittewarten div.
Stil der Bittewarten div, die ich verwendet habe:
Diese Regel erzeugt eine stumpfe quadratische box im IE, aber mit Mozilla Browsern, wird es produzieren eine natty wee-box mit abgerundeten Ecken, so dass es sich sehr pro.
Job gemacht, vielen Dank an Jim.
aw - ich glaube nicht, dass das zu schlecht ein Kompromiss; pragmatische und zeitnahe. Sie kann immer wieder die situation, sollten Sie twiddling Ihre Daumen an einem Tag 🙂
versucht position fixed oder absolute?
habe versucht, Feste, gleiche Problem. Wenn twiddling Daumen, ich Schreibe Romane und Kurzgeschichten...
ganz eine einzigartige Kombination,, tho muss man ein bisschen scrawly 🙂
InformationsquelleAutor awrigley