2013-08-14 3 views
2

У меня есть требования к устаревшему сайту, на котором я не могу перепроектировать экраны, я не могу использовать теги заголовка без кэша, и я должен запретить пользователю видеть кэшированные экраны после того, как они вышли из системы и нажали кнопку «Назад».Остановить веб-страницу до загрузки до завершения вызова JQuery AJAX?

Я почти к решению (см бит кода ниже)

При загрузке страницы, я использую функцию JQuery AJAX для вызова веб-приложение и посмотреть, если пользователь все еще находится в. Если нет, пользователь перенаправляется на экран входа в системе

<html> 
<head> 
<!-- all the usual header stuff, plus links to the jQuery libaries, first script tag on page below --> 

<script language = "javascript"> 

$.get("/acme/confirm_authentication",function(data){ 
      if(data != "confirmed"){ 
       location.href = "logout"; 
      } 
    }); 



</script> 
</head> 
<body> 

blah blah blah 
</body> 
</html> 

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

Есть ли способ сохранить страницу от загрузки/рендеринга до тех пор, пока функция JQuery AJAX не остановится?

Благодаря


Update: Ответ:


Я изменил принятый ответ ниже, чтобы включить "кэш: ложный" вариант. В Firefox и Chrome кешированные копии страницы, которые были достигнуты с помощью кнопки «Назад», будут запускать .ajax(), но будут использовать кешированную копию переменной «данные», которая даст мне устаревший ответ.

$.ajax({ 
url: "/acme/confirm_authentication", 
async:false, 
cache: false, 
success: function(data) { 
    if(data != "confirmed"){ 
     location.href = "logout"; 
    } 
}   

});

+2

ИМХО, я чувствую, что вам следует избегать блокировки пользовательского интерфейса любой ценой. «Ожидание» для загрузки может действительно разрушить сайт и чувства человека к указанному сайту. – Dom

+2

Из любопытства: если пользователь отключает Javascript, может ли он получить доступ к контенту без входа? –

+1

Вам нужно ** сделать это на сервере вместо этого. – SLaks

ответ

5

Вы можете сделать это с помощью функции ajax с параметром async, установленным в false.

$.ajax({ 
    url: "/acme/confirm_authentication", 
    success: function(data) { 
     if(data != "confirmed"){ 
      location.href = "logout"; 
     } 
    }, 
    async:false 
    }); 
+0

Вы не имеете в виду ['jQuery.ajaxSetup'] (http://api.jquery.com/jQuery.ajaxSetup/)? – Dom

+0

Почему ajaxSetup? ajaxSetup используется для установки значений по умолчанию для будущих запросов Ajax ... –

+0

ajaxSetup повлияет на все будущие вызовы ajax (путем настройки значений по умолчанию), в то время как версия @ Jean-Philippe устанавливает асинхронный: false для одного вызова. В зависимости от того, какой из них вы хотите, оба ответа могут работать. – ochi

Смежные вопросы