2012-01-19 6 views
5

Usando esta llamada <a href="deleteDialog.html" data-rel="dialog" data-transition="pop" data-role="button" id='deleteDialog'>Delete</a> obtener la siguiente página de diálogo:JQuery Mobile: inline data-role = "page" javascript siendo retenido cuando se lanza la página desde DOM?

<div data-role="page" id="deleteCompanyDialog"> 
<script type="text/javascript"> 

$("#deleteButton").live("click", function() { 
     alert("this alert increments"); 

}); 

</script> 

    <div data-role="header" data-theme="d"> 
     <h1>Dialog</h1> 

    </div> 

    <div data-role="content" data-theme="c"> 
     <h1>Delete Company</h1> 
     <p id="message"></p> 
     <a data-role="button" data-theme="b" id="deleteButton" >Sounds good</a>  
     <a href="company.jsp" data-role="button" data-rel="back" data-theme="c">Cancel</a>  
    </div> 
</div> 

parece conservar la live("click".. unión de todas las llamadas anteriores a este cuadro de diálogo y luego se une a la llamada live nuevo. Por lo tanto, si llamo a la página 4 veces por separado, en la cuarta página del cuadro de diálogo, se abrirán 4 pantallas de alerta. ¿Hay alguna manera de tener el javascript aún dentro de data-role="page" para que pueda cargarse con ajax pero no incrementar el enlace "activo"? Intenté $("#deleteCompanyDialog").live("pagecreate"..., así como pageload (una posibilidad muy remota) que tampoco funciona.

Ayuda sería muy apreciada.

+0

data-role = "Diálogo" está en la misma posición que data-role = "página", por lo que si intenta ponerlo dentro de una página, no funcionará. –

Respuesta

7

En lugar de utilizar .live(), utilice .bind() y coloque el JavaScript en un controlador de eventos delegada:

<div data-role="page" id="deleteCompanyDialog"> 

    <div data-role="header" data-theme="d"> 
     <h1>Dialog</h1> 

    </div> 

    <div data-role="content" data-theme="c"> 
     <h1>Delete Company</h1> 
     <p id="message"></p> 
     <a data-role="button" data-theme="b" id="deleteButton" >Sounds good</a>  
     <a href="company.jsp" data-role="button" data-rel="back" data-theme="c">Cancel</a>  
    </div> 
<script type="text/javascript"> 

$(document).delegate("#deleteCompanyDialog", "pageinit", function() { 
    $("#deleteButton").bind('click', function() { 
     alert("this alert DOES NOT increment"); 
    }); 
}); 

</script> 
</div> 

Esto es como usar $(function() {}); pero para jQuery Mobile. El evento pageinit se activará cuando la página se inicialice (ocurre una vez por pseudopágina) y la llamada a la función .bind() solo se vinculará a los elementos presentes en el DOM. Cuando utiliza .live() no se vincula al elemento real, se une al elemento document, que no se elimina cuando se aleja del diálogo (por lo que cada vez que muestra el cuadro de diálogo agrega otro controlador de eventos delegados).

+0

Usar bind en lugar de live trabajado. gracias por la respuesta detallada – Greg

+0

Realmente maravillosa respuesta Jasper; ¡mereces mucha más influencia para esta gran respuesta! Como seguimiento, noté que un alerta _inside_ el delegado (por sí mismo) se despediría más veces (una vez por visita de página) al usar el botón Atrás del navegador para navegar y luego volver a ingresar a la página. ¿Hay alguna forma aprobada de tener javascript que solo se active una vez en este escenario? Es como si necesitáramos una función que sepa que ya se ha incluido en la página y las solicitudes posteriores podrían ignorarla. ¡Gracias por tus pensamientos! – veeTrain

+0

Actualización: ¡resolví mis pruebas siguiendo el principio '' off 'before' on''! Gracias por sus comentarios y contribuciones: http://stackoverflow.com/questions/9067259/jquery-mobile-click-firing-multiple-times-on-new-page-visit – veeTrain

Cuestiones relacionadas