2010-07-15 103 views
19

我有一个网站,我正尝试使用Ajax来更新页面上的一些东西,而无需重新加载它。然而,我的很多用户很可能会使用不支持Javascript的移动浏览器,所以我试图设计带有元刷新标签的页面,该页面只能用于没有Javascript的用户。有没有办法做到这一点?使用Javascript来覆盖或禁用元刷新标记

我试过把标签放在noscript元素中,但是我原始的手机浏览器不会承认它。我正在考虑设置一个cookie来记住用户的浏览器是否支持Javascript,或者有一个版本的页面没有使用Javascript,并且尝试使用Javascript将用户重定向到更复杂的版本,但是我想知道是否有是一个更优雅的方式来做到这一点。有没有人有任何想法?

+0

我想我从这个问题中学到,我想要做的是很多麻烦,可能不值得花费精力和处理所有问题。我想我可能会像Hrishi建议的那样重定向,或者如果我希望Javascript和非Javascript页面使用相同的URL,那么我只能在用户选择启用它们时使用元刷新标记,并记住用户使用cookie的选择。谢谢你的答案。 – 2010-07-25 04:08:21

回答

3

Meta标签在这种情况下是可怕的。什么关于搜索引擎?

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

因此,ajax用户不会去链接,点击时处理该链接,而是发送一个ajax请求到完全相同的url,但带有ajax GET参数。

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

你的网站将是SEO友好给移动用户,并逐步增强人们对现代浏览器和平台。最后,ajax生成的散列链接将可用,即使作为链接。

Awesomeness。 :)

+2

元标记如何变得糟糕?我不想用它们重定向。我只是用它们刷新页面,作为没有Javascript支持的用户的后备。我不明白这会对搜索引擎产生什么影响。 我不完全确定这是否是我想要做的,但我仍然好奇我该怎么做。 – 2010-07-15 18:16:59

+0

你无法弄清楚你应该怎么做,这对你来说还不够吗? :)你检查了链接? – galambalazs 2010-07-15 19:18:04

+1

我检查了链接。将服务器上的代码复杂化为以两种方式提供数据似乎有点棘手。如果我这样做,我将不得不面对一些怪癖。如果我在#号之后放置了URL的重要部分,并且某人为该页面添加书签并尝试访问该页面,则它将不会像往常一样加载,除非我有一些JS加载内容。同样的事情,如果用户点击后退按钮。我不确定搜索引擎是否适合以这种方式制作我的网址。他们可能会看到#并认为它只是链接到同一页面的不同部分。我认为使用元刷新标记可能会更简单。 – 2010-07-16 01:29:04

1

我同意元刷新不是在这里前进的正确方法。除了galambalazs的链接,搜索“渐进式增强”。

但是,本着回答问题的精神,您可以尝试以下方法。这是未经测试,可能无法在所有的浏览器,但应沿右边线:

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]); 
    } 
} 

是否删除它会在时间停止刷新浏览器还有待观察。

+0

Meta标签不能被JavaScript覆盖。 – Hrishi 2010-07-18 03:17:23

+0

我试过在Firefox中(将“我在metaTags”放在括号内)。我收到了一个Javascript错误,指出“metaTags [i] .getAttribute”。我想这是不可能的,至少不是这样。 – 2010-07-23 19:25:07

+1

你不能在这里使用for(i in ...)循环。 'in'运算符遍历一个对象的键。在这种情况下,您需要使用常规的数字循环:'for(i = metaTags.length-1; i> = 0; i--){...}' 您向后迭代,因为removeChild将更改元标记。长度为 – bluesmoon 2010-07-25 01:43:36

10

您无法用JavaScript重写元刷新标记。

但是你可以做到这一点

假设你的网页是在 - >

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

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

我的意思是改为重定向JavaScript禁用的浏览器,您可以重定向启用JavaScript的浏览器。 – Hrishi 2010-07-18 03:18:26

+0

这很聪明。它干净,简单,并解决了这个问题。 – LandonSchropp 2010-07-24 02:36:25

+4

虽然这与后退按钮混乱。用户在启用javascript的情况下点击后退按钮会陷入重定向循环。他们需要双击后退按钮才能从中退出。 – bluesmoon 2010-07-25 13:15:07

3

只是删除了JavaScript meta标签:

<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这似乎不再适用。该节点仍然被删除,但似乎浏览器以任何方式解析和保存所有元标记。

+0

做这个工作?也许浏览器已经变得更严格,似乎不再工作了。可惜 – TimoSolo 2012-10-23 08:57:22

+0

@Timothy解决方法是检索原始标记,查找并替换元刷新元素,然后用替换的标记写入新文档。看到我的答案:[http://stackoverflow.com/questions/3252743/using-javascript-to-override-or-disable-meta-refresh-tag/13656851#13656851](http://stackoverflow.com/questions/ 3252743 /使用的JavaScript到超越 - 或 - 禁用 - 元刷新标记/ 13656851#13656851)。 – XP1 2012-12-01 05:55:04

+0

我没有测试这个,但理论上,我不认为这可以工作。 元刷新使用http-equiv元标记来模拟刷新HTTP标头,因此也可以通过HTTP Web服务器作为标头发送。 由于js在发送响应之后发出,重定向头已经不复存在了 – 2012-12-01 12:22:36

9

我发现noscript标签对此很好地工作。例如,你可以只是你接近头元素之后放置此:

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

无需删除与脚本meta标签,因为有脚本支持会忽略无脚本元素中一切的浏览器。

+0

这似乎不起作用 – 2012-12-15 01:59:59

+0

你能提供关于你使用的更多细节吗?我已经在多个网站上成功地使用了它,并在许多桌面和移动浏览器上进行了测试。 – Shaun 2013-09-21 22:35:50

+0

已确认在Firefox,Chrome,IE7/9 – Kita 2013-11-26 09:34:42

6

不幸的是,从@bluesmoon's answer开始,操纵DOM不再有效。

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

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

在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)); 

歌剧也有一个内置的功能,禁用元刷新。不需要JavaScript。

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

工作将不得不测试此..谢谢! – TimoSolo 2013-01-09 09:13:47

0

这是我使用的一个例子,它完美地工作(特别是在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> 
2

这对我来说太棒了! (在镀铬试用)

window.stop();