8

El dilema que estoy tratando es que en el jquery-bbq code, porque IE6 e IE7 no son compatibles con hashchange, cargan las páginas dos veces para tener un estado de historial.¿Existe una forma estándar de definir el href que se abre en una llamada a document.open?

Esto tiene un efecto negativo porque el código se ejecuta dos veces tanto en el lado del servidor como en el del lado del cliente. El método utilizado para crear el marco flotante es la siguiente:

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()); 
    } 

A iframe blanco con un src de javascript:0 se crea. Se llama al método document.open, y parece que toma el location.href de la ventana principal como el predeterminado para la página que se abre con .open.

Básicamente tengo que modificar el código para que no abra la misma URL dos veces, por lo que estoy buscando anular el valor predeterminado y especificar un parámetro como? Iframe = true.

Ejemplo:

http://example.com/views/step-2?one=two

En IE, la página anterior se carga y luego se carga de nuevo en un marco flotante. El código del lado del servidor ejecuta dos veces, pero no quiero que eso suceda.

Quiero agregar &iframe=1 al URI para evitar que se ejecute el código del lado del servidor si se especifica el parámetro iframe.

Las dos cosas más obvias son:

  1. Ajuste el src del iframe, pero esto podría tener un efecto negativo y estoy bastante seguro de que está ahí por una razón.
  2. En lugar de utilizar document.open.close, use iframe.location.href y configúrelo en href manualmente.

Si alguien ha tenido experiencia con la piratería iframe, agradecería mucho algunos consejos.

EDITAR: Otra solución pensé se carga de una página a través de iframe/ajax que establece una sesión var antes de que el iframe hace el document.open, lo que crea una variable de sesión de 'iframeloading' que es igual a 1, y fijar un controlador de eventos de carga de la carga de marco flotante para configurarlo de nuevo a 0, y ajustar mi código del lado del servidor para no ejecutar si la sesión var se establece en 1. Algo como:

$('<iframe src="/iframe-loading.php"/>').hide().appendTo('body'); 
document.open().close() 
$(document.defaultView).load(function() { 
    $('<iframe src="iframe-doneloading.php/>').hide().appendTo('body'); 
}); 
+0

si le doy una forma alternativa de manejar el evento hashchange con jquery colud slove sus problemas? – ygaradon

+0

Si pudieras solucionar el problema hashchange loading twice, te ahorraría mucho tiempo. La documentación de jQuery BBQ menciona: "Asegúrese de enlazar al evento" hashchange "en document.ready, no antes, o puede fallar en IE6/7". Ese no es tu problema, ¿verdad? Además, podría publicar su problema en la página del proyecto GitHub en https://github.com/cowboy/jquery-bbq/issues –

Respuesta

1

sobre "¿existe una norma forma de definir el href que se abre en una llamada a document.open? "

No, no lo hay.

Cuestiones relacionadas