【问题标题】:dynamically include PHP based on browser features基于浏览器特性动态包含 PHP
【发布时间】:2012-07-10 01:14:58
【问题描述】:

重写

我有一个用 HTML5 编写的网站,以及用 XHTML 编写的同一个网站。我想根据某人是否使用支持 HTML5 一些最基本功能的浏览器来呈现其中一个。

注意

该网站不使用 HTML5 的画布、音频或视频功能。它只是简单地标记为side、section、nav 等,并使用CSS3 的一些有趣功能进行样式装饰。 HTML5 站点和 XHTML 站点之间的差异很小,如果我能做到这一点,任何人都可能几乎不会注意到。内容相同,只是呈现方式略有不同。

我这样做的原因

一旦恐龙浏览器消失,我希望我可以简单地发布 HTML5 网站,并废除旧的 XHTML。

我遇到了一些后勤障碍,还没有完全确定我想如何去做。我最初的想法是使用 Javascript 条件语句来确定要渲染的 PHP。是的,继续笑吧,我可能有一天也会笑。在对此进行调查时,有人评论说 XML 可能使这成为可能。我相当有能力使用 Javascript、PHP 和 XML。这是我第一次尝试将 Javascript 与 PHP 集成,所以现在我明白了为什么我最初的计划需要更多的工作。

最终,我非常强烈地认为这就是我想要前进的方式。我阅读了渐进增强与优雅降级的文章,但我决定为我的客户提供一个漂亮的网站,使用所有新的语义标签和简单的样式选择器来增加 SEO 并保证当 HTML4 消失时,这个新网站将继续存在时间的考验……至少是一小会儿。

如果您强烈反对这种方法,我愿意听听您的意见。无论哪种方式,请分享您的想法。

【问题讨论】:

  • 鉴于 JS 不会影响 PHP 的加载方式,我看不出这怎么可能。
  • 你可以在 JS 中插入
  • 然后呢? php -always- 在 JS 之前加载,并且 JS 是客户端。
  • 在条件语句中调用php之前不会加载。
  • Javascript 不能这样工作,PHP 也不能。

标签: php javascript html xhtml include


【解决方案1】:

你要求的是不可能的;正如我已经解释过的,PHP 是服务器端,而 JS 是客户端; php 方面所做的任何事情都在页面交付给用户时完成,因此 js 不可能影响 php 方面,除非您的网站或内容交付是在 ajax 中完成的完全,这是一种使用js和php检索信息的方法;简而言之,js向你服务器上的另一个php页面发送请求并返回结果。

然而这要复杂得多,在您对 JS 和 PHP 都比较熟悉之前,我不建议您这样做。

不过,除此之外,php 中有一个解决方案,虽然我现在没有完整的代码。

解决方法是get_browser()的php 4和5函数:

$arr = get_browser(null, true);
$var = "some browser";
if ($arr['parent'] == $var) {
   require('/php/file.php');
}
else {
   //etc
}

以上是您的答案更新之前;关于上述更新,我无话可说。

更新:关于下面关于 ajax 的 cmets 之一,我将尝试.. 一个示例。我不会尝试称其为“简单”,因为 ajax 绝不是……不过回到正题……

HTML:

<html>
    <body>
        <div id="main_body">
        </div>
    </body>
</html>

JS:

//some code to determine user-agent/browser, set variable 'agent' with result
var use_html5;
if (agent == browser) {
    use_html5 = 'yes'
}
else {
    use_html5 = 'no'
}

function retrv_body() {
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4) {//readState 4 is when the request has finished;
            //0: request not initialized 
            //1: server connection established
            //2: request received 
            //3: processing request 
            //4: request finished and response is ready
            document.getElementById('main_body').innerHTML = xmlhttp.responseText;
            //set html of div with id 'main_body' to rendering retrieved from php_file_in_same_dir.php
        }
    }
    xmlhttp.open("POST","php_file_in_same_dir.php",true); 
    //set type of form, boolean is in regards to whether the request is asynchronus or synchronous
    //most ajax requests are async, which means they themselves finish executing usually after the function itself has run.  I'm not truly knowledgeable regarding this specific thing since I've only ever used async requests, though I would assume being a sync request would mean the function actually waits until it returns a value before it finishes executing.
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    //set the headers of the content.
    xmlhttp.send("html5=" + use_html5);
    //finally, send the data.  Depending on the data, the data may need to be url-encoded.
}

retrv_body();

PHP:

<?php
if ($_POST['html5'] == 'yes') {
    include('body5.php');
}
else {
    include('body_other.php');
}
//body generating code, render page.
?>

以上只是一个例子,我不建议实际使用它,保存retrv_body()函数,并将其更改为您真正可以使用的东西。

希望我在代码中添加的 cmets 将有助于理解;如果还有什么要问的,请随时要求我解释得更彻底。

【讨论】:

  • 我没有直接回复你,因为我觉得你在居高临下。我完全理解你在说什么,我只是想让你解释一下自己。现在你承认这个想法是有可能的。如果我想检查每个浏览器,我会使用 PHP 用户代理。感谢您的宝贵时间。
  • @nodirtyrockstar 我不是故意的。如果你愿意我删除我上面的​​评论,我会,我会尝试重写上面的,所以不是这样。
  • Daedalus-感谢更新。它给了我很多思考。如果您有兴趣阅读有关异步和同步 AJAX 的信息,我发现这篇旧的但看似内容丰富的博客文章:yuiblog.com/blog/2006/04/04/synchronous-v-asynchronous
  • @nodirtyrockstar 谢谢你,它确实解释了一些我不确定的事情。
  • 好的。我发现我可以使用 html5 DTD 并且旧的浏览器不会哭。这是一个很好的解决方案。一块一块地,我要把这个网站放在一起。在 95% 的浏览器中都会很漂亮。
【解决方案2】:

不。不。不。不。不!

两点:

  1. 使用HTML5 shiv - 为旧版 IE 浏览器提供 HTML5 功能)
  2. Progressive enhancement - 你不应该为不同的浏览器编写代码。您的代码应该在所有浏览器中工作。然后添加一些功能来增强用户体验,但网站运行不需要这些功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多