2009-10-10 8 views
13

Es posible tener un bloque jQuery listo ejecutado después de que todos los demás lo hayan hecho.forzando a un bloque jQuery listo para ejecutarse después de todos los otros bloques listos

tengo esto en mi página maestra ...

<script type="text/javascript"> 
    $(document).ready(function() 
    { 
     $("input[type='text']:enabled:first", document.forms[0]).focus().select(); 
    }); 
</script> 

y esto en una de mis otras páginas ...

<script type="text/javascript"> 
    $(document).ready(function() 
    { 
     $('textarea.message-body').wysiwyg(); 
    }); 
</script> 

El problema que veo es que el primer bloque es ejecutado antes del segundo bloque, lo que está causando un problema con la tecla de tabulación. Lo que sucede es que el foco del teclado va a la barra de direcciones de mi navegador cuando presiono la tecla de tabulación. He cambiado ligeramente el código para tener esto en mi página maestra ...

<script type="text/javascript"> 
    $(document).ready(function() 
    { 
     var bodies = $('textarea.message-body'); 
     if (bodies.length > 0) 
     { 
      bodies.wysiwyg(); 
     } 

     $("input[type='text']:enabled:first", document.forms[0]).focus().select(); 
    }); 
</script> 

y acabar con el otro bloque listo por completo. Hacer eso hace que la tecla de tabulación funcione correctamente y establecer el foco en mi área de texto.

Prefiero no tener un código específico de página en mi página maestra.

Entonces, ¿hay alguna manera de hacer que mi código de enfoque de cuadro de texto se ejecute después del código wysiwyg?

Respuesta

2

Esta es la solución que fui con.

En mi página maestra tengo este ...

<script type="text/javascript"> 
<!-- 
    $(document).ready(function() 
    { 
     if (typeof (OnLoad) != "undefined") 
     { 
      OnLoad(); 
     } 

     $("input[type='text']:enabled:first", document.forms[0]).focus().select(); 
    }); 
//--> 
</script> 

y en mis páginas de detalles que tienen esta ...

<script type="text/javascript"> 
<!-- 
    function OnLoad() 
    { 
     $('textarea.message-body').wysiwyg(); 
    } 
//--> 
</script> 
1

¿Qué tal si solo está registrando un document.ready() en la página maestra y luego deja que éste ejecute el código basado en una variable? Esta solución no es tan elegante, pero la búsqueda de sincronización de subprocesos de JavaScript realmente no resultó en nada.

podría cambiar el código en la página principal a:

<script type="text/javascript"> 
    var runWysiwyg = false; 
    $(document).ready(function() 
    { 
     if (runWysiwyg) { 
      $('textarea.message-body').wysiwyg(); 
     } 
     $("input[type='text']:enabled:first", document.forms[0]).focus().select(); 
    }); 
</script> 

y poner este guión en que la página:

<script type="text/javascript"> 
    runWysiwyg = true; 
</script> 
+1

Gracias, me especie de tiene la misma solución. He ido por tener una función OnLoad() en mi página, con esto en el maestro ...

+0

Busqué más para una solución general sobre el problema de sincronización y encontré que JavaScript no es multiproceso: http://stackoverflow.com/questions/39879/why-doesnt-javascript-support-multithreading –

+1

No verá cualquier cosa en "sincronización de hilos JavaScript" porque los motores JS en el navegador son todos de un solo hilo. –

9

$(window).load() incendios de función después de la $(document).ready()

+2

Dispara _long_ después de $ '(document) .ready()', en realidad. – skalee

+1

Hizo el trabajo perfecto para mí, gracias y +1. – Renan

8

Añadir un disparador custom event a su página principal:

<script type="text/javascript"> 
$(document).ready(function() 
{ 
    $('textarea.message-body').wysiwyg(); 
    $(document).trigger('tb'); 
}); 
</script> 

y enlazarlo a la otra página:

<script type="text/javascript"> 
$(document).bind('tb', function(){ 
    $("input[type='text']:enabled:first", document.forms[0]).focus().select();   
}); 
</script> 

Referencias

+0

Esto podría parecer aterrador a primera vista, pero en realidad es bastante simple y, por lo general, es mucho mejor que escuchar un evento de "carga". Lea [events/ready from JQuery docs] (http://docs.jquery.com/Events/ready) si no sabe cuándo se activa la "carga" y cuánto tiempo debe esperar. – skalee

Cuestiones relacionadas