5

私のサイトには、特にドロップダウンメニューのjQueryとコードを含む1つのグローバルJavascriptファイルがあります。多くのページには、マイナーなページ固有のインタラクション、テーブルなどのためのカスタム Javascript もあります。

各ビューの現在の設定はheader.phpファイルで、基本的には Doctype からコンテンツの開始までのすべて、特定のページのビュー ファイル、およびページのfooter.php終了までをカバーしています。

現在global.js、 からリンクされてい<head>ます。パフォーマンスのために、JS をページの一番下に配置する必要がありますが、これを行う良い方法がわかりません。カスタム スクリプト ブロックを使用して完全なスクリプト行を追加することもできglobal.jsますが、それは、他の Javascript がない場合でも、すべてのページに追加する必要があることを意味します。JSを一番下に移動するより良い方法はありますか?

4

7 に答える 7

2

カスタム JS を通常の変数またはnowdoc (php 5.3.0+) に配置し、存在する場合はフッターにスクリプト タグと共に変数をエコーすることができます。JS では二重引用符と単一引用符の両方を使用でき、 PHP はテキストを解析/エスケープしないため、Nowdoc が望ましい場合があります。

someview.php:

<?php 
$custom_js = "
alert('custom js ran');
";
?>

<?php 
$custom_js = <<<'CUSTOM_JS'
alert("custom js ran (i'm in a nowdoc!)");
CUSTOM_JS;
?>

フッター.php:

<?php if(isset($custom_js)) { ?>
    <script><?php echo $custom_js; ?></script>
<?php } ?>

編集2: JavaScriptを文字列に入れたくない場合は、JavaScriptを別のファイルに入れ、PHPを使用して変数に文字列としてfile_get_contents()ロードすることができます。$custom_js

編集: これは余談ですが、JS と CSS をロードするために Carabiner ライブラリを使用することを検討してください。優れた図書館です。現在の問題に必ずしも役立つとは限りませんが、global.js が非常に大きい場合は、それを分割し、Carabiner を使用してロード時に圧縮/連結することができます。現在、これを使用して、現在の CI プロジェクトでログインしているユーザーとログアウトしているユーザーに対してどの JS と CSS をロードするかを選択しています。

于 2012-07-31T23:44:28.087 に答える
2

おそらく私は何かを見逃していました - しかし、js コードのみを含む別のビューをロードできないのはなぜですか?

テンプレート:

$this->load->view("header.php");
$this->load->view("content.php", $data);
$this->load->view("footer.php", $load_js);

次に、footer.php 内:

   // start of footer stuff here
   $this->load->view($load_js);
</body>
</html>

次に、page1.php 内:

<script>
   // Your scripts here
</script>

また:

テンプレート:

$this->load->view("header.php");
$this->load->view("content.php", $data);

次に、各「content.php」ファイル内で次のようにします。

 // Content goes here
$data['load_js'] = "page1.php";
$this->load->view("footer.php", $data);

次に、単一の「footer.php」ファイル内で:

   // start of footer stuff here
   $this->load->view($load_js);
</body>
</html>

次に、page1.php 内:

<script>
   // Your scripts here
</script>

2番目の方法は、おそらくあなたが望むものです。これは、各コンテンツ ファイルでフッターを呼び出す必要があることを意味しますが、これは文字通り 1 行であるため、実際に繰り返す必要はありません。

これを展開して、$load_js 変数をロードする js ファイルの配列にすることができます。

于 2012-08-10T12:21:58.243 に答える
1

サイトの基本構造を提供するビューである一連のレイアウトを使用します。すべてのコントローラーはレイアウトを呼び出し、そのコントローラー メソッドに固有のコンテンツをレイアウトに渡します。

たとえば、単一のレイアウトがあるとします。

<html>
  <head>
    <title><?php echo $page->title ?></title>
    <?php if (count($page->css)): ?>
       <?php for ($i=0; $i < count($page->css); $i++): ?>
         <link rel="stylesheet" href="<?php echo $page->css[$i] ?>"/>
       <?php endfor; ?>
    <?php endif; ?>
  </head>
  <body>
    <?php $this->load->view('header.php'); ?>

    <?php $this->load->view($content); ?>        

    <?php $this->load->view('footer.php'); ?>

    <?php if (count($page->js)): ?>
      <?php for ($i=0; $i < count($page->js); $i++): ?>
        <script src="<?php echo $page->js[$i] ?>"></script>
      <?php endfor; ?>
    <?php endif; ?>
  </body>
</html>

各ページは、$pagecss ファイルと js ファイルの配列を含むオブジェクトを渡します。global.js のようなグローバルなファイルの場合、それを一番下にハードコードするだけです (一番上のグローバル CSS と同じです)。または、すべてのコントローラーが継承する親コントローラーを設定できます。このようにして、オブジェクトをデフォルト設定でセットアップでき$pageます (global.js の追加を含む)。次に、必要がない場合、各コントローラー/メソッドは global.js を削除できます。

各ページは$content、ページのメイン ビューの場所を含む変数も渡します。

複数のレイアウトを作成し、一部の HTML をレイアウトに移動することで、これをさらに拡張できます (例: 1 列、2 列、3 列のレイアウト)。そのような場合、各列などに複数のビューの場所を渡すことができます。それは本当にあなた次第です。

もちろん、すべての JS を最下部に保持するには、すべてのページ固有のカスタム JS を JS ファイルに移動する必要があります。外部 JS をキャッシュできることを考えると、実際にはこれが最善の方法です。

于 2012-08-10T07:48:24.757 に答える
0

ヘルパー関数を作成します。global.jsそのスクリプトを含めるビューをロードします。global.jsをページの下部に配置する必要があるときはいつでも、そのヘルパー関数を呼び出すだけです。

于 2012-07-31T23:48:24.647 に答える
0

もう 1 つのオプションは、テンプレート ライブラリを使用することです。

Williams Conceptsのこれを使用しています。
個々のクラス/メソッド呼び出しに JS (および CSS) を追加できます。
例えば:

class foo exends Controller {
    public function bar() {
        $this->template->add_js('js/jquery.js');
        $this->template->add_js('alert("Hello!");', 'embed');

        $data = $this->some_model->get_data();
        $this->template->write_view('content', 'user/profile', $data;

        $this->template->render();
    }
}

これを使用して、必要に応じて JS を追加するか、サイトのテンプレートに追加できます。
あなたの場合、必要な JS を追加できる場合は、テンプレートのフッターに global.js を追加するか、テンプレートのフッターにリージョンを定義します。

于 2012-08-14T16:07:34.717 に答える
-1

すべてのページに含まれる footer.php ファイルがある場合、なぜそのファイルに js コードを入れることができないのでしょうか?

于 2012-08-14T18:33:05.500 に答える