2010-01-19 2 views
2

У меня проблема, когда экран бежит на миллисекунду при перенаправлении при рендеринге новой страницы.Screen Flicker On Response.redirect

Это заставляет экран мерцать и раздражает меня так.

У меня была небольшая скука по всему Интернету, и я нашел это IE-решение, которое работает на IE, но оно не на хром или FireFox.

<meta http-equiv="Page-Enter" content="blendTrans(Duration=0.0)" /> 
<meta http-equiv="Page-Exit" content="blendTrans(Duration=0.0)" /> 

Плюс Я уверен, что использование этого метода будет иметь некоторые стук в действие на панели обновления и элементы управления Ajax.

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

Любые идеи будут приветствоваться.

+0

Вы можете использовать javascript? Возможно . Тем не менее, это замедлит перенаправление. – Pindatjuh

+0

Я не думаю, что это сработает с грустью, так как перенаправления запускаются такими типами, как нажатие кнопок или выбор строк сетки. – Paul

+1

Как вы могли принять ответ, в котором говорилось, что вы не можете сделать это вообще, вместо моего - что дало вам 3 способа, которые сработали? –

ответ

2

Есть ли способ установки сервера, чтобы сделать полную страницу, прежде чем дать ему клиенту

короткий ответ: нет. так работает веб-браузер.

даже с максимально возможными серверами (используя статически кэшированные страницы, как вы их описываете), вы уменьшаете только среднее «белое» время, а не устраняя все это вместе. как вы видите с IE, этот переход по умолчанию является частью кода браузера, а не тем, что серверная сторона получает контроль над. если вы пишете свой собственный браузер, вы можете написать его, чтобы мыть черным, стирать белым или удерживать переход до загрузки всей страницы, как это делает IE.

Как упоминают другие люди, получение размера вашей страницы уменьшит «белое» время. на этот раз это не только время, которое сервер берет для создания страницы, но и все время поездки в сети для страницы, изображений, javascripts, css и т. д., поэтому вы никогда не сможете полностью избавиться от нее - только спрячьте ее с помощью браузера трюки.

и я не говорю о «клиентской стороне». это не сработает. код «клиентской стороны» даже не загружен, а тем более работает, когда браузер решает белую стирку холста. это своего рода стандартная часть «Интернета», к которой все привыкли; он не был предназначен для просмотра слайд-шоу или графически совершенного рендеринга. к сожалению, если вы так сильно интересуетесь переходами, HTML, вероятно, не подходит для вашей работы.

1

По умолчанию сервер будет заполнять полный ответ перед его отправкой. «Белый» будет результатом содержимого HTML, возможно, его размера. Используйте инструмент, например firebug или IE Developer Tools (мое предпочтение Fiddler), чтобы изучить сгенерированный контент. Угадайте, у вас есть очень большая ViewState.

+0

Состояние представления не влияет на это, некоторые страницы имеют одну строку, у некоторых есть десять. – Paul

+1

@Paul: Хорошо, что делает это мерцание отличным от обычного мерцания веб-навигации, которое мы все терпим при использовании браузеров? – AnthonyWJones

2

примеры MSDN рекомендует установить

Response.BufferOutput 

перед вызовом

Response.Redirect("http://www.mydomain.com/default.aspx"); 

Вы также можете попробовать использовать

Server.Transfer("default.aspx", true); 
+0

К сожалению, вышеизложенное не решило проблему – Paul

+1

Чтение http://stackoverflow.com/questions/224569/server-transfer-vs-response-redirect можно было бы ожидать, что Server.Transfer должен решить любые проблемы с браузером. – Filburt

+0

Чтобы добавить комментарий к Filburt, при использовании Server.Transfer перенаправления не происходит, поэтому из-за перенаправления невозможно мерцание. –

0

Вероятно, лучше всего сделать это на стороне клиента , Например, у вас может быть div, который покрывает всю страницу и исчезает после полного объединения DOM. В JQuery, что-то вроде этого:

$(document).ready(function() { $('#overlay').fadeOut(); }); 

С точки зрения UX, хотя это может быть немного обескураживает. Я действительно предпочитаю немного мерцания, поэтому я знаю, что все происходит.

+0

приятное предложение, но это будет охватывать страницу в сплошном цвете и выглядеть страннее, чем фликер, я пытаюсь добиться бесстрастного потока между страницами. изменяющийся контент указывает на изменение вещей. – Paul

2

То, что вы видите, является обычным явлением. Вот что происходит во время перенаправления:

  • Сервер отправляет ответ браузеру (перенаправления выполняются на стороне клиента).
  • браузер загружает ответ, видит, что есть Перенаправление и останавливается на странице загрузки
  • браузер загружает новую страницу

мета-теги, которые вы используете только IE, и не будет влиять на любые другой браузер. Единственное, что будет удалить мерцание все вместе будет одна из следующих:

  1. Вы сказали, что редирект происходит, когда пользователь нажимает на кнопку или на строке сетки или что-то. Если это должно было вызвать изменение location.href вместо post-back, пользователь не увидит мерцание браузера.

  2. Используйте Server.Transfer (это приведет к тому, что в адресной строке браузера будет отображаться старая страница вместо новой страницы (перенаправление изменит адресную строку). Это будет работать, только если вы перенаправляете пользователя на страницу на странице тот же сервер.

  3. Отправить HTTP 301 ответ (перемещено). Tis удалит мерцание, но использовать этот метод с осторожностью. он имеет и другие эффекты (это может повлиять рейтинг в поисковых системах).

Чтобы сделать # 3, используйте этот код на сервере.

Response.StatusCode = 301; 
Response.StatusDescription = "Moved Permanently"; 
Response.AddHeader("Location", "NewLocation.aspx"); 
+0

+1 от меня ... стыдно, ваш ответ не был принят. – Filburt

1

Извините, я опаздываю на вечеринке! Я долгое время занимался этим в своих приложениях. Решение, которое я разработал, работает для меня. Очень похоже, что @ Pike65 предложил ...

  1. Создать держатель для наложения:
<div id="overlayContent" class="overlay"> 
    <div id="loaderContent" class="loader"> 
     Loading... 
    </div> 
</div> 
  1. CSS для этого владельца:
.overlay { 
    position: fixed;  
    border: 0; margin: 0; padding: 0; 
    height: 100%; width: 100%; 
    top: 0; left: 0; 
    background-color: #272727; 
    text-align: center; vertical-align: middle; 
    z-index: 900; display: none; 
    -moz-opacity: 0.1; opacity: 0.1; 
    filter: alpha(opacity=10); 
} 

.overlay .loader { 
    position: relative; 
    width:40%; 
    margin: 20% auto; 
    padding: 10px; 
    background-color:black; 
    border: solid 1px gray; 
    color: #cccccc; 
    font-weight: bold; 
} 
  1. Javascript (Jquery):
$('a, input[type=button]').live("click", function (e) { 
    $("#overlay").show().css({ opacity: 0.1 }).fadeTo(UxSpeed, 0.8); 
}); 

Вот так.Вы можете изменить «js» по своему вкусу. Это приведет к появлению полупрозрачного наложения при любой ссылке или кнопке. По характеру браузера он будет ждать, пока не получит ответ на новую страницу (заголовки). Таким образом, он не исчезнет с текущей страницы, пока, по крайней мере, что-то не вернется для новой страницы. Когда появится новая страница, она автоматически удалит оверлей!