Подтвердить что ты не робот

Использование Javascript для переопределения или отключения тега meta refresh

У меня есть сайт, на котором я пытаюсь использовать Ajax для обновления некоторых вещей на странице без перезагрузки. Тем не менее, есть большая вероятность, что многие из моих пользователей будут использовать мобильные браузеры, которые не поддерживают Javascript, поэтому я пытаюсь создать страницу с тегами meta refresh, которые как-то работают только для пользователей без Javascript. Есть ли способ сделать это?

Я попытался поместить тег в элемент noscript, но мой примитивный браузер сотового телефона не признал бы его. Я думаю о том, чтобы установить cookie, чтобы помнить, поддерживает ли браузер пользователя Javascript или имеет одну версию страницы, которая работает без Javascript, и пытается использовать Javascript для перенаправления пользователя на более сложную версию, но мне интересно, это более элегантный способ сделать это. У кого-нибудь есть идеи?

4b9b3361

Ответ 1

Вы не можете переопределить тег meta refresh с помощью JavaScript.

Однако вы можете сделать это

Предположим, что ваша страница находится в →

http://example.net/mike.html Вставьте здесь следующий код →

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

Ответ 2

Я обнаружил, что тег noscript работает очень хорошо для этого. Например, вы можете разместить это сразу после закрыть элемент head:

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

Не нужно удалять метатег с помощью script, так как браузер с поддержкой script будет игнорировать все внутри элемента noscript.

Ответ 3

К сожалению, из @bluesmoon 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.

  • Щелкните правой кнопкой мыши на веб-странице > Изменить настройки сайта... > Сеть > Отключить "Включить автоматическое перенаправление" > "ОК".

Ответ 4

Мета-теги в этом случае ужасны. Как насчет поисковых систем?

Что вы должны сделать, так это сделать это, как я изложил здесь. Ваши ссылки должны указывать на полные рабочие сайты, как на веб-страницу 2.0. Затем с обработчиками событий (onclick) вы улучшаете пользовательский интерфейс с помощью ajax.

Таким образом, пользователи ajax не будут обращаться к ссылкам, ссылка скорее обрабатывается при нажатии и отправляется запрос ajax на тот же самый url, но с параметром ajax GET.

Теперь на стороне сервера вы должны иметь возможность генерировать весь сайт каким-либо способом. Если это запрос ajax, вы отправляете связанный контент. Если это не запрос ajax, вы можете создать полный сайт со связанной частью встроенной.

Ваш сайт будет дружественным, доступным для мобильных пользователей и прогрессивно расширенный для людей в современных браузерах и платформах. Наконец, сгенерированные хеш-ссылки ajax будут использоваться даже в виде ссылок.

Awesomeness.:)

Ответ 5

Просто удалите метатег с помощью 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>

Я установил тайм-аут обновления на 2 секунды выше, как пример. Вероятно, вы могли бы уйти с 1 секундой, но не устанавливайте его на 0, потому что javascript не получит шанс выполнить в этом случае. 0 также раздражает, потому что он нарушает удобство использования кнопки "назад".

Изменить 2012-10-23 Это больше не работает. node по-прежнему удаляется, но кажется, что браузеры анализируют и удерживают в памяти все метатеги любым способом.

Ответ 6

Это работало для меня замечательно! (испробован в хроме)

window.stop();

Ответ 7

Я согласен с тем, что мета-обновление не является правильным путем. В дополнение к ссылке 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]);
    }
}

Не удалось ли удалить его, чтобы браузер не обновлялся вовремя.

Ответ 8

Это пример того, что я использую, и он отлично работает (особенно в 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="#" onclick="location.href='http://www.live.comeseetv.com'; return false;">Redirecting you to http://www.live.comeseetv.com</a>
</body></html>