Il dilemma che ho a che fare è che nel jquery-bbq code, perché IE6 e IE7 non supportano hashchange
, caricano le pagine due volte per avere uno stato di cronologia.Esiste un modo standard per definire l'href che si apre in una chiamata document.open?
Ciò ha un effetto negativo poiché il codice viene eseguito due volte sul lato server e sul lato client. Il metodo utilizzato per creare l'iframe è questo:
if (is_old_ie) {
// Create hidden IFRAME at the end of the body.
iframe = $('<iframe src="javascript:0"/>').hide().appendTo('body')[0].contentWindow;
// Get history by looking at the hidden IFRAME's location.hash.
get_history = function() {
return get_fragment(iframe.document.location.href);
};
// Set a new history item by opening and then closing the IFRAME
// document, *then* setting its location.hash.
set_history = function(hash, history_hash) {
if (hash !== history_hash) {
var doc = iframe.document;
doc.open().close();
doc.location.hash = '#' + hash;
}
};
// Set initial history.
set_history(get_fragment());
}
Un iframe vuota con uno src di javascript:0
viene creato. Viene chiamato il metodo document.open
e sembra che afferri lo location.href
della finestra padre come predefinito per la pagina che si apre con .open
.
Fondamentalmente devo modificare il codice in modo che non apra lo stesso URL due volte, quindi sto cercando di sovrascrivere il valore predefinito e specificare un parametro come? Iframe = true.
Esempio:
http://example.com/views/step-2?one=two
In IE, pagina sopra viene caricato e poi viene caricato di nuovo in un iframe. Il codice lato server viene eseguito due volte, ma non voglio che ciò accada.
Desidero aggiungere &iframe=1
all'URI in modo da impedire l'esecuzione del codice lato server se viene specificato il parametro iframe
.
Le due cose più evidenti sono:
- Impostare lo src del iframe, ma questo potrebbe avere un effetto negativo e sono abbastanza sicuro che sia lì per un motivo.
- Invece di utilizzare
document.open.close
, utilizzareiframe.location.href
e impostarlo manualmente su href.
Se qualcuno ha avuto esperienza con l'hacking di iframe, apprezzerei molto alcuni suggerimenti.
EDIT: Un'altra soluzione ho pensato sarebbe caricamento di una pagina tramite iframe/ajax che imposta una sessione var prima della iframe fa il document.open
, che crea una variabile di sessione di 'iframeloading', che è uguale a 1, e impostare un gestore di eventi carico sul carico iframe per impostare di nuovo a 0, e regolare il mio codice lato server per non dare esecuzione se la sessione di var è impostato a 1. Qualcosa di simile:
$('<iframe src="/iframe-loading.php"/>').hide().appendTo('body');
document.open().close()
$(document.defaultView).load(function() {
$('<iframe src="iframe-doneloading.php/>').hide().appendTo('body');
});
se ti fornisco un modo alternativo per gestire l'evento hashchange con jquery, il tuo problema è risolto? – ygaradon
Se si potesse risolvere il problema con il caricamento di hashchange due volte, si sarebbe risparmiato un sacco di tempo. La documentazione di jQuery BBQ menziona: "Assicurati di associare l'evento" hashchange "su document.ready, non prima, altrimenti potrebbe fallire in IE6/7." Non è un tuo problema, vero? Inoltre, puoi pubblicare il tuo problema nella pagina GitHub del progetto all'indirizzo https://github.com/cowboy/jquery-bbq/issues –