| 1 | <?php |
|---|
| 2 | |
|---|
| 3 | if ( 'POST' == strtoupper( $_SERVER['REQUEST_METHOD'] ) && 'true' == $_POST['__do_ajax'] ) { |
|---|
| 4 | header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' ); |
|---|
| 5 | header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); |
|---|
| 6 | header( 'Cache-Control: no-cache, must-revalidate, max-age=0' ); |
|---|
| 7 | header( 'Pragma: no-cache' ); |
|---|
| 8 | |
|---|
| 9 | $action = empty( $_POST['action'] ) ? false : $_POST['action']; |
|---|
| 10 | |
|---|
| 11 | echo output( $action ); |
|---|
| 12 | echo "<pre>"; |
|---|
| 13 | var_dump( $_POST ); |
|---|
| 14 | echo "</pre>"; |
|---|
| 15 | exit; |
|---|
| 16 | } |
|---|
| 17 | |
|---|
| 18 | function output( $action = false ) { |
|---|
| 19 | switch ( $action ) { |
|---|
| 20 | case false : |
|---|
| 21 | return 'Original'; |
|---|
| 22 | case 'one' : |
|---|
| 23 | return 'The loneliest number'; |
|---|
| 24 | case 'two' : |
|---|
| 25 | return 'Can be as bad as one'; |
|---|
| 26 | case 'three' : |
|---|
| 27 | return 'Not the mama'; |
|---|
| 28 | default : |
|---|
| 29 | return '????'; |
|---|
| 30 | } |
|---|
| 31 | } |
|---|
| 32 | |
|---|
| 33 | ?> |
|---|
| 34 | <html> |
|---|
| 35 | <head> |
|---|
| 36 | <title>pushState()</title> |
|---|
| 37 | <script type="text/javascript" src="/wordpress/wp-includes/js/jquery/jquery.js"></script> |
|---|
| 38 | <script type="text/javascript"> |
|---|
| 39 | (function($) { |
|---|
| 40 | |
|---|
| 41 | if ( !window.history.pushState ) { |
|---|
| 42 | return; |
|---|
| 43 | } |
|---|
| 44 | |
|---|
| 45 | var baseHref = document.location.href.split( '?' )[0], |
|---|
| 46 | originalHref = document.location.href, |
|---|
| 47 | doAJAX, getState, response; |
|---|
| 48 | |
|---|
| 49 | doAJAX = function( state ) { |
|---|
| 50 | response.load( 'pushstate.php', $.extend( { '__do_ajax' : 'true', '__random' : Math.random() }, state ) ); |
|---|
| 51 | }; |
|---|
| 52 | |
|---|
| 53 | getState = function( url ) { |
|---|
| 54 | var href, state, queryParams, queryParam; |
|---|
| 55 | |
|---|
| 56 | href = url.replace( /https?:\/\/.*?(\/.*$)/, '$1' ).split( '?' ); |
|---|
| 57 | |
|---|
| 58 | if ( 'undefined' == typeof href[1] ) { |
|---|
| 59 | href[1] = '__do_ajax=true'; |
|---|
| 60 | } |
|---|
| 61 | |
|---|
| 62 | queryParams = href[1].split( '&' ); |
|---|
| 63 | |
|---|
| 64 | state = { __path: href[0] }; // state object holds the URL's path ... |
|---|
| 65 | |
|---|
| 66 | // ... and the query parameters |
|---|
| 67 | $.each( queryParams, function( i ) { |
|---|
| 68 | queryParam = queryParams[i].split( '=' ); |
|---|
| 69 | state[decodeURIComponent( queryParam[0] )] = decodeURIComponent( queryParam[1] ); |
|---|
| 70 | } ); |
|---|
| 71 | |
|---|
| 72 | // state object, query string |
|---|
| 73 | return [ state, '?' + href[1] ]; |
|---|
| 74 | }; |
|---|
| 75 | |
|---|
| 76 | |
|---|
| 77 | $( function() { |
|---|
| 78 | // Define after onReady so we don't capture original popState event (Is this necessary? Is there any such event?) |
|---|
| 79 | window.onpopstate = function( event ) { |
|---|
| 80 | var state = event.state ? event.state : getState( document.location.href )[0]; |
|---|
| 81 | |
|---|
| 82 | // do AJAX |
|---|
| 83 | doAJAX( state ); |
|---|
| 84 | }; |
|---|
| 85 | |
|---|
| 86 | response = $('#response'); |
|---|
| 87 | |
|---|
| 88 | $('ul a').click( function() { |
|---|
| 89 | // This is not the URL you are looking for |
|---|
| 90 | if ( 0 != this.href.indexOf( baseHref ) ) { |
|---|
| 91 | return; |
|---|
| 92 | } |
|---|
| 93 | |
|---|
| 94 | var state, queryString; |
|---|
| 95 | |
|---|
| 96 | state = getState( this.href ); |
|---|
| 97 | queryString = state[1]; |
|---|
| 98 | state = state[0]; |
|---|
| 99 | |
|---|
| 100 | // Update the address |
|---|
| 101 | window.history.pushState( state, $(this).text(), queryString ); |
|---|
| 102 | |
|---|
| 103 | // do AJAX |
|---|
| 104 | doAJAX( state ); |
|---|
| 105 | |
|---|
| 106 | return false; |
|---|
| 107 | } ); |
|---|
| 108 | } ); |
|---|
| 109 | |
|---|
| 110 | })(jQuery); |
|---|
| 111 | </script> |
|---|
| 112 | </head> |
|---|
| 113 | <body> |
|---|
| 114 | <ul> |
|---|
| 115 | <li><a href="?action=one&foo=bar">One</a></li> |
|---|
| 116 | <li><a href="?action=two&foo=pub">Two</a></li> |
|---|
| 117 | <li><a href="?action=three&foo=boozeria">Three</a></li> |
|---|
| 118 | <li><a href="http://example.com/">Other</a></li> |
|---|
| 119 | </ul> |
|---|
| 120 | |
|---|
| 121 | <p id="response"><?php echo htmlspecialchars( output( empty( $_GET['action'] ) ? false : $_GET['action'] ), ENT_NOQUOTES ); ?></p> |
|---|
| 122 | </body> |
|---|
| 123 | </html> |
|---|