Почему мой onbeforeunload не работает сейчас, когда он был раньше? Или AJAX не работает со второй идентичной командой?

Это следует из этого вопроса

Это работало:

<body onbeforeunload=
 "ajaxRequest('UnlockQuery.ashx?QueryID=266&UserID=11631');"> 

Это было создано с использованием следующего на странице aspx:

<body onbeforeunload=
 "ajaxRequest('UnlockQuery.ashx?QueryID=<%= Session["QueryId"] %>&
 UserID=<%= Session["UserID"] %>')">

Это не работает:

<body id="uxBodyTag" onbeforeunload=
 "ajaxRequest('UnlockQuery.ashx?QueryID=266&amp;UserID=11631');"> 

Это создается с помощью:

uxBodyTag.Attributes["onbeforeunload"] += 
 "ajaxRequest('UnlockQuery.ashx?QueryID=" + 
 queryId.ToString() + "&UserID=" + Session["UserID"].ToString() + "');";

Вызываемый код таков:

function ajaxRequest(url)
{
    xmlhttp=null;
    if (window.XMLHttpRequest)
    {   // code for all new browsers
        xmlhttp=new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {   // code for IE5 and IE6
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (xmlhttp!=null)
    {
        xmlhttp.onreadystatechange=null;
        xmlhttp.open("GET",url,true);
        xmlhttp.send(null);
    }
}

РЕДАКТИРОВАТЬ:

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


person cjk    schedule 19.02.2009    source источник
comment
Просто чтобы убедиться: можете ли вы разместить предупреждение (url); непосредственно перед xmlhttp.open() и рассказать, как выглядит вывод?   -  person Tomalak    schedule 19.02.2009
comment
Только что попробовал: UnlockQuery.ashx?QueryID=319&UserID=11648.   -  person cjk    schedule 19.02.2009
comment
Хорошо. Что делает xmlhttp.onreadystatechange = function() { if (this.readyState == 4) alert(this.status +: + this.StatusText); }; сказать? Я также предполагаю, что это проблема в вашем приложении, а не в коде на стороне клиента.   -  person Tomalak    schedule 19.02.2009
comment
jquery ui 1.8.17 поглощает мой обработчик событий onbeforeunload. После перехода обратно на 1.8.16 моя страница снова работает.   -  person deerchao    schedule 13.02.2012


Ответы (2)


Добавление

&date=DateTime.now.Ticks.ToString()

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

Спасибо всем, кто оказал помощь.

person cjk    schedule 19.02.2009
comment
Я предполагаю, что запросы были кэшированы. Вы можете попробовать добавить заголовок Pragma: no-cache к ответу, чтобы полностью предотвратить кэширование на стороне браузера без необходимости изменять весь код. - person Tomalak; 19.02.2009
comment
В любом случае: Предотвращение кэширования в браузере следует рассматривать с нескольких точек зрения. Одной прагмы: отсутствие кеша недостаточно для всех ситуаций, я предлагаю вам поискать дополнительную информацию, чтобы убедиться, что все браузеры понимают, что вы хотите. - person Tomalak; 19.02.2009

В качестве средств отладки мы пробовали:

alert(url);
xmlhttp.open("GET",url,true);

что дало ожидаемый результат:

UnlockQuery.ashx?QueryID=319&UserID=11648

Теперь мы можем проверить, что сервер должен сказать через:

xmlhttp.onreadystatechange = function() { 
  if (this.readyState == 4) alert(this.status + ": " + this.StatusText); 
};

РЕДАКТИРОВАТЬ:

Как оказалось, кеш браузера стал причиной неожиданных результатов. Предлагаю запретить кеширование AJAX-страницы через соответствующие HTTP-заголовки (Pragma, Cache-Control, Expires).

person Tomalak    schedule 19.02.2009