【问题标题】:Can certain PHP be served based on if JavaScript is enabled?如果启用了 JavaScript,是否可以提供某些 PHP?
【发布时间】:2011-10-03 20:05:25
【问题描述】:

我想要做的是有一个页面根据是否启用 JS 来提供不同的标记。 我的想法是在初始页面加载时提供一组基本内容。当页面加载时,还会有一些 javascript 函数向服务器提交 ajax 调用,并使用发布数据让服务器知道 javascript 已启用。在完成 ajax 调用后,页面将使用发布数据再次刷新/服务,以了解 JS 已启用并提供基本内容以及 JS 启用内容。我的目标是让它尽可能无缝。

*编辑:我应该添加我想维护一页。所以页面只会用 JS 内容刷新。不重定向到新页面。

我的问题是双重的,这可能吗?如果可以,我能否就实现这一目标所需的代码获得一些指导?

【问题讨论】:

    标签: php javascript ajax post


    【解决方案1】:

    可以,但不应该。 假设 JS 是您应该提供的唯一页面是使用 Ajax 调用的页面。

    如果你真的需要知道(这通常不应该发生),你应该假设 JS 是关闭的,直到你得到它打开的信息。

    【讨论】:

      【解决方案2】:

      服务器端脚本无权访问此信息,因为它不与 HTTP 标头一起传递。 interesting solution I just found 将有两页。第一个具有 javascript 触发的重定向到第二页。因此,如果他们点击第二页,您就知道他们启用了 javascript。

      另一种解决方案依赖于无效的 HTML,可能不适用于所有浏览器。使用<noscript> 标签并在其中放置一个元刷新元素,如下所示:

      <noscript>
         <meta http-equiv="refresh" content="0; url=http://example.com/nojavascript.php">
      </noscript>
      

      然后在指向 javascript 页面的 javascript 中触发 onload 的另一个重定向。如果它转到 nojavascript.php 他们没有启用 js,如果它转到第二个,他们会这样做。

      但我只是假设他们没有打开它,除非他们被 js 重定向,并相应地构建第一页。

      【讨论】:

        【解决方案3】:

        你不能一步完成,但如果你不介意中间页面,你可以有类似的东西:

        <noscript>
           <img src="js-is-disabled.php" />
        </noscript>
        

        和

        js-is-disabled.php:

        <?php
        session_start();
        $_SESSION['js_is_off'] = true;
        

        这具有在任何禁用 JS 的浏览器上运行的优势,只要它足够现代,可以识别 &lt;noscript&gt; 标签。

        另一种方法是让 JS 的小 sn-p 触发 AJAX 请求以调用脚本,该脚本将 JS 标记为在会话中可用。这可能更可靠一点,因为只有在 JS 正常工作时才会发生这种情况。

        【讨论】:

        • 感谢 Marc,我知道 PHP 无法测试第一次加载时是否启用了 JS。我喜欢您让 JS 进行 ajax 调用以将其标记为在会话中可用的替代想法。
        【解决方案4】:

        您要做的是在容器中加载“非 javascript”标记,例如 &lt;div id="container"&gt; DEFAULT/FALLBACK MARKUP HERE &lt;/div&gt;。然后,在文档准备好时,进行 ajax 调用以获取“启用 javascript”标记并用它填充 #container div。只有在打开 javascript 时才会填充它:)

        例子:

        $(function(){
        
            $.ajax({
                url:'/javascript_enabled_html.php',
                dataType:'html',
                /* set your other params...*/
                success:function(data){
                    $('#container').html(data);
                }
            });
        });
        

        【讨论】:

        • 几乎是我要建议的。使用 AJAX 调用 PHP 脚本,该脚本将加载您想要的 JS 版本并替换页面上的旧内容。它只适用于启用 JS。
        • 感谢 AlienWebguy,我对这种方法有两个问题。你认为#container 中的内容仍然可以被蜘蛛抓取吗?如果不是,那将是一个问题。另外,我担心使用使用文档就绪功能来触发功能的 jquery 插件。我不认为通过 ajax 拉入#container 的内容能够使用 $(document).ready(function() { 因为它在内容被拉入之前就已经被触发了?我的目标是维护 SEO,并且能够使用我目前使用的 jquery 插件,无需任何改动。
        • 不,它不会被蜘蛛抓取 - 没有 ajax 调用会提取可抓取的数据。关于document.ready,它会起作用的,不用担心:)
        • 好的,有没有办法在页面加载时通过 ajax 提交帖子数据,然后在 ajax 调用成功时让页面重新加载/刷新,并在重新加载/刷新时访问提交的帖子数据页面?
        • 否,但您可以内爆 $_POST 并通过 window.location 指针将其作为查询字符串发送。例如,如果 $_POST['a'] == 'foo' 和 $_POST['b'] == 'bar',你会这样做 然后 $(function(){ window.location = window.location.href + ? + =$querystring?>; /* mypage.com?a=foo&b=bar*/ });
        猜你喜欢
        • 2013-06-14
        • 1970-01-01
        • 2017-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多