【问题标题】:How to include CSS in header with PHP? [closed]如何在 PHP 的标头中包含 CSS? [关闭]
【发布时间】:2014-03-15 10:38:23
【问题描述】:

假设我有如下标记:

<!DOCTYPE html>
  <html>
    <head>
    </head>
  <body>
     <?php
     PutIntoHeader("<script src="im_on_top"></script>")
     ?>
  </body>
</html>

PutIntoHeader 函数会将给定的脚本放入渲染的 html 的头部。我可能遗漏了一些非常明显的东西,但我似乎无法弄清楚。任何想法该功能将如何做到这一点?

输出将是:

<!DOCTYPE html>
  <html>
    <head>
       <script src="im_on_top"></script>
    </head>
  <body>
  </body>
</html>

感谢您的任何想法。

编辑:->

嗨,我觉得得到这样的答案是个菜鸟:) 我的系统非常复杂,在我编写标题时,我不知道该特定页面会请求哪些脚本,因为它是动态的。我可以在渲染之前将所有 html 放入变量中,然后将其作为 xml 遍历并手动将其放在那里,同时将脚本存储在数组中,但我不想走这条路。

【问题讨论】:

  • 呃……就写在标题里吧……?!
  • 这是一个非常简单的例子,在现实世界的场景中我无法将它写在标题中,因为我当时不知道最终会加载哪些脚本。
  • 使用echo。另外,要小心双引号。如果不转义这些引号,您的示例将无法工作。
  • 你在建立一个cms吗?如果是这样,您可以创建一个可以从当前文件中获取标头并附加该脚本的函数
  • 您需要对小部件进行某种依赖性检查。存储每个小部件所需的依赖项列表。当您加载页面时,在输出头部之前确定要包含哪些小部件。

标签: php html header


【解决方案1】:

几乎在所有情况下,您都可以轻松地将脚本组合并缩小到一个文件中。这会减慢初始加载时间(首次访问网站),但会加快进一步访问/导航,因为文件将被缓存。

当然是 YMMV,这取决于您的具体情况。参见例如this thread

还有一个问题是用户代理不能无限并发连接到同一个域来加载资源。

例如看看这两个(有些过时的)基准:

在您所说的 cmets 中,您正在使用一百万个不同的小部件。这是否意味着这些小部件都具有完全特定且不同的代码,或者只是数据不同或呈现方式不同?如果只是数据/演示文稿,则不需要其他脚本。

如果您确实在谈论针对不同小部件的一百万个完全不同的代码(一百万突然听起来像是一个任意组成的数字)确实可能不将所有内容加载到单个脚本中是有意义的.但我们无法回答这个问题,因为这取决于文件大小、您希望加载第一次访问的速度、共享代码的数量以及更多类似的数字。

所以回到你的问题“我怎样才能在头部加载特定的脚本?”。

一种选择是不在头部渲染它,而是将它放在&lt;/body&gt; 和body 标签之前。这种方法的优点是您知道到那时要加载什么脚本。页面将加载得更快(因为在实际页面将被渲染之前,head 中的资源将首先完整下载)。这种方法的缺点是在你的脚本启动之前会有一个小的延迟,因为它将是最后加载到 DOM 中的东西。

另一种选择是在 PHP 端延迟 HTML 的呈现,并更像模板引擎一样使用它。一个简单的例子是首先获取所有要显示的小部件,然后才在 PHP 中启动 HTML 渲染。

一些引导文件

<?php

// load widgets from db or wherever
$widgets = [
    [
        'template' => '/templates/widget1.phtml',
        'script'   => '/js/widget1.js',
    ],
    [
        'template' => '/templates/widget2.phtml',
        'script'   => '/js/widget2.js',
    ],
];

require __DIR__ . '/templates/page.html';

一些模板(page.phtml)

<!DOCTYPE html>
<html>
    <head>
        <title>My page with widgets</title>
        <?php foreach ($widgets) { ?>
            <script src="<?php echo $widgets['script']; ?>"></script>
        <?php } ?>
    </head>
    <body>
        <?php foreach ($widgets) { ?>
            <?php echo $widgets['template']; ?>
        <?php } ?>
    </body>
</html>

附:在上面的例子中我使用了script标签,但它也可以扩展为css文件。

【讨论】:

  • 我会接受你的问题,因为你对这种方法是正确的。另请注意,我提到了在结束正文标记之前加载 js 的可能性,但这不适用于 css 这么好。然而,小部件只是为了说明问题,我根本没有使用小部件。我只是好奇是否有某种方式,例如在 .NET 上拥有可以随时随地调用的方法,它最终会插入到 Header 中。正如我所说,这可以通过将所有输出 html 存储在变量中然后访问 head 部分并在呈现最终 html 之前插入这些脚本来完成 html
【解决方案2】:

如果你不想直接放在头上,因为当时你不知道需要什么,你需要事先执行逻辑。

您需要将逻辑与视图分离,并将视图作为呈现信息的简单方式。

首先计算有关您页面的所有内容,并为自己留下可用于提取相关信息的变量,然后为您预先计算的变量输出相关的 html。

这可以在一个页面中自己完成,或者我的建议是使用某种库来帮助解决这个问题。像 Kohana 这样的东西真的很擅长,你可以使用 Kohana 来分离你的控制器、模型等,然后使用像 mustache 这样的东西作为模板库。 Mustache 让您可以创建仅包含最基本逻辑的视图(应该是这样)。

【讨论】:

    【解决方案3】:

    您的 PHP 代码无法知道内容应该输出到哪里。一旦页面被渲染,PHP 就会失去对数据的控制。

    您似乎正在尝试将内容写入&lt;body&gt; 并且然后将其注入&lt;head&gt; 部分。 为什么不输出&lt;head&gt;部分的内容呢?

    <!DOCTYPE html>
      <html>
        <head>
            <?php echo "<script src=\"im_on_top\"></script>"; ?>
        </head>
      <body>    
          <!-- Some HTML markup here -->
      </body>
    </html>
    

    【讨论】:

    • 嗨,我觉得得到这种答案是个菜鸟.我可以在渲染之前将所有 html 放入变量中,然后将其作为 xml 遍历并手动将其放在那里,同时将脚本存储在数组中,但我不想走这条路..
    • @user3370402:如果你有这样的印象,我很抱歉。我建议您编辑您的问题,以使其完全清楚您要达到的目标。在当前的形式中,您似乎正试图在页面完成加载之后更改网页的结构。
    • 是的,我在问题中添加了评论,无论如何感谢您的回复。
    • @user3370402:这与此线程上的评论相同(除非我遗漏了什么)?
    【解决方案4】:

    你可以试试这样的:

    <head>
        <?php echo '<link rel="stylesheet" type="text/css" href="theme.css">'; ?>
    </head>
    

    【讨论】:

    • 为什么要投两票,谁能解释一下?
    • 他们认为您应该在发布此答案 10 分钟后阅读答案和 cmets!根据您当时掌握的信息,您的回答完全有效!
    • 当他们在没有阅读任何以前的 cmets 的情况下清楚地回答时,我拒绝了另一个答案,但我从一开始就赞成这个答案。
    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 2021-01-25
    • 2016-11-04
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多