Как обнаружить/отследить обратную передачу в javascript?

Как обнаружить/отследить/проверить обратную передачу в javascript (например, в asp.net Page.isPostBack())? Любое предложение?


person Subrat    schedule 07.12.2009    source источник


Ответы (11)


ASPX:

<input type="hidden" id="_ispostback" value="<%=Page.IsPostBack.ToString()%>" />

Клиентский скрипт:

function isPostBack() { //function to check if page is a postback-ed one
  return document.getElementById('_ispostback').value == 'True';
}

PS: я не проверял это, но я делал что-то подобное раньше, и это работает.

person o.k.w    schedule 07.12.2009
comment
По желанию или предпочтениям я добавляю runat=server к скрытому вводу и меняю его значение в файле кода программной части, но это работает просто отлично. И я бы порекомендовал jQuery сделать javascript, потому что это будет: function isPostBack() {return $(#_ispostback).val() == 'true';} - person Robert Massaioli; 07.12.2009
comment
@Shhnap: Да, я согласен. Просто ленивый выход для меня :P - person o.k.w; 07.12.2009
comment
Зачем вставлять элемент <input>? Вы могли бы просто заставить isPostBack() напрямую возвращать значение Page.IsPostBack: return <%= Page.IsPostBack %>; - person RickNZ; 07.12.2009
comment
@RickNZ: Это довольно хорошая идея. Отправьте как ответ, я проголосую за него :) - person o.k.w; 07.12.2009
comment
Конечно: я добавил это к своему предыдущему ответу. - person RickNZ; 07.12.2009
comment
Есть причина, по которой скрытое поле лучше: простое использование функции javascript загрузит это значение только при фактическом обратном сообщении, но для асинхронного обратного сообщения этого не произойдет, используя поле ввода на панели обновления, для которого установлено значение updatemode=always , заставит это работать даже на асинхронных обратных передачах. - person Shrage Smilowitz; 29.07.2010
comment
Это падает, когда кодовые блоки не разрешены. Что бы вы сделали в таком случае? - person Code Maverick; 08.08.2017
comment
Небольшое изменение для культурной и языковой инвариантности <%=Page.IsPostBack ? "true" : ""%> ..... что также позволяет javascript быть более кратким if (document.getElementById('_ispostback').value) doStuff(); - person James Westgate; 01.11.2017

В некоторых случаях вы можете захотеть проверить обратную передачу без кода на стороне сервера. Например, в SharePoint у вас не может быть блоков кода на страницах SharePoint Designer, поэтому вы не можете использовать какое-либо решение, требующее ‹%=что-то %>. Вот альтернатива, которая не требует кода на стороне сервера:

<script type="text/javascript">
 function isPostBack()
 {

  return document.referrer.indexOf(document.location.href) > -1;
 }

 if (isPostBack()){
document.write('<span style="color:red;">Your search returned no results.</span><br/>');
 }
 </script>

Одно предостережение (или функция, в зависимости от того, как вы на это смотрите): это будет обнаруживать не только обратные передачи, но и любой случай, когда страница ссылается на себя.

person Daniel    schedule 12.07.2011
comment
var offset = document.location.href.indexOf(.aspx); return document.referrer.substring(0, offset + 5) == document.location.href.substring(0, offset + 5) - person Shawn; 14.01.2014
comment
Это отлично сработало для меня. спасибо :) У меня было перенаправление javacript, которое нужно было проверить на обратную передачу. - person DigitalRayne; 28.04.2014
comment
Какой ляп. Не используйте реферер для логики. - person Matti Virkkunen; 17.12.2014

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

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="xxxxx" />

Вы можете использовать что-то вроде document.getElementById("__VIEWSTATE") или эквивалент jQuery.

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

Например:

function isPostBack() {
  return <%= Page.IsPostBack %>;
}
person RickNZ    schedule 07.12.2009
comment
Это падает, если у вас нет доступа к коду на стороне сервера, а блоки кода не разрешены. - person Code Maverick; 08.08.2017
comment
Как ни странно, это не работает для меня, но это работает: function IsPostBack() { var ret = '‹%= Page.IsPostBack%›' == 'True'; возврат рет; } - person Zeek2; 13.10.2017

