Использование Javascript для переопределения или отключения мета-обновления - PullRequest
20 голосов
/ 15 июля 2010

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

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

Ответы [ 8 ]

10 голосов
/ 26 октября 2012

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

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

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

10 голосов
/ 18 июля 2010

Вы не можете переопределить мета-тег обновления с помощью JavaScript.

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

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

http://example.net/mike.html Поместитетам следующий код ->

<script type="text/javascript">
window.location = 'http://example.net/mike/for_Those_With_JavaScript_Enabled.html';
</script>
6 голосов
/ 01 декабря 2012

К сожалению, из ответа @ bluesmoon манипулирование DOM больше не работает.

Обходной путь - извлечь исходную разметку, найти и заменить элемент метаобновления, а затем написать новый документ с замененной разметкой.

Я не уверен, как получить исходную разметку с помощью JavaScript, за исключением отправки дополнительного запроса с помощью XMLHttpRequest.

В Opera вот что я использую:

Disable meta refresh 1.00.js:

// ==UserScript==
// @name Disable meta refresh
// @version 1.00
// @description Disables meta refresh.
// @namespace /3227985/ispolzovanie-javascript-dlya-pereopredeleniya-ili-otklycheniya-meta-obnovleniya
// @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.

  • Щелкните правой кнопкой мыши веб-страницу> Изменить настройки сайта ...> Сеть> Отключить «Включить автоматическое перенаправление»> ОК.
3 голосов
/ 20 сентября 2017

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

window.stop();
3 голосов
/ 25 июля 2010

Просто удалите метатег с помощью 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 Это больше не работает.Узел по-прежнему удаляется, но кажется, что браузеры каким-либо образом анализируют и хранят в памяти все метатеги.

3 голосов
/ 15 июля 2010

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

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

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

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

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

Awesomeness .:)

1 голос
/ 18 июля 2010

Я согласен с тем, что метаобновление не является правильным способом продвижения вперед.В дополнение к ссылке галамбалаза, ищите «прогрессивное улучшение».

Однако, в духе ответа на вопрос, вы можете попробовать следующее.Он не тестировался, может работать не во всех браузерах, но должен располагаться в правильных строках:

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 голосов
/ 24 января 2016

Это пример того, что я использую, и он отлично работает (особенно в 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>
...