2012-04-12 6 views
2

Ich versuche, eine Warteschlangenfunktion für Javascript-Dateien zu erstellen. Im Grunde ist dies die Art, wie ich will, dass es funktioniert: Ich möchte eine Funktion erstellen, die alle an sie gesendeten Javascripts übernimmt und sie an der entsprechenden Stelle auf der Seite ablegt (zB Kopf- oder Fußzeile und darüber abhängige Skripte). . Ich möchte sagen können: Hier ist ein Skript. Fügen Sie es der Warteschlange in der Reihenfolge hinzu, in der es sich befinden soll. Nachdem alle Skripts in die Warteschlange gestellt wurden, führen Sie die Funktion aus, um sie auf die Seite zu schreiben. Bisher sieht mein Code wie folgt aus:Wie eine PHP-Funktion zu machen, warten Sie bis zum Ende des Skripts

$scripts = array(); 
function enqueue_script($src="", $script_name="", $script_data="", 
$script_dependencies=array(), $force_header=false, $additional_atts=array()){ 
    global $scripts; 
    //run check for duplicates 

    //run check for dependencies already in the variable 

    //run checks to see if this script depends on other scripts 
    //$scripts array is saved in increments of 10 to allow for up to 
    //9 dependants 

    $i = count($scripts); 
    $i = ($i*10)+10; 
    $scripts[$i]['src'] = $src; 
    $scripts[$i]['script_name'] = $script_name; 
    $scripts[$i]['script_data'] = $script_data; 
    $scripts[$i]['dependencies'] = $script_dependencies; 
    $scripts[$i]['force_header'] = $force_header; 
    $scripts[$i]['atts'] = $additional_atts; 

} 
function write_scripts_header() { 
    global $scripts; 
    $echo = ""; 
    $atts = ""; 
    //create script tag for insertion in header 
    foreach($scripts as $s){ 
     if($s['force_header']){ 
      foreach($s['atts'] as $a => $v){ 
       $atts .= " {$a}='{$v}'"; 
      } 
      if($s['src']!=""){ 
       $echo .= "<script src='{$s['src']}'{$atts}></script>\n"; 
      } else { 
       $echo .= "<script{$atts}>{$s['script_data']}</script>\n"; 
      } 
     } 
    } 
    echo $echo;  
} 
function write_scripts_footer() { 
    global $scripts; 
    $echo = ""; 
    $atts = ""; 
    //create script tag for insertion in footer 
    foreach($scripts as $s){ 
     if(!$s['force_header']){ 
      foreach($s['atts'] as $a => $v){ 
       $atts .= " {$a}='{$v}'"; 
      } 
      if($s['src']!=""){ 
       $echo .= "<script src='{$s['src']}'{$atts}></script>\n"; 
      } else { 
       $echo .= "<script{$atts}>{$s['script_data']}</script>\n"; 
      } 
     } 
    } 
    echo $echo; 
} 

Dann wird in der HTML-Datei Teil:

<html> 
<head> 
<?php write_scripts_header();?> 
</head> 
<body> 
<?php write_scripts_footer();?> 
</body> 
</html> 

Dies funktioniert gut, wenn die HTML-Abschnitt zuletzt geladen. Wenn ich jedoch ein Include, das in der Mitte des body-Tags passiert, und die benötigen, um enqueue_script() in der Kopfzeile, dann die $scripts Variable ist noch nicht fertig, wenn die write_scripts_header() Funktion ausgeführt wird.

Wie kann ich write_scripts_header() und write_scripts_footer() warten, bis alle Skripte in die Warteschlange gestellt wurden, bevor sie ausgeführt werden? Oder .... gibt es einen besseren Weg, um eine Skript-Warteschlange zu ermöglichen, so dass ich am Ende alle Skripte in das Dokument schreiben kann?

Antwort

0

Wenn es alles in der gleichen Datei läuft, können Sie den Body-Inhalt eine Variable, $ Körper, und laden Sie es zuerst, dann echo es in den <body> Abschnitt?

0
change 
<html> 
<head> 
<?php write_scripts_header();?> 
</head> 
<body> 
<?php write_scripts_footer();?> 
</body> 
</html> 

zu

print "<html><head>".write_scripts_header()."</head><body>".write_scripts_footer()."</body></html>"; 
0

Versuchen Sie, eine Template-Engine verwenden, wie Twig, und Sie werden zur Ausgabe Ihrer html Lage sein, nachdem Sie Ihre Skripte-Array Vorbereitung fertig sind.

Verwandte Themen