Как обнаружить/отследить/проверить обратную передачу в javascript (например, в asp.net Page.isPostBack())? Любое предложение?
Как обнаружить/отследить обратную передачу в javascript?
Ответы (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: я не проверял это, но я делал что-то подобное раньше, и это работает.
<input>
? Вы могли бы просто заставить isPostBack() напрямую возвращать значение Page.IsPostBack: return <%= Page.IsPostBack %>;
- person RickNZ; 07.12.2009
<%=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>
Одно предостережение (или функция, в зависимости от того, как вы на это смотрите): это будет обнаруживать не только обратные передачи, но и любой случай, когда страница ссылается на себя.
Если вы хотите проверить, будет ли текущая страница постбэком, если пользователь нажмет кнопку отправки, вы можете проверить наличие ViewState:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="xxxxx" />
Вы можете использовать что-то вроде document.getElementById("__VIEWSTATE")
или эквивалент jQuery.
Однако, если вы хотите увидеть, была ли текущая страница сгенерирована в ответ на обратную передачу, вам нужно сначала вставить эти данные в страницу на стороне сервера.
Например:
function isPostBack() {
return <%= Page.IsPostBack %>;
}
Поскольку JavaScript не должен быть написан с серверным кодом, а внедрение новых элементов на страницу кажется излишним, мне кажется, что самое простое решение — добавить [datat-*]
к элементу <head>
:
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]
как к логическому атрибуту, в качестве альтернативы вы можете использовать:
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')
У меня есть решение, которое сработало для меня.
// Postback catch
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function (s, e) {
alert("post back");
});
См. следующее:
<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>
Вы можете отслеживать обратную передачу только в том случае, если вы используете запросы AJAX или имеете какое-то скрытое поле, которое javascript читает при загрузке страницы. В противном случае страница создается заново, и все данные POST теряются; как вы ожидаете и надеетесь.
on Page_Load на стороне вашего сервера: в следующем примере используется перегруженная версия RegisterClientScriptBlock(), которая будет окружать нашу строку необходимыми тегами скрипта.
на стороне сервера
if (Page.IsPostBack){
ClientScript.RegisterClientScriptBlock(GetType(),
"IsPostBack", "var isPostBack = true;", true);
}
Затем в вашем скрипте, который запускается для onLoad, проверьте наличие этой переменной.
if (isPostBack){
//do something here
}
Это должно работать для страниц 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;
}
Это простой способ JS для определения статуса IsPostBack, который я только что начал работать в теле моей страницы ASPX; необходимо вызвать PostBack во время PageLoad для проекта.
<script type="text/javascript">
if ('False' === '<%= Page.IsPostBack.ToString()%>')
{
__doPostBack();
}
</script>
Вот решение с использованием jQuery:
$("a[href^='javascript:__doPostBack']").click(function () {
alert('ok');
});