• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

timeout wird nicht angenommen

Nalia

New member
Guten Morgen,
ich habe ein kleines Problem mit meiner JS-Anweisung.
Ich möchte per Script eine externe Datensicherung durchführen und während der Wartezeit eine Message für den Benutzer ('bitte warten...') einblenden.
Das Script zur Datensicherung funktioniert einwandfrei.
Die Msg habe ich in einem ausgeblendeten Div untergebracht, das dann nur noch mit $('#msg').show() eingeblendet wird.

Beide Teile für sich funktionieren, aber als Ganzes wird der Befehl msg.show schlichtweg übergangen, sprich die 'Bitte-Warten-Meldung' erscheint gar nicht, aber die Datensicherung wird trotzdem durchgeführt.
Habs auch schon mit Timeout versucht, aber auch dort das gleiche Ergebnis. Woran kann das liegen, dass ich diese Meldung nicht sehe?

Hier der Code:

Code:
    $('#msg').show();
    if ($('#msg').is(':visible')) {
        window.setTimeout('doExtSave()',5000);
    }

LG
 
Hast du mal versucht, den doExtSave() innerhalb des Ready Astes aufzurufen, also so?
HTML:
$('#msg').show( "slow", function() {
     doExtSave();
});
 
Wozu die Abfrage wenn du doch weist das das Element mit .show() sichtbar gemacht wird?
Und wieso schreibst du die Funktion in Hochkommas? dadurch wird unnötig intern die eval() Funktion aufgerufen.

Wenn du keine Parameter mit gibst kannst du einfach schreiben:
PHP:
window.setTimeout(doExtSave,5000);
 
s4ty, ich verstehe dein Post nicht so ganz, das löst ja das Problem nicht. Ich hab doch schon alles in einem beantwortet?!
 
s4ty, ich verstehe dein Post nicht so ganz, das löst ja das Problem nicht. Ich hab doch schon alles in einem beantwortet?!

Ich wollte ja nur aufzeigen was falsch ist und weil ich mir noch nicht sicher bin ob deine Variante wirklich die Lösung ist. Da ich die Vermutung habe das das Element evtl. mit opacity: 0 oder so ausgeblendet wurde. Dann würde .show() eh nichts bewirken.
 
