2009-10-10 3 views
13

Est-il possible d'avoir un bloc jQuery ready exécuté après que tous les autres blocs aient été exécutés?forcer l'exécution d'un bloc jQuery ready après tous les autres blocs prêtes

J'ai dans ma page maître ...

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

et ce dans un de mes autres pages ...

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

Le problème que je vois est que le premier bloc est exécuté avant le deuxième bloc, ce qui provoque un problème avec la touche de tabulation. Qu'est-ce qui se passe est que le focus du clavier va à la barre d'adresse dans mon navigateur lorsque j'appuie sur la touche de tabulation. J'ai légèrement changé le code pour avoir ceci dans ma page principale ...

<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> 

et de faire disparaître complètement l'autre bloc prêt complètement. Faire cela fait fonctionner la touche de tabulation correctement, et mettre l'accent sur ma zone de texte.

Je préfère ne pas avoir de code spécifique à la page dans ma page maître. Donc, y at-il un moyen de faire exécuter le code de mise au point de ma zone de texte après le code wysiwyg?

Répondre

2

C'est la solution que je suis allé avec.

Dans ma page maître ... Je cette

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

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

et dans mes pages de détails que j'ai ce ...

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

Que diriez-vous seulement d'enregistrer un document.ready() sur la page maître, puis de laisser celui-ci exécuter le code basé sur une variable? Cette solution n'est pas très élégante, mais la recherche de la synchronisation de threads JavaScript n'a pas vraiment changé quoi que ce soit.

Vous pouvez modifier le code sur la page principale à:

<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> 

Et mettez ce script en vous page:

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

Merci, je sorte de obtenu la même solution. Je suis allé pour avoir une fonction OnLoad() dans ma page, ce dans le maître ...

+0

J'ai cherché un peu plus pour une solution générale sur le problème de synchronisation et trouvé que JavaScript n'est pas multithread: http://stackoverflow.com/questions/39879/why-doesnt-javascript-support-multithreading –

+1

Vous ne verrez pas quoi que ce soit sur la "synchronisation des threads JavaScript" car les moteurs JS dans le navigateur sont tous à thread unique. –

9

$(window).load() feux de fonction après la $(document).ready()

+2

Fires _long_ après le $ '(document) .ready()', en fait. – skalee

+1

A fait le travail parfaitement pour moi, merci et +1. – Renan

8

Ajouter un custom event déclencheur à votre page principale:

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

et le lier à l'autre page:

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

Références

+0

Celui-ci peut sembler effrayant à première vue, mais est en fait assez simple et généralement bien mieux que d'écouter l'événement "charger". Veuillez lire [events/ready from JQuery docs] (http://docs.jquery.com/Events/ready) si vous ne savez pas quand "load" est déclenché et combien de temps vous devez l'attendre. – skalee

Questions connexes