2010-11-16 3 views
5

Sto costruendo un sito collegato ad AJAX.PHP: come determinare se il browser supporta javascript in PHP?

Desidero che PHP carichi tutto il codice HTML della pagina se l'utente sta tentando di accedere al sito con un browser JavaScript non supportato o se si tratta di un crawler di ricerca. Fondamentalmente PHP restituirà l'intera pagina.

Al contrario, quando l'utente tenta di accedere al sito con il browser supportato da Javascript, voglio che PHP restituisca solo il codice del modello e che Javascript (AJAX) si occupi del resto. Fondamentalmente PHP caricherà solo elementi di design e permetterà a Javascript di inserirli nel contenuto.

Ho esaminato la funzione get_browser() di PHP, tuttavia sembra che non sia uno strumento così affidabile. Qual è la pratica del settore se il browser supporta Javascript o è un crawler di ricerca che utilizza PHP?


Sfondo:

perché voglio il sito per avere questo comportamento.

Poiché desidero caricare la pagina iniziale caricando l'indirizzo: example.com, che non invia alcuna query a PHP, PHP restituisce il codice HTML della home page. Ciò tuttavia causa problemi quando l'utente tenta di caricare la seguente pagina: example.com#foo. Quindi, per questo esempio, PHP restituirà la home page e una volta caricata la home page, Javascript (AJAX) cambierà il contenuto in modo che mostri il contenuto corretto per #foo. Ciò consentirà all'utente di visualizzare la home page, pertanto il tempo di caricamento sarà più lento e l'esperienza utente non sarà così piacevole. Tuttavia se il mio script PHP può capire che se l'uso con il browser supportato da Javascript sta tentando di caricare la pagina, restituirà solo il modello del sito web, che non ha contenuto) e il javascript popolerà quel modello con contenuto qualunque sia dovrebbe essere visualizzato per #foo. D'altra parte, se il browser Javascript non separato o un crawler proveranno ad accedere alla pagina example.com#foo, verrà restituita la home page.

Sto utilizzando la libreria SWFaddress (http://www.asual.com/swfaddress/) per il deep-linking.


Modifica

Grazie ragazzi. Non pensavo di usare <noscript></noscript> prima.

Ecco cosa ho deciso di fare. PHP di default caricherà pagine come example.com o example.com#foo (che è essenzialmente lo stesso di example.com dal punto di vista di PHP poiché i frammenti per definizione non vengono inviati al server) vuoto (solo modello visivo) con tag <noscript> all'interno per il contenuto del home page. In questo modo gli utenti con javascript non vedranno la home page e AJAX popolerà il contenuto della pagina in base al frammento #foo. D'altra parte, i crawler di ricerca e gli utenti senza javascript vedranno una home page.

Grazie ancora. Penso che questa sia una soluzione piuttosto semplice ed elegante. Se hai ulteriori suggerimenti, per favore pubblica un commento o un'altra risposta.

+0

consideri javascript lato server come node.js - http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/ – ajreal

+0

Buona idea. Sfortunatamente non tutti i provider di server hanno installato o almeno quello che sto usando non lo fa. – miki725

risposta

5

Non è possibile farlo utilizzando PHP. Che cosa si può fare, però, è utilizzare un tag noscript per reindirizzare a un'altra pagina php se non hanno javascript:

<noscript> 
<meta http-equiv="refresh" content="0; URL=nojavascript.php"> 
</noscript> 
+0

è supportato dai crawler di ricerca? – miki725

+0

I crawler lo prenderanno, ma non so se entreranno in quell'URL. Puoi sempre dire se colpire o meno quel file in un file sitemap.xml – wajiw

1

Non è possibile eseguire ciò nel modo in cui si sta tentando di farlo.

È raro che qualcuno abbia disattivato la JS e non lo sappia.

PHP non viene passato nulla dopo #, solo javascript può fare qualsiasi cosa con quello. Quindi, anche se PHP potesse determinare se il browser ha attivato il javascript, non è comunque in grado di leggere # comunque.

+0

Alcune persone (non vedenti con screen reader o lettori braille, utenti di cellulari, ecc.) Non hanno javascript. – trusktr

+0

È raro, ma importante sapere. – trusktr

0

Si dovrebbe solo costruire una query di AJAX che imposta una variabile di sessione per javascript abilitato.

Eseguire questa query AJAX prima di caricare qualsiasi altra informazione sul sito e quindi eseguire un semplice reindirizzamento al sito effettivo.

Si potrebbe fare qualcosa di simile a questo codice pseudo:

Index.php:

ajax(check_js.php); 
redirect(main_page.php); 

check_js.php

$_SESSION['js_enable'] = true; 

main_page.php

if($_SESSION['js_enable'] == true) { 
    //execute page 
} else { 
    header("Location: no_js_error.php"); 
} 
+0

@James Thompson - Come funziona la query AJAX prima di sapere che il browser JavaScript è abilitato? – ajreal

+0

Questa idea funziona, meno efficiente delle altre. Si ottiene il traffico non necessario in questo modo. –

+0

Non funziona. Fallirà se hanno disabilitato JS, e quindi la variabile della sessione di pagina che dice che possono usare JS non verrà mai impostata. –

1

Si potrebbe includere un link all'interno di alcuni tag <NOSCRIPT> che indirizzano l'utente a qualcosa come example.com#foo?javascript=disabled.

Sfortunatamente, i browser non segnalano se JS è abilitato o meno, quindi non c'è modo di sapere da un semplice GET HTTP se si debbano o meno inviare pagine dipendenti JS.

0

Invece del server che tenta di annusare le impostazioni dell'utente, che ne dici di utilizzare unobtrusive javascript in primo luogo? In questo modo, la pagina si degraderà con garbo (allo stato desiderato) se JS non è disponibile.