2012-09-08 595 views
5

Estoy añadiendo dinámicamente marcado a mi solicitud un código de ejemplo a continuación ..aplicación Muestra sin estilo HTML antes de que presta jQuery Mobile

$(document).bind("pagechange", function (event, ui) { 
    var header = '<h3>' + appNames[i] + '</h3>'; 

     var ulHeader = '<ul data-role="listview" id="myAppsGridTable" data-inset="true">'; 

.. 
    $('.myBodyContent', ui.toPage).append(collapse + header + ulHeader + entire_list + '</ul>' + '</div>'); 
    $('#NicksPage').trigger('create'); 

}); 

que tienen una referencia a esta página en mi página Default.aspx y una referencia a jquery mobile en la página maestra Cuando navega a Predeterminado, el usuario ve html sin pintar agregado en la página, luego aparece un parpadeo y aparecen los estilos de dispositivo móvil de jquery. ¿De todos modos puedo deshacerme de mostrar el html no visto al usuario antes de agregar los estilos de móvil de jquery?

Aquí es una copia de mi página maestra:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="UserMobile.master.cs" Inherits="User.Mobile.UserMobile" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
<head id="Head1" runat="server"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link href="Css/jquery.mobile.custom.structure.min.css" rel="stylesheet" type="text/css" /> 
    <link href="Css/jquery.mobile.custom.theme.min.css" rel="stylesheet" type="text/css" /> 

    <asp:ContentPlaceHolder ID="HeadContent" runat="server"> 
    </asp:ContentPlaceHolder> 
</head> 

<body> 

<div data-role="page" data-theme="b" id="NicksPage"> 

    <div data-role="header" data-position="fixed" data-theme="b"> 

     <asp:ContentPlaceHolder ID="TopHeaderContent" runat="server"></asp:ContentPlaceHolder> 


    </div><!-- /header --> 

    <div data-role="content" class="myBodyContent"> 

<asp:ContentPlaceHolder ID="MainContent" runat="server"></asp:ContentPlaceHolder> 

    </div><!-- /content --> 

    <div data-role="footer" data-position="fixed" data-theme="b"> 
    <asp:ContentPlaceHolder ID="FooterContent" runat="server"></asp:ContentPlaceHolder> 


    <input type="hidden" id="collapse_value" value="false" /> 
    </div><!-- /footer --> 

</div><!-- /page --> 

    //Combined jquery 1.8 and jquery mobile files in one 
    <script src="Js/JQ_JQM_combined.js" type="text/javascript"></script> 

    //Makes ajax calls to get data 
    <script src="Js/UserMobile.js" type="text/javascript"></script> 

    <script type="text/javascript"> 
     $(document).ready(function() { 

      // disable page transitions 
      $.mobile.ajaxEnabled = false; 
      $.mobile.defaultPageTransition = 'none'; 
     }); 

    </script> 
    <asp:ContentPlaceHolder ID="ScriptContent" runat="server"></asp:ContentPlaceHolder> 

</body> 

</html> 

Incluso la página de inicio tiene el problema de parpadeo, donde se hace sin estilo y después de un período de tiempo de manera adecuada al estilo jQuery Mobile ..

<%@ Page Title="" Language="C#" MasterPageFile="~/Mobile/UserMobile.Master" AutoEventWireup="true" CodeBehind="Home.aspx.cs" Inherits="User.Mobile.Home" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="TopHeaderContent" runat="server"> 
    <h1> 
     Applications</h1> 
</asp:Content> 
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server"> 
<div data-role="controlgroup"> 
<a href="MyStuff.aspx?name=nick&id=1234" data-role="button">My Stuff</a> 
<a href="Employees.aspx?name=nick&id=1234" data-role="button">Employees</a> 
<a href="list.aspx?name=nick&id=1234" data-role="button">List</a> 

</div> 


</asp:Content> 
<asp:Content ID="Content4" ContentPlaceHolderID="FooterContent" runat="server"> 
    <div class="lines"> 
     <div class="footerCopyrightContainer"> 
      <div class="footerCopyright"> 
       &copy;2012 NICK ALL RIGHTS RESERVED.</div> 
     </div> 
    </div> 
</asp:Content> 

He cambiado mi código para reflejar su ejemplo de violín, pero sigo recibiendo el parpadeo. Pero el "período de tiempo en el que el parpadeo de la sin estilo de labrado es más corto que el usuario sigue viendo la página sin estilo en el navegador móvil. Se puede echar un vistazo fo forma en que lo configuré Me estoy perdiendo algo?

$(document).bind("pagecreate", function (event, ui) { 

    //gets params needed from querystring 
    arrQrStr = getQueryStringParams(); 
    name = arrQrStr["name"]; 
    id = arrQrStr["id"]; 

}); 


$(document).delegate('div[data-role=page]', 'pagebeforeshow', function (e, data) { 

    var employees = null; 

    //returns string of html needed 
    employees = getData(name, id); 

    $('.myBodyContent', this).html(employees); 

    $(this).trigger('create'); 

}); 

