【问题标题】:DOM class injection in PHPPHP中的DOM类注入
【发布时间】:2010-03-12 13:24:56
【问题描述】:

想法

通过 jQuery,我能够使用 first 类标记文档中的所有 :first-child:last-child 元素(嗯,几乎所有:)),我以后可以设置样式(即ul#navigation 中的第一个 li 将是可轻松寻址为ul#navigation .first)。

我使用了以下代码:

  var $f = $('*:first-child')
      $f.addClass('first');
  var $l = $('body *:last-child')
      $l.addClass('last');

示例

http://jsbin.com/ikuca/3

示例已经在这里——但这不是实现它的方法,它只是一个在其他语言中原型化的想法,对我来说目前更简单的语言。

问题

现在,我的问题是是否可以通过php 执行相同的操作,因此非 JS 用户/小工具可以具有相同的效果和额外的样式,并且在浏览器上也不会过度杀伤。

那么,是否可以捕获输出,将其解析为 html 并将此类轻松注入php

澄清

我很清楚 output buffering,只是没有用它做太多事情 - 另外,我不确定将 php 中的输出 string 修改为 解析的 dom (没有regex) - 以及它在服务器上的难度 - 当然还有缓存,所以整个内容将运行一次,直到再次编辑页面。

【问题讨论】:

    标签: php dom code-injection


    【解决方案1】:

    我相信您可以使用output buffering 来捕获您组装的PHP 页面,然后在其上使用DOMXPathadd the class attributes,但问题是,您为什么不直接放置类首先组装页面时将元素放在元素上?为您节省 jQuery 和捕获。

    另外,使用 jQuery 添加 CSS 类以实现 ul#navigation.first 也有点奇怪,因为您使用的 jQuery 表达式是 CSS 选择器,因此您可以直接使用它来设置 CSS 文件中的第一个子项的样式.添加 .first 类的唯一原因是,如果您想向后兼容无法处理 :first-child 的浏览器。

    【讨论】:

    • 只是输入了几乎相同的内容 - +1
    • 因为它的方式更简单?这就像跨浏览器:first-child
    • @Adam 不,不是。事实上,这完全是复杂的。首先添加类,您甚至不再需要 jquery。
    • @Gordon 是对的:最好的方法是首先添加类!
    • @Gordon - 使用 jQuery - 这只是另一种语言的快速原型化行为,所以你会更快地得到这个想法,请看我的编辑。 @Josh:嗯,这就是我想要做的......
    【解决方案2】:

    我想你会发现在 jQuery 中比在 PHP 中更容易做到这一点,但它可以在 PHP 中完成。

    要捕获输出,您需要在发送任何输出之前使用ob_start 函数激活输出缓冲。您可以传递ob_start() 一个PHP 函数,该函数将接收HTML 代码作为参数,然后可以使用PHP's DOM functions 操作HTML。

    【讨论】:

    • 所以没有伤害?就像dom_parse(ob_flush());?服务器负载呢,如果我愿意的话(当然是适当的缓存)
    • 嗯,这是额外的负载,因为服务器会生成 HTML,现在必须解析它才能更改它。最好在生成 HTML 时添加类。如果不是很多 HTML,它不会导致太多的负载。并且有人声称使用输出缓冲实际上可以让您的代码运行得更快......
    • dom_parse(ob_flush());,应该是ob_start('dom_parse')。然后当你调用 ob_end_flush() 时,你的输出缓冲区被发送到你定义的 dom_parse() 函数。请参阅ob_start的手册
    【解决方案3】:

    jQuery 在客户端的浏览器中运行。 PHP 在服务器上运行。一旦提供服务,您就无法从服务器修改浏览器中的 DOM。

    您可以做的就是使用适当的类为页面提供服务。例如在 PHP 中打印表格时:

    <table>
    <?php
    $i=0;
    foreach ($rows as $row):
    ?>
        <tr class=<?php echo ($i%2==0?'even':'odd')?>
            <td><?php echo $row;</td> 
        </tr>
    <?php
    endforeach;
    ?>
    </table>
    

    ps。你真的要支持没有 JS 的客户端吗?

    【讨论】:

    • 不过,您可以在发送 HTML 之前对其进行修改。例如,使用输出缓冲。或者首先生成正确的 HTML :-)
    • @sibidiba:把明显的东西放在一边(那里有 jQuery,这里有 PHP),降低移动设备上的 javascript 严重性可能是加分项。
    • 这一切的重点是准备好一些 basic 类(第一个,最后一个 ...)而不考虑它 - 做 xhtml,做 css(first)记住,把模板系统放进去,瞧。
    【解决方案4】:

    您甚至可以通过使用here 中提到的一些库来使用相同的 CSS 选择器。 我读到 phpQuery 库甚至具有您需要的相同的 :first-child pseudo-class

    我真诚地希望您计划使用 缓存,否则您的 CPU 使用率会因一些请求而上升 100%

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多