it-swarm.com.de

Verwenden von Javascript zum Überschreiben oder Deaktivieren des Meta-Refresh-Tags

Ich habe eine Website, auf der ich versuche, mit Ajax einige Inhalte auf der Seite zu aktualisieren, ohne sie neu zu laden. Es besteht jedoch eine gute Chance, dass viele meiner Benutzer mobile Browser verwenden, die kein Javascript unterstützen. Daher versuche ich, die Seite mit Meta-Refresh-Tags zu gestalten, die irgendwie nur für Benutzer ohne Javascript funktionieren. Gibt es eine Möglichkeit, dies zu tun?

Ich habe versucht, das Tag in ein Noscript-Element einzufügen, aber mein primitiver Handy-Browser hat es nicht erkannt. Ich denke darüber nach, ein Cookie zu setzen, um sich zu erinnern, ob der Browser des Benutzers Javascript unterstützt oder ob eine Version der Seite ohne Javascript funktioniert, und versuche, Javascript zu verwenden, um den Benutzer zu einer komplexeren Version umzuleiten, aber ich frage mich, ob dies der Fall ist ist eine elegantere Art, es zu tun. Hat jemand irgendwelche Ideen?

20
Elias Zamaria

Ich habe festgestellt, dass das Noscript-Tag recht gut dafür funktioniert. Zum Beispiel können Sie dies direkt nach dem close head-Element platzieren:

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

Das Entfernen des Metatags mit Skript ist nicht erforderlich, da ein Browser mit Skriptunterstützung alle Elemente im noscript-Element ignoriert.

10
Shaun

Sie können das Meta-Refresh-Tag nicht mit JavaScript überschreiben.

Sie können dies jedoch tun

Angenommen, Ihre Seite befindet sich unter ->

http://example.net/mike.html Geben Sie den folgenden Code ein->

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

Leider funktioniert die Manipulation des DOM nach @ bluesmoon's answer nicht mehr.

Die Problemumgehung besteht darin, das ursprüngliche Markup abzurufen, das Meta Refresh-Element zu suchen und zu ersetzen und dann das neue Dokument mit dem ersetzten Markup zu schreiben.

Ich bin nicht sicher, wie ich das ursprüngliche Markup mit JavaScript abrufen kann, außer dass ich eine zusätzliche Anfrage mit XMLHttpRequest sende.

In Opera verwende ich Folgendes:

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 verfügt auch über eine integrierte Funktion, die Meta-Aktualisierungen deaktiviert. JavaScript ist nicht erforderlich.

  • Klicken Sie mit der rechten Maustaste auf die Webseite> Site-Einstellungen bearbeiten ...> Netzwerk> Deaktivieren Sie "Automatische Umleitung aktivieren"> OK.
6
XP1

Meta-Tags sind in diesem Fall schrecklich. Was ist mit Suchmaschinen?

Was Sie tun sollten, ist, es so zu machen, wie ich es beschrieben habehier. Ihre Links sollten auf voll funktionsfähige Websites verweisen, als wäre es eine Web 2.0-Seite. Dann verbessern Sie mit Ereignishandlern (onclick) die Benutzererfahrung, indem Sie Ajax verwenden.

Damit Ajax-Benutzer nicht zu Links wechseln, wird der Link beim Klicken eher verarbeitet und eine Ajax-Anfrage an dieselbe URL gesendet, jedoch mit einem Ajax-GET-Parameter.

Jetzt müssen Sie auf der Serverseite in der Lage sein, die gesamte Site zu generieren mit einer Methode. Wenn es sich um eine Ajax-Anfrage handelt, senden Sie den zugehörigen Inhalt. Wenn es sich nicht um eine Ajax-Anforderung handelt, generieren Sie die vollständige Site mit dem zugehörigen Teil embedded .

Ihre Site wird SEO-freundlich , verfügbar für mobile Benutzer und progressiv verbessert für Benutzer moderner Browser und Plattformen. Schließlich können Ajax-generierte Hash-Links auch als Links verwendet werden.

Attraktivität . :)

3
gblazex

Entfernen Sie einfach das Meta-Tag mit 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>

Ich habe das Aktualisierungszeitlimit oben nur als Beispiel auf 2 Sekunden festgelegt. Sie könnten wahrscheinlich auch mit 1 Sekunde davonkommen, aber setzen Sie ihn nicht auf 0, da das Javascript in diesem Fall keine Chance hat, ausgeführt zu werden. 0 ist auch ärgerlich, weil es die Benutzerfreundlichkeit der Zurück-Taste bricht.

Edit 2012-10-23 Dies scheint nicht mehr zu funktionieren. Der Knoten wird immer noch entfernt, aber es scheint, dass Browser alle Meta-Tags in irgendeiner Weise analysieren und im Speicher halten.

3
bluesmoon

Das hat bei mir wunderbar geklappt! (in chrom ausprobiert)

window.stop();
3
Amresh

Ich bin damit einverstanden, dass die Meta-Aktualisierung hier nicht der richtige Weg ist. Suchen Sie zusätzlich zu Galambalazs 'Link nach "progressive enhancement".

Im Geiste der Beantwortung der Frage können Sie jedoch Folgendes versuchen. Es ist ungetestet, funktioniert möglicherweise nicht in allen Browsern, sollte aber in die richtige Richtung weisen:

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

Es bleibt abzuwarten, ob das Entfernen den Browser daran hindert, sich rechtzeitig zu aktualisieren.

1
Jhong

Dies ist ein Beispiel für das, was ich benutze und es funktioniert perfekt (besonders unter 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>
0