2010-07-15 40 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();