21

私はウェブサイトを持っています.Ajaxを使用してページをリロードせずに更新しようとしています. ただし、多くのユーザーが Javascript をサポートしていないモバイル ブラウザを使用する可能性が高いため、メタ リフレッシュ タグを使用してページを設計しようとしています。これを行う方法はありますか?

タグを noscript 要素内に配置しようとしましたが、原始的な携帯電話のブラウザーはそれを認識しませんでした。ユーザーのブラウザがJavascriptをサポートしているかどうかを記憶するためにCookieを設定するか、Javascriptなしで動作するページの1つのバージョンを作成し、Javascriptを使用してユーザーをより洗練されたバージョンにリダイレクトしようとすることを考えていますが、よりエレガントな方法です。誰にもアイデアはありますか?

4

8 に答える 8

12

これには noscript タグが非常にうまく機能することがわかりました。たとえば、 head 要素を閉じた直後にこれを配置できます。

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

スクリプトをサポートするブラウザーは noscript 要素内のすべてを無視するため、スクリプトでメタ タグを削除する必要はありません。

于 2012-10-26T08:46:52.283 に答える
10

メタ リフレッシュ タグを JavaScript でオーバーライドすることはできません。

ただし、これを行うことができます

あなたのページが->にあるとします

http://example.net/mike.html そこに次のコードを入れてください->

<script type="text/javascript">
window.location = 'http://example.net/mike/for_Those_With_JavaScript_Enabled.html';
</script>
于 2010-07-18T03:13:36.857 に答える
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));

Opera には、メタ リフレッシュを無効にする組み込み機能もあります。JavaScript は必要ありません。

  • Web ページを右クリック > サイト設定の編集... > ネットワーク > [自動リダイレクトを有効にする] を無効にする > [OK] を選択します。
于 2012-12-01T05:52:20.017 に答える
4

この場合、メタタグはひどいものです。検索エンジンはどうですか??

あなたがすべきことは、私がここで概説したようなものにすることです. リンクは、Web 2.0 ページであるかのように、完全に機能するサイトを指す必要があります。次に、イベント ハンドラー (onclick) を使用して、ajax を使用してユーザー エクスペリエンスを向上させます。

そのため、ajax ユーザーはリンクに移動しません。リンクをクリックすると、まったく同じ URL に ajax リクエストが送信されますが、ajax GET パラメータが使用されます。

サーバー側では、何らかの方法でサイト全体を生成できる必要があります。ajax リクエストの場合は、関連するコンテンツを送信します。ajax リクエストでない場合は、関連部分が埋め込まれた完全なサイトを生成します。

サイトはSEO フレンドリーで、モバイル ユーザーが利用でき、最新のブラウザーやプラットフォームを使用するユーザー向けに徐々に強化されます。最後に、ajax で生成されたハッシュ リンクは、リンクとしても使用できます。

素晴らしさ。:)

于 2010-07-15T11:01:14.077 に答える
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これはもう機能していないようです。ノードは引き続き削除されますが、ブラウザはすべてのメタ タグを何らかの方法で解析し、メモリに保持しているようです。

于 2010-07-25T01:42:18.543 に答える
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]);
    }
}

それを削除するとブラウザが時間内に更新されなくなるかどうかはまだわかりません.

于 2010-07-18T03:12:31.363 に答える