2017-09-28 1 views
0

J'utilise un système basé sur PHP pour générer des pages HTML à partir d'un modèle et d'une série de fichiers inclus.

Tous les scripts (qu'ils soient liés ou en ligne) sont extraits de ces inclusions et placés au début ou à la fin de la page générée.

Les scripts en ligne sont combinés en un seul script en ligne.

Tout cela fonctionne bien. La seule chose qui me manque est une façon de combiner les multiples fonctions $ (document) .ready jQuery en une seule fonction.

Alors que cela fonctionne bien ayant les fonctions multiples, pour l'esthétique et la lisibilité, il serait bien d'avoir une seule fonction $ (document) .ready.

Pour donner un exemple, je veux être en mesure d'analyser ceci:

<script language="javascript" type="text/javascript"> 
$(document).ready(function() { 
    $('.icheck').iCheck({ 
     checkboxClass: 'icheckbox_minimal-green', 
     radioClass: 'iradio_minimal-green', 
    }); 
    $('.icheckblack').iCheck({ 
     checkboxClass: 'icheckbox_minimal', 
     radioClass: 'iradio_minimal', 
    }); 
}); 
$(document).on("eldarion-ajax:begin", function(evt, $el) { 
    $(".noData").remove(); 
    $("#" + $el.data("bq")).show(); 
}); 
$(document).ready(function() { 
    $(".commentToggle").each(function(index) { 
     $(this).click(function() { 
      var tl_id = $(this).data('tl_id'); 
      $("#commentForm" + tl_id).toggle(); 
     }); 
    }); 

}); 
$(function() { 
    $('#email_content').redactor(); 
}); 
</script> 

Dans ceci:

<script language="javascript" type="text/javascript"> 
$(document).on("eldarion-ajax:begin", function(evt, $el) { 
    $(".noData").remove(); 
    $("#" + $el.data("bq")).show(); 
}); 

$(function() { 
    $('#email_content').redactor(); 
}); 

$(document).ready(function() { 
    $(".commentToggle").each(function(index) { 
     $(this).click(function() { 
      var tl_id = $(this).data('tl_id'); 
      $("#commentForm" + tl_id).toggle(); 
     }); 
    }); 
    $('.icheck').iCheck({ 
     checkboxClass: 'icheckbox_minimal-green', 
     radioClass: 'iradio_minimal-green', 
    }); 
    $('.icheckblack').iCheck({ 
     checkboxClass: 'icheckbox_minimal', 
     radioClass: 'iradio_minimal', 
    }); 

}); 
</script> 

J'ai vu des questions similaires qui n'ont pas vraiment été répondu , mais ont pointé dans la direction de Tim Whitlock's jParser mais ce n'est pas très bien documenté et semble être trop pour mes besoins.

J'ai envisagé d'utiliser quelque chose autour de preg_match_all, mais je ne pense pas que JavaScript soit suffisamment cohérent dans sa structure/formatage pour que cela soit fiable.

+1

[Vous pouvez avoir plusieurs gestionnaires $ (document) .ready sur une seule page] (https: // stackoverflow.com/questions/1327756/can-vous-avez-multiple-document-readyfunction-sections) –

Répondre

1

J'ai fait quelque chose de similaire comme ça une fois. Je vais essayer d'obtenir un code de pseudo plus tard une fois que j'aurai le temps. Mais l'essentiel c'est que vous lisiez le fichier javascript et le parcouriez ligne par ligne et que vous utilisiez preg_match pour correspondre exactement à $(document).ready(function() {. Une fois que vous faites correspondre cette ligne, commencez à enregistrer chaque ligne suivante dans une chaîne. Cette chaîne enregistrera toutes les fonctions dans le document prêt.

Ensuite, créez une variable $counter qui comptera le nombre de parenthèses ouvrantes et fermantes et définira-le à 1 par défaut. Ensuite, pendant que vous itérez sur les lignes, faites un preg_match_all pour la parenthèse ouvrante ( et un autre preg_match_all pour fermer la parenthèse ) et comptez le nombre de correspondances pour chaque parenthèse ouvrante/fermée sur chaque ligne. Pour chaque parenthèse ouvrante, incrémentez votre variable $counter de 1 et, pour chaque parenthèse de fermeture, décrémentez la variable $counter de -1. Ensuite, après chaque ligne, vérifiez le compteur de variable actuel pour voir s'il est à 0. Une fois qu'il est à 0, cela signifie que l'original $(document).ready(function() { a été fermé. Une fois que tous les fichiers ont été analysés, toutes les fonctions de l'instruction $ (document) .ready ont été enregistrées, ajoutez-les à votre propre chaîne $ (document) .ready.

Bien sûr, cela suppose que le fichier javascript n'est pas réduit et que les instructions $ (document) .ready démarrent et se ferment sur leurs propres lignes distinctes. Si le fichier est minifié ou n'est pas formaté correctement, vous devrez effectuer d'autres tâches avec strpos(). Cette méthode sera problématique si pour une raison quelconque vous avez une seule parenthèse d'ouverture ou de fermeture stockée dans une chaîne comme ')'. Mais si vous ne pensez pas que ce sera un problème, alors cela devrait fonctionner assez bien.

+0

Merci Walker Boh - c'est ce que je pensais, mais comme vous l'avez souligné à juste titre, il faudrait que le js est correctement formaté et non minifié. Tandis que dans la plupart des cas ce sera, malheureusement je ne peux pas le garantir. Peut-être que je pourrais d'abord lancer un formateur js, alors cela pourrait être plus viable, mais il y aurait un coût de vitesse. –