Как обнаружить / отслеживать постбэк в javascript? - PullRequest
23 голосов
/ 07 декабря 2009

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

Ответы [ 10 ]

39 голосов
/ 07 декабря 2009

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: я не проверял это, но я делал что-то подобное раньше, и это работает.

19 голосов
/ 12 июля 2011

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

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

9 голосов
/ 07 декабря 2009

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

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

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

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

Например:

function isPostBack() {
  return <%= Page.IsPostBack %>;
}
5 голосов
/ 26 января 2013

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

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

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

JQuery:
$('head').data('isPostback');
Ваниль JS:
document.head.getAttribute('data-is-postback') === 'true';

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

В 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]');
Ваниль JS:
document.head.hasAttribute('data-is-postback')
4 голосов
/ 06 марта 2015

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

// Postback catch
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function (s, e) {
    alert("post back");
});
4 голосов
/ 07 декабря 2009

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

<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>
0 голосов
/ 06 июля 2018

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

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;
}
0 голосов
/ 14 февраля 2017

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

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

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

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

if (isPostBack){
   //do something here
}
0 голосов
/ 25 июля 2013

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

$("a[href^='javascript:__doPostBack']").click(function () {
    alert('ok');
});
0 голосов
/ 07 декабря 2009

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

...