Utilisation de Javascript pour remplacer ou désactiver la balise meta refresh

j'ai un site Web, où J'essaie D'utiliser Ajax pour mettre à jour certaines choses sur la page sans le recharger. Cependant, il y a de bonnes chances que beaucoup de mes utilisateurs utilisent des navigateurs mobiles qui ne prennent pas en charge Javascript, donc j'essaie de concevoir la page avec des balises meta refresh, qui ne fonctionnent que pour les utilisateurs sans Javascript. Est-il possible de faire cela?

j'ai essayé de mettre l'étiquette dans un élément noscript, mais mon navigateur de téléphone cellulaire primitif ne voulait pas le reconnaître. Je pense peut-être configurer un cookie pour me souvenir si le navigateur de l'utilisateur supporte Javascript, ou avoir une version de la page qui fonctionne sans Javascript, et tente d'utiliser Javascript pour rediriger l'utilisateur vers une version plus sophistiquée, mais je me demande s'il y a une façon plus élégante de le faire. Quelqu'un aurait-il des idées?

20
demandé sur Elias Zamaria 2010-07-15 09:39:47

8 réponses

vous ne pouvez pas outrepasser la balise meta refresh avec JavaScript.

Cependant, vous pouvez le faire

supposez que votre page est à - >

http://example.net/mike.html Mettez le code suivant ici - >

<script type="text/javascript">
window.location = 'http://example.net/mike/for_Those_With_JavaScript_Enabled.html';
</script>
10
répondu Hrishi 2010-07-18 03:13:36

j'ai trouvé que la balise noscript fonctionne très bien pour cela. Par exemple, vous pouvez le placer juste après vous fermer l'élément de tête:

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

pas besoin de supprimer la balise meta avec script, car un navigateur qui a le soutien de script ignorera tout dans l'élément noscript.

10
répondu Shaun 2012-10-26 08:46:52

malheureusement, de la réponse de @bluesmoon , manipuler le DOM ne fonctionne plus.

la solution est de récupérer le markup original, de trouver et de remplacer l'élément meta refresh, puis d'écrire le nouveau document avec le markup remplacé.

Je ne sais pas comment récupérer le markup original en utilisant JavaScript, sauf pour envoyer une demande supplémentaire en utilisant XMLHttpRequest .

Dans Opera, voici ce que j'utilise:

Disable meta refresh 1.00.js :

// ==UserScript==
// @name Disable meta refresh
// @version 1.00
// @description Disables meta refresh.
// @namespace /q/using-javascript-to-override-or-disable-meta-refresh-tag-73359/"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 a également une fonctionnalité intégrée qui désactive meta refreshes. Pas besoin de JavaScript.

  • clic droit sur la page web > Modifier les préférences du Site... > Réseau > Désactiver "Activer la redirection automatique" > OK.
6
répondu XP1 2017-05-23 10:28:44

il suffit de supprimer la balise meta avec 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>

j'ai réglé le délai de rafraîchissement à 2 secondes au-dessus juste à titre d'exemple. Vous pouvez probablement vous en tirer avec 1 seconde, mais ne mettez pas à 0 parce que le javascript n'aura pas la chance de s'exécuter dans ce cas. 0 est aussi gênant car il casse la convivialité du bouton arrière.

Modifier 2012-10-23 Cela ne semble pas fonctionner. Le noeud obtient toujours retiré, mais il semble que les navigateurs parse et tenir en mémoire toutes les étiquettes meta de quelque façon.

3
répondu bluesmoon 2012-10-23 12:51:31

Meta tags sont terribles dans ce cas. Ce sur les moteurs de recherche??

ce que vous devez faire est de faire quelque chose comme j'ai souligné ici . Vos liens devraient pointer vers des sites complets comme s'il s'agissait d'une page Web 2.0. Ensuite, avec les gestionnaires d'événements (onclick), vous améliorez l'expérience utilisateur en utilisant ajax.

donc les utilisateurs d'ajax ne vont pas vers les liens, le lien est plutôt traité quand cliqué et envoyé un demande ajax à la même url exacte mais avec un paramètre ajax GET.

Maintenant, du côté serveur, vous devez être en mesure de générer l'ensemble du site , par une méthode. Si c'est une requête ajax vous envoyer le contenu connexe. Si ce n'est pas une requête ajax, vous générez le site complet avec la partie correspondante embedded .

votre site sera SEO friendly , disponible à utilisateurs mobiles, et progressivement amélioré pour les personnes sur les navigateurs et les plates-formes modernes. Enfin, les liens de hachage générés par ajax seront utilisables, même comme des liens.

Awesomeness . :)

3
répondu galambalazs 2017-05-23 11:55:10

Cela a fonctionné pour moi merveilleux! (essayé en chrome)

window.stop();
3
répondu Amresh 2017-09-20 05:08:03

je suis d'accord que meta refresh n'est pas la bonne voie à suivre ici. En plus du lien de galambalazs, rechercher sur "progressive enhancement".

Cependant, dans l'esprit de répondre à la question, vous pouvez essayer ce qui suit. C'est non testé, peut ne pas fonctionner dans tous les navigateurs, mais devrait être dans la bonne direction:

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

il reste à voir si sa suppression empêcherait le navigateur de se rafraîchir dans le temps.

1
répondu Jhong 2010-07-18 03:12:31

C'est un exemple de ce que j'utilise et il fonctionne parfaitement (surtout sur 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
répondu Mr Lindsay George 2016-01-24 12:12:33