Domanda

Google Chrome non si comporta come gli altri browser quando incontra questo nugget:

<?php
while (true) {
    echo "<script type='text/javascript'>\n";
    echo "alert('hello');\n";
    echo "</script>";
    flush();

    sleep(5);
}
?>

Sembra che stia aspettando che la connessione termini prima di fare qualsiasi cosa.

Oltre al polling come posso fare una cosa simile in Google Chrome?

È stato utile?

Soluzione

Alcuni browser richiedono il download di un determinato numero di byte prima di rendere disponibili i dati. Ricordo che l'ultima volta che ho provato a fare quello che stai facendo ho finito per dover scaricare qualcosa come 300 spazi per essere sicuro che il browser si sarebbe preso la briga di farlo.

Altri suggerimenti

Ho avuto un problema simile a questo e l'ho risolto aggiungendo un tag HTML (nel mio caso < br / >) prima di ogni flush.

La mia ipotesi sarebbe che Chrome attenda la chiusura di un elemento che viene visualizzato prima di innescare un nuovo rendering. Questa è solo una supposizione.

Non sembrava richiedere 1024 byte - penso che avrei avuto poco meno di 512 byte quando funzionava.

Vorrei avere accesso a Chrome al momento per testare alcune idee. Hai provato ad aggiungere un po 'di HTML dopo </script> e vedere se viene visualizzato in modo incrementale? Immagino che sarebbe, e in tal caso sarebbe la prova che Chrome non vuole eseguire javascript in <script> elementi durante il caricamento della pagina. Ovviamente, il rendering del markup potrebbe attivare l'esecuzione degli script. In caso contrario, potresti provare a includere javascript come file esterni e vedere se ciò influisce sui tempi di esecuzione.

Penso che i browser generalmente abbiano un certo margine di manovra in base alle specifiche in cui iniziano a eseguire javascript, specialmente quando la pagina viene caricata. Potrebbe non essere possibile farlo in modo completamente cross-browser senza polling.

Hai parlato con gli sviluppatori di Chrome? Hai aperto un bug a riguardo? IMHO la soluzione migliore è far sì che Chrome si comporti come fanno gli altri browser, piuttosto che avere una soluzione alternativa.

Okay, in realtà probabilmente avrai bisogno di una soluzione a breve termine. Ma immagina un mondo in cui ogni browser si comporta diversamente in ogni aspetto, diciamo HTTP, HTML, gestione CSS ... non sarebbe un posto piacevole!

Stream funziona. La risposta dalla palpebra è la soluzione.

stampa " 2048 punti [BR > \ n " ;;

Il [= <

A proposito, guarda l'agente utente. Anche Safari ha bisogno di molti byte. Penso che 1024. Firefox non ha bisogno di così tanti byte.

<?php
$i = 0;
while (true) {
    if($i == 0) {
        echo "<html><body>";
    }
    echo "<script type='text/javascript'>\n";
        echo "alert('hello');\n";
    echo "</script>";
    if($i == 0 ) {
        $padstr = str_pad("",2048,"&nbsp;");
        echo $padstr;
        echo "</body></html>";
    }
    flush();

    sleep(5);
    $i = $i + 1;
}
?>

Per la prima volta inviare almeno 2048 byte di dati. allora funzionerà benissimo. E assicurati di mantenere il tag script in un tag body. La cosa strana è che, nel mio caso, se aggiungo 1024 byte ha funzionato. Spero che questo ti aiuti

Il programma sopra funziona correttamente in Google Chrome.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top