【问题标题】:Using Javascript to override or disable meta refresh tag使用 Javascript 覆盖或禁用元刷新标签
【发布时间】:2011-03-16 05:29:57
【问题描述】:

我有一个网站,我正在尝试使用 Ajax 来更新页面上的一些内容,而无需重新加载它。但是,我的许多用户很有可能会使用不支持 Javascript 的移动浏览器,因此我正在尝试使用元刷新标签设计页面,以某种方式仅适用于没有 Javascript 的用户。有没有办法做到这一点?

我尝试将标签放在 noscript 元素中,但我的原始手机浏览器无法识别它。我正在考虑设置一个 cookie 来记住用户的浏览器是否支持 Javascript,或者有一个没有 Javascript 的页面版本,并尝试使用 Javascript 将用户重定向到更复杂的版本,但我想知道是否有是一种更优雅的方式。有人有什么想法吗?

【问题讨论】:

  • 我想我从这个问题中了解到,我正在尝试做的是很多麻烦,可能不值得花精力去处理所有问题。我想我可能会像 Hrishi 建议的那样重定向,或者如果我希望 Javascript 和非 Javascript 页面使用相同的 URL,我可能只在用户选择启用它们时使用元刷新标签,并使用 cookie 记住用户的选择。感谢您的所有回答。

标签: javascript html ajax meta-tags


【解决方案1】:

我发现 noscript 标签非常适合这个。例如,您可以在 close 头部元素之后放置它:

<noscript>
    <meta http-equiv="refresh" content="5;URL=http://www.example.com">
</noscript>

不需要删除带有脚本的元标记,因为支持脚本的浏览器会忽略 noscript 元素内的所有内容。

【讨论】:

  • 你能提供更多关于你使用的细节吗?我已在多个网站上成功使用此功能,并在许多桌面和移动浏览器上进行了测试。
【解决方案2】:

您不能使用 JavaScript 覆盖元刷新标记。

你可以这样做

假设您的页面位于 ->

http://example.net/mike.html 把下面的代码放在那里->

<script type="text/javascript">
window.location = 'http://example.net/mike/for_Those_With_JavaScript_Enabled.html';
</script>

【讨论】:

  • 我的意思是重定向禁用 JavaScript 的浏览器,您可以重定向启用 JavaScript 的浏览器。
  • 这很聪明。它干净、简单,可以解决问题。
  • 这会与后退按钮混淆。启用 javascript 的用户单击后退按钮将陷入重定向循环。他们需要双击后退按钮才能退出。
  • 调整后退按钮使用javascript修改浏览器历史记录
  • 这个答案部分不正确。如果您执行window.onbeforeunload = function() { return 'test' };,您可以弹出一个窗口并单击“留在此页面”以中止刷新。从用户体验的角度来看,这是一个糟糕的选择,但它是一种阻止刷新的技巧。
【解决方案3】:

不幸的是,从 @bluesmoon's answer 开始,操作 DOM 不再起作用。

解决方法是检索原始标记,找到并替换元刷新元素,然后使用替换的标记编写新文档。

除了使用XMLHttpRequest 发送附加请求外,我不知道如何使用 JavaScript 检索原始标记。

在 Opera 中,这是我正在使用的:

Disable meta refresh 1.00.js:

// ==UserScript==
// @name Disable meta refresh
// @version 1.00
// @description Disables meta refresh.
// @namespace https://stackoverflow.com/questions/3252743/using-javascript-to-override-or-disable-meta-refresh-tag/13656851#13656851
// @copyright 2012
// @author XP1
// @homepage https://github.com/XP1/
// @license Apache License, Version 2.0; http://www.apache.org/licenses/LICENSE-2.0
// @include http*://example.com/*
// @include http*://*.example.com/*
// ==/UserScript==

/*
 * Copyright 2012 XP1
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*jslint browser: true, vars: true, maxerr: 50, indent: 4 */
(function (window, XMLHttpRequest) {
    "use strict";

    if (window.self !== window.top) {
        return;
    }

    window.stop();

    var uri = window.location.href;

    var request = new XMLHttpRequest();
    request.open("GET", uri, false);
    request.send(null);

    if (!(request.readyState === 4 && request.status === 200)) {
        return;
    }

    var markup = request.responseText;
    markup = markup.replace(/<meta http-equiv="refresh".*\/?>/gi, "");

    var document = window.document;
    document.open();
    document.write(markup);
    document.close();
}(this, this.XMLHttpRequest));

Opera 还具有禁用元刷新的内置功能。不需要 JavaScript。

  • 右键单击网页>编辑站点首选项...>网络>禁用“启用自动重定向”>确定。

【讨论】:

  • 将不得不对此进行测试。谢谢!
【解决方案4】:

这对我来说太棒了! (在 chrome 中试过)

window.stop();