getData llamada AJAX ..

$.ajax({ 
     type: "POST", 
     url: "MobileService.svc/REST/GetData", 
     contentType: "application/json; charset=utf-8", 
     data: JSON.stringify({ id: id}), 
     dataType: "json", 
     async: false, 
     success: function (msg) { 

el problema tiene viene de esto:

<script type="text/javascript"> 
     $(document).ready(function() { 


      // disable page transitions 
      $.mobile.ajaxEnabled = false; 
      $.mobile.defaultPageTransition = 'none'; 



     }); 


    </script> 

Si tomo esto de la página maestra el parpadeo desaparece, se navega una página bien, pero lo hará de los datos no mostrar. Al sacar este script se rompen las llamadas ajax y los eventos móviles de jquery no se activan (no estoy seguro por qué)

+0

¿La función 'getData' usa un proceso asincrónico como AJAX? – Jasper

+0

usa ajax pero async está configurado como falso –

+0

Existe la posibilidad de que el uso de una solicitud síncrona cree su parpadeo. En lugar de utilizar una solicitud de AJAX para obtener los datos, ¿por qué no vincular a un documento externo que utiliza un lenguaje del lado del servidor para obtener los datos y crear la página necesaria? Parece que estás complicando el problema ... – Jasper

Respuesta

1

Parece que no entendió cómo funciona la configuración ajax enabled.

Por defecto esta opción está habilitada, cuando accede a otra página JQM tira en la primera página de JQM que encuentra (data-role="page") en la página del enlace (por lo que no se puede vincular a un documento multipage) y realza (inicializando todos los widgets JQM) y luego lo conecta al DOM de la página actual. Cuando JQM hace esto, solo extrae la página JQM y nada más en esa página (por lo que cualquier script y estilo en la segunda página won't tiene algún efecto). La forma de lidiar con esto es tener todas las secuencias de comandos en la página principal . Una cosa que tendrá que tener en cuenta si hace esto es que puede terminar con varias páginas con el mismo id (en realidad con su configuración actual definitivamente tendrá el duplicado ids) por lo que es posible que desee seleccionarlos por class.

Con ajax enabled establecido en false por el contrario se comporta como una de manera regular, en cuyo caso se carga la página completa y si las secuencias de comandos JQM están en la parte inferior a continuación, a continuación, hasta que se ha cargado no será capaz de mejorar la DOM, por lo que está viendo ese parpadeo.

Como un punto de vista page transistions are only available if ajax habilitado is set to true`.

En resumen, a menos que tenga una razón para no hacerlo, probablemente deba ir con ajax enabled establecido en verdadero, e incluya los scripts relevantes en su página principal. Si necesita ir con ajax enabled configurado a false, intente colocar sus scripts jQuery en el encabezado para que se carguen antes que el resto del DOM.

Alternaticely lo que puede hacer es ocultar el elemento contenedor en el que se le realizando adiciones que html y luego una vez que su hecho mostrarla, por ejemplo

CSS

.displayNone { display: none; } 

HTML

<div data-role="content" class="myBodyContent displayNone"> 
     <asp:ContentPlaceHolder ID="MainContent" runat="server"></asp:ContentPlaceHolder> 
    </div> 

JS

$('.myBodyContent', this).html(employees); 
    $(this).trigger('create'); 
    $('.myBodyContent', this).reomveClass('displayNone'); 
0

Pruebe a usar el pagebeforeshow en lugar de pagechange. De este modo:

$(document).delegate('div[data-role=page]', 'pagebeforeshow', function(e, data){ 
    var toPage = this; // this references the page that is about to be shown 
    // Add items to the page 
}); 

El evento pagebeforeshow se activa en el "toPage" se transisioned que, antes de que comience reales de animación de transición. Esto le permite agregar elementos y estilos antes de que se muestre al usuario.

Espero que esto ayude!

EDITAR

Aquí es una JSFiddle con la solución sugerida en práctica.

+0

Entonces en mi código cambio ui.toPage a toPage aquí $ ('. MyBodyContent', ui.toPage) y me suscribo a su evento como se muestra? –

+0

Parece que no funciona para mí, todavía obtiene el mismo resultado –

+0

@NickLaMarca ¿Puede echar un vistazo a este JSFiddle con el arreglo implementado como se indica anteriormente: http://jsfiddle.net/Rthpv/5/. ¿Puedes ver si esto funciona, y si no modificas el violín para reproducir tu error para que pueda darte una respuesta? Gracias. – dSquared

1

Intente poner sus scripts de fuente móvil jquery en la cabeza, en lugar de en el extremo del cuerpo.

Esta es la única forma en que puedo garantizar que el usuario nunca vea un html sin estilo.

+0

Probé que el parpadeo todavía está allí tiene que estar conectado de alguna manera para encender y apagar el script de doc listo que a su vez rompe el jquery eventos móviles –