Habe eure beiden Vorschläge ausprobiert, aber leider erfolglos. Die Msg erscheint nicht, aber dennoch wird nach ca. 5 Sekunden die Erfolgsmeldung des externen Backups gezeigt. Die Msg hat beim Seitenaufruf den Status display: none, sollte also mit show() wieder sichtbar werden (was ja auch passiert, wenn ich nur diesen Befehl aufrufe.
Was mich am meisten wundert ist, dass trotz der Abfrage, ob das Div sichtbar ist, die Funktion trotzdem ausgeführt wird, obwohl das Div ja definitiv NICHT sichtbar ist.
Hat noch jemand eine andere Idee? Ich bin grad mächtig verwirrt...
 
Habe eure beiden Vorschläge ausprobiert, aber leider erfolglos. Die Msg erscheint nicht, aber dennoch wird nach ca. 5 Sekunden die Erfolgsmeldung des externen Backups gezeigt.
Das beides passt aber ganz und garnicht zusammen! Bei meinem Vorschlag ist es unmöglich, dass die Msg nicht erscheint. Da stimmt was ganz anderes nicht. Hast du einen Link, wo man sich das anschauen kann oder kannst du eine reduzierte Testseite zur Verfügung stellen die den Fehler reproduziert?
 
Ok, nun habe ich per Inspektor schonmal rausgefunden, was dort passiert.
Version 1:
Code:
function extSave() {
    $('#out1').show();
    alert('bla');
}

Der Inspektor zeigt mir, wenn ich diese Funktion aufrufe, folgendes HTML an:
HTML:
<div id="out1" class="red hidden" style="display: block;">Datensicherung läuft...</div>
Dabei wird das 'style='display:block;' erst angezeigt, wenn der Klick auf die Ok-Taste (also der Funktionsaufruf) kommt.
die Msg wird korrekt angezeigt.


Version 2
Code:
function extSave() {
    $('#out1').show();
    $.getJSON('json.php?.... (Ausführung des externen Backups), function(result) {
        if (result == 1) {
           alert('Datenbank gesichert');
        }
    }
}
In diesem Fall zeigt mir der Inspektor folgendes an:
HTML:
<div id="out1" class="hidden" style="display: none;">Datensicherung läuft...</div>
und der Text wird natürlich nicht angezeigt, aber nach ca. 5 Sekunden kommt die alert-Meldung, dass die Datenbank gesichert wurde (was auch korrekt geschehen ist).

Also muss es irgendwie mit dem getJSON zusammenhängen, dass dieser Style display auf none gesetzt wird. Aber warum und wie kann ich das verhindern? Die von mir gesetzte CSS-Klasse 'hidden' lautet wie folgt:
.hidden { display: none; }


PS: Kann die Dateien leider nirgendwo zur Ansicht hochladen.

LG
Nalia
 
Ich würde gern mal den kompletten Code dazu sehen. Oft sind es dinge die einen selbst nicht Relevant vorkommen.

Funktionsaufruf von extSave() etc.
 
Ok, ich hab die entsprechenden Dateien mal gekürzt und die Scriptanweisungen mit in die php geschrieben. Die Funktion doExtSave() stand ursprünglich mit als Anweisung in der extSave(). Ich hatte sie dann zum Test für einen Timeout nochmal extern geschrieben. Also nicht wundern, warum das so umständlich ist. :d Diese gekürzte Fassung ist so getestet und hat den Fehler wie beschrieben:

PHP:
<?php
setlocale (LC_TIME, "deu_deu");
echo "<!DOCTYPE html>
<html lang='de'>
<head>
        <meta http-equiv='Content-Type' content='text/html;  charset=utf-8' />
        <title>Cool Bill</title>
        <link rel=stylesheet type='text/css' href='css/jquery-ui-1.10.4.custom.css' />
        <script type='text/javascript' language='javascript' src='js/jquery-1.10.2.js'></script>
        <script type='text/javascript' language='javascript' src='js/jquery-ui-1.10.3.custom.js'></script>

    <script language='javascript' type='text/javascript'>

    function extSave() {
        $('#output').show('slow', function() {
            doExtSave();
        });
        $('#output').hide();
    }

    function doExtSave() {
        $.getJSON('json2.php?trigger=34', function(result) {
            if (result == 2) {
                alert('Die Datenbank wurde extern gesichert!');
            } else {
                alert('Es ist ein Fehler aufgetreten! ');
            }
        })
    }

    </script>


    <style>

    .hidden {
        display: none;
    }

    </style>

</head>

<body>

<div id='input'>
    <h4>externe Sicherung</h4>
        <div class='box'>
            Datenbank jetzt sichern?
            <input type='button' value='ok' onclick='extSave()' />
        </div>
</div>

<div id='output' class='hidden'>
    <p>Datensicherung läuft, bitte warten...</p>
</div>

</body>
</html>

";


?>

Die json2.php ist ebenfalls auf den relevanten Teil gekürzt worden. Dort erfolgt der externe Upload der Datenbank.
PHP:
<?php
include ('inc/conopen.php');
$heute = date('Y-m-d');

switch($_REQUEST['trigger']) {

        case 34:
        // externe Sicherung durchführen

        // akutelle Datenbank zum Upload vorbereiten
        $local  = "backup/upload/".$heute.".sql";
        exec("$pfad -u$user -p$pass -h localhost $datenbank > $local");

        $web = "httpdocs/newsave/".$heute.".sql";

        $conn_id = ftp_connect("$ftp_server") or die('Keine Server-Verbindung');
        $login_result = @ftp_login($conn_id, $ftp_user_name, $ftp_user_pass) or die('Logindaten falsch!');

        # Verbindung überprüfen
        if ((!$conn_id) || (!$login_result)) {
            echo json_encode(0);
        } else {
            $upload = ftp_put($conn_id, $web, $local, FTP_BINARY);
            if (!$upload) {
                echo json_encode(1);
            } else {
                echo json_encode(2);
                // Schließen des FTP-Streams
                ftp_quit($conn_id);
            }
       }
       // lokale Datei wieder löschen
       unlink ($local);
       break;

}

 ?>

LG
Nalia
 
PHP:
    function extSave() {
        $('#output').show('slow', function() {
            doExtSave();
        });
        $('#output').hide();
    }
Hier liegt der Hund begraben... du hättest das .hide() vorher nicht verschweigen dürfen.

Für JS schaut der Aufruf so aus: mach' ein .show() mit ein paar Parametern (jetzt wird die Animation angelegt und gestartet, ABER nicht auf deren Ende gewartet) und gleich darauf mach' ein .hide() (OK - die show-Animation ist noch nicht fertig... egal, brechen wir die ab und machen das hide()).

Du musst den .hide()-Befehl in den Callback der getJSON()-Funktion packen.
 
Zurück
Oben