【讨论】:

    【解决方案5】:

    在这种情况下,元标记很糟糕。搜索引擎呢??

    你应该做的是让它像我概述的那样here。 您的链接应该指向完整的工作站点,就好像它是一个 web 2.0 页面一样。然后使用事件处理程序 (onclick),您可以使用 ajax 来增强用户体验。

    所以 ajax 用户不会转到链接,而是在单击链接时处理链接并将 ajax 请求发送到完全相同的 url 但带有 ajax GET 参数。

    现在在服务器端,您必须能够通过某种方法生成整个站点。如果是 ajax 请求,则发送相关内容。如果不是 ajax 请求,则生成完整的站点,其中包含相关部分嵌入

    您的网站将SEO 友好可供移动用户使用,并且逐步增强适合现代浏览器和平台上的用户。最后,ajax 生成的哈希链接将可用,即使作为链接。

    真棒。 :)

    【讨论】:

    • 元标签有多糟糕?我不是想用它们来重定向。我只是用它们来刷新页面,作为不支持 Javascript 的用户的后备。我看不出这会如何影响搜索引擎。我不完全确定这是否是我想要做的,但我仍然很好奇我会怎么做。
    • 你不知道该怎么做,对你来说还不够吗? :) 你检查过链接吗???
    • 我检查了链接。使我的服务器上的代码复杂化以两种方式提供数据似乎有点棘手。如果我这样做,我将不得不处理一些怪癖。如果我将 URL 的重要部分放在 # 符号之后,并且有人将该页面添加为书签并尝试访问它,则除非我有一些 JS 来加载内容,否则它将不会像往常一样加载。如果用户点击后退按钮,同样的事情。我不确定搜索引擎以这种方式制作我的网址是否有益。他们可能会看到 # 并认为它只是指向同一页面不同部分的链接。我认为使用元刷新标签可能更简单。
    • 你还没有读过我的帖子 :)) 网址应该指向完整的工作站点而不是哈希。 事件处理程序是附在链接上。他们将发出 ajax 请求并更改 url 中的哈希值。如果您已完整阅读它,您就会知道当有人从外部访问它们时,ajax 生成的 url 正在工作。它是在服务器端而不是在客户端处理的。这个例子甚至证明了这一点。下次请仔细阅读...
    【解决方案6】:

    只需使用 javascript 删除元标记:

    <meta http-equiv="refresh" content="2;http://new-url/" id="meta-refresh">
    
    <script type="text/javascript">
    var mr = document.getElementById("meta-refresh");
    mr.parentNode.removeChild(mr);
    </script>
    

    作为示例,我已将刷新超时设置为 2 秒以上。您可能也可以逃脱 1 秒,但不要将其设置为 0,因为在这种情况下 javascript 将没有机会执行。 0 也很烦人,因为它破坏了后退按钮的可用性。

    编辑 2012-10-23 这似乎不再起作用。该节点仍会被删除,但似乎浏览器会以任何方式解析所有元标记并将其保存在内存中。

    【讨论】:

    • 这行得通吗?也许浏览器变得更严格了,似乎不再起作用了。可惜
    • @Timothy 解决方法是检索原始标记,找到并替换元刷新元素,然后用替换的标记编写新文档。看我的回答:http://stackoverflow.com/questions/3252743/using-javascript-to-override-or-disable-meta-refresh-tag/13656851#13656851
    • 我没有对此进行测试,但从理论上讲,我认为这行不通。元刷新使用 http-equiv 元标记来模拟 Refresh HTTP 标头,因此也可以由 HTTP Web 服务器作为标头发送。由于 js 是在响应发送之后来的,所以重定向头早就没有了
    • @AlinMirceaCosma 该问题涉及标记中包含的“标签”,而不是 HTTP 标头。只要标记包含元刷新,而不是作为标题,如果 JavaScript 有时间执行,元刷新就可以被移除。
    【解决方案7】:

    我同意元刷新在这里不是正确的方法。除了 galambalazs 的链接,搜索“progressive enhancement”。

    但是,本着回答问题的精神,您可以尝试以下方法。它未经测试,可能不适用于所有浏览器,但应该是正确的:

    var i, refAttr;
    var metaTags = document.getElementsByTagName('meta');
    for i in metaTags {
        if( (refAttr = metaTags[i].getAttribute("http-equiv")) && (refAttr == 'refresh') ) {
            metaTags[i].parentNode.removeChild(metaTags[i]);
        }
    }
    

    删除它是否会阻止浏览器及时刷新还有待观察。

    【讨论】:

    • 元标签不能被 JavaScript 覆盖。
    • 我在 Firefox 中尝试过(将“i in metaTags”放在括号中之后)。我收到一个 Javascript 错误,提示“metaTags[i].getAttribute”。我想这是做不到的,至少不能那样做。
    • 你不能在这里使用 for(i in ...) 循环。 in 运算符遍历对象的键。在这种情况下,您需要使用常规数字循环:for(i=metaTags.length-1; i&gt;=0; i--) { ... } 您向后迭代,因为 removeChild 会改变 metaTags.length
    【解决方案8】:

    这是我使用的一个示例,它运行良好(尤其是在 Firefox 上)!

    <html><head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <title>Redirecting</title>
    </head>
    <body onload="location.replace('http://www.live.comeseetv.com'+document.location.hash)">
    <a href="http://www.live.comeseetv.com">Redirecting you to http://www.live.comeseetv.com</a>
    </body></html>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2019-04-02
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      相关资源
      最近更新 更多