2012-02-28 15 views
20

Estoy jugando con stateful buttons de Bootstrap - específicamente con Estado de carga, pero todavía no puedo encontrar la configuración correcta para que funcione. Tengo una forma sencilla basada en AJAX, algo así:Bootstrap - ¿alguien podría darme algún ejemplo, cómo configurar botones JS?

<%=form_tag '/comments', :remote => true do %> 
    <div><%=text_area_tag 'comment[text_comment]'%></div> 
    <div><button class="btn btn-primary" data-loading-text="loading stuff..." >Post</button></div> 
<%end%> 

Pero aún cuando hago clic en el botón POSTAL, por lo que la forma es el envío, pero el efecto botón (carga cosas ...) no se muestra, como el ejemplo en la página de Bootstrap.

¿Alguien me puede dar un consejo sobre cómo solucionarlo?

Respuesta

39

Debe establecer explícitamente que el botón está en el estado de carga. Algo como esto:

// Set up the buttons 
$(button).button();  
$(button).click(function() { 
    $(this).button('loading'); 
    // Then whatever you actually want to do i.e. submit form 
    // After that has finished, reset the button state using 
    // $(this).button('reset'); 
} 

He creado un JSFiddle example de trabajo.

+0

gracias por el ejemplo, pero Dios ... No sé, lo que tengo mal ... cuando intento el ejemplo, pones JSFiddle y pones en la alerta de función, para que se muestre el mensaje de alerta, pero el texto ** carga ** en el botón no ... todos los archivos de Bootstrap que he cargado ... – user984621

+0

Espero que algún día explique esa explicación más claro en los documentos ... –

4

En la documentación Bootstrap, the first mention of stateful buttons me dio la impresión de que todo lo que necesito para activar el botón de estado es proporcionar el atributo data-loading-text:

Añadir data-loading-text="Loading..." utilizar un estado de carga en un botón.

Si usted está buscando para este comportamiento (y también esperar que funcione en submit, input type="submit", etc), este selector jQuery debe hacer el truco para usted:

$(':input[data-loading-text]') 

Pero usted todavía debe adjuntar su comportamiento deseado a través de un controlador de eventos, como .click(). Esta es the jQuery for the stateful button in the documentation (busque "grasa-BTN" en ese archivo javascript):

.click(function() { 
    var btn = $(this) 
    btn.button('loading') 
    setTimeout(function() { 
     btn.button('reset') 
    }, 3000) 
}) 

lo tanto, poner que todos juntos, podemos hacer esto:

$(':input[data-loading-text]').click(function() { 
    var btn = $(this) 
    btn.button('loading') 
    setTimeout(function() { 
     btn.button('reset') 
    }, 3000) 
}) 

Tengo un working jsfiddle at http://jsfiddle.net/jhfrench/n7n4w/.

+0

¡Gran solución! Mi código heredado incluye una combinación de etiquetas de anclaje y botones de entrada, por lo que mi declaración de selección de JQuery es simplemente "[data-loading-text]". Además, para el cumplimiento y la claridad de los estándares, agregue puntos y coma al final de sus líneas. – wloescher

+1

@wloescher: Los puntos y comas no se incluyen solo porque copié el código textualmente del código de Bootstrap. Algunos linters se quejarán de los seimcolons "excesivos", así que supongo que es por eso que * they * no los incluyen. Los puse en mi propio código, por las mismas razones por las que los sugieres. –

+1

@wloescher: PD: considere usar este selector: '$ ('a,: input'). Find ('[data-loading-text]') ...' –

0

No necesita bootstrap-buttons.js. Eso es HTM5, usa los atributos personalizados. Esta muestra no depende del evento click, es un formulario enviar

var btn = $(this).find("input[type=submit]:focus"); 
// loading 
var loadingText = btn.data('loadingText'); 

if (typeof loadingText != 'undefined') { 
    btn.attr("value", loadingText); 
} 
else { 
    btn.attr("value", "Loading..."); 
} 
btn.attr("disabled", true); 

$.ajax({// long task 
    complete: function() { 
    // reset.. the same 
}); 
Cuestiones relacionadas