Поскольку JavaScript не должен быть написан с серверным кодом, а внедрение новых элементов на страницу кажется излишним, мне кажется, что самое простое решение — добавить [datat-*] к элементу <head>:

In Page_Load:
Page.Header.Attributes["data-is-postback"] IsPostBack ? "true" : "false";

Затем к этому можно получить доступ как:

jQuery:
$('head').data('isPostback');
Vanilla JS:
document.head.getAttribute('data-is-postback') === 'true';

Конечно, если вы относитесь к атрибуту [data-is-postback] как к логическому атрибуту, в качестве альтернативы вы можете использовать:

In Page_Load:
if (IsPostBack)
{
    Page.Header.Attributes.Add("data-is-postback", "");
}
else
{
    Page.Header.Attributes.Remove("data-is-postback");
}
jQuery:
$('head').is('[data-is-postback]');
Vanilla JS:
document.head.hasAttribute('data-is-postback')
person zzzzBov    schedule 25.01.2013
comment
Хотя это здорово, если вы получаете доступ к коду на стороне сервера, он падает, если вы этого не делаете. Некоторое программное обеспечение даже не позволяет использовать блоки кода, поэтому потребуется решение на чистом JavaScript. - person Code Maverick; 08.08.2017

У меня есть решение, которое сработало для меня.

// Postback catch
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function (s, e) {
    alert("post back");
});
person user4640122    schedule 06.03.2015

См. следующее:

<script type="text/javascript">

function invokeMeMaster() {

var chkPostBack = '<%= Page.IsPostBack ? "true" : "false" %>';

if (chkPostBack == 'false') {

alert('Only the first time');

}
}



window.onload = function() { invokeMeMaster(); };

</script>
person Brij    schedule 07.12.2009
comment
Мне нравится твой выбор имен. - person pqsk; 23.07.2013

Вы можете отслеживать обратную передачу только в том случае, если вы используете запросы AJAX или имеете какое-то скрытое поле, которое javascript читает при загрузке страницы. В противном случае страница создается заново, и все данные POST теряются; как вы ожидаете и надеетесь.

person Robert Massaioli    schedule 07.12.2009

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

на стороне сервера

if (Page.IsPostBack){
   ClientScript.RegisterClientScriptBlock(GetType(),
            "IsPostBack", "var isPostBack = true;", true);
}

Затем в вашем скрипте, который запускается для onLoad, проверьте наличие этой переменной.

if (isPostBack){
   //do something here
}
person Lequoa    schedule 14.02.2017

Это должно работать для страниц ASP.Net, не полагаясь на переменную/элемент управления, предоставленную серверной частью:

function isPostBack(frmID) {
    var eventtarget = "";
    var eventargument = "";

    if (!!frmID) {
        if (document.forms.length == 0) return false;

        sForm = document.forms[0];
    }
    else {
        sForm = document.getElementById(frmID);

        if (!sForm) return false;
    }

    if (sForm.__EVENTTARGET) eventtarget = sForm.__EVENTTARGET.value;
    else return false;

    if (sForm.__EVENTARGUMENT) eventargument = sForm.__EVENTARGUMENT.value;
    else return false;

    if (eventtarget != "" || eventargument != "") return true;
    else return false;
}
person Olymp Medco    schedule 06.07.2018

Это простой способ JS для определения статуса IsPostBack, который я только что начал работать в теле моей страницы ASPX; необходимо вызвать PostBack во время PageLoad для проекта.

    <script type="text/javascript">
        if ('False' === '<%= Page.IsPostBack.ToString()%>') 
        {
            __doPostBack();
        }
    </script>
person Sir Asks a Lot    schedule 22.11.2019

Вот решение с использованием jQuery:

$("a[href^='javascript:__doPostBack']").click(function () {
    alert('ok');
});
person Mishami    schedule 25.07.2013