Как я могу проверить IsPostBack в JavaScript?

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

По сути, мне нужно проверить IsPostBack в JavaScript.

Спасибо.


person roman m    schedule 12.09.2008    source источник
comment
Я отредактировал этот вопрос, чтобы отразить истинное намерение первоначального вопроса Романа и ответ, который он выбрал как принятый, поскольку возникла некоторая путаница в отношении платформы, на которую был нацелен этот вопрос.   -  person Jason Bunting    schedule 12.09.2008


Ответы (10)


На стороне сервера напишите:

if(IsPostBack)
{
   // NOTE: the following uses an overload of RegisterClientScriptBlock() 
   // that will surround our string with the needed script tags 
   ClientScript.RegisterClientScriptBlock(GetType(), "IsPostBack", "var isPostBack = true;", true);
}

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

if(isPostBack) {
   // do your thing
}

В противном случае вам не нужно устанавливать переменную, как в решении Джонатана. Оператор if на стороне клиента будет работать нормально, потому что переменная isPostBack будет неопределенной, что оценивается как ложное в этом операторе if.

person Jason Bunting    schedule 12.09.2008
comment
ЛОЛ - перефразировать? Пока вы отвечали, я тоже. Я понятия не имел, что вы ответили на него (мы были всего в минуте или двух друг от друга). Это не то чтобы уникальное решение, это в значительной степени самый способ сделать это. Кстати, мой комментарий по поводу вашего был правкой после того, как я ответил - вы можете посмотреть историю - person Jason Bunting; 12.09.2008
comment
Кстати, вам нужно включить блок Script в свою строку в RegisterClientScriptBlock, как указано в MSDN. - person FlySwat; 12.09.2008
comment
Нет, не знаю. Возможно, вам нужно прочитать о перегрузке, которую я использовал, согласно MSDN. :) - person Jason Bunting; 12.09.2008
comment
Ах, пропустил логическое значение в конце, это научит меня тому, что я не прокручиваю код. - person FlySwat; 12.09.2008
comment
Джейсон, включи объяснение перегрузки в свой ответ. - person roman m; 12.09.2008
comment
Роман, хотя я не думаю, что нужно объяснение, я добавил его для вас. - person Jason Bunting; 12.09.2008
comment
Это сделало бы его кристально ясным для следующего человека, ищущего ответ, без необходимости читать комментарии. спасибо - person roman m; 12.09.2008
comment
Кстати, чтобы получить доступ к свойству ClientScript из кода программной части, используйте Page.ClientScript. - person md1337; 20.10.2010
comment
@Roman - я все еще думаю, что это понятно без объяснения перегрузки. Любой, кто знаком со своим кодом на C# или ООП, знает, что у методов вполне могут быть перегрузки. Кроме того, если они введут код, как у меня, он скомпилируется. В идеале им действительно не нужна дополнительная информация. Опять же, я добавил это, но не думаю, что это было действительно необходимо. :) - person Jason Bunting; 25.11.2010
comment
@Jason Bunting - я думал, ты понял это 2 года назад :) - person roman m; 25.11.2010
comment
РЖУ НЕ МОГУ. Я знаю, пожалуйста, простите меня - я немного анальный, и я думаю, я не был уверен, что я был понятен достаточно. Я просто иногда критически отношусь к своему письму и не был уверен, что моя точка зрения была настолько очевидной или ясной, насколько это могло быть. Просто игнорируй меня! :) - person Jason Bunting; 25.11.2010
comment
Вы не можете использовать if для проверки существования переменной. Ну, вы можете, но это работает не во всех браузерах. JavaScript должен выглядеть так: if (typeof(isPostBack) != undefined && isPostBack). И, как указывает md1337, это должен быть Page.ClientScript, а не просто ClientScript. - person mhenry1384; 02.11.2011
comment
Я не хочу вновь открывать существующую дискуссию, но к чему вся эта суета по поводу «должно быть, должно быть ...» -> Этот ответ был очень хорошим решением исходного вопроса, я не понимаю, почему объяснение для подписи нужна перегрузка -> Page.ClientScript? Я использовал ClientScript напрямую в этом случае, и он работает как шарм, так в чем здесь проблема... - person Nathan; 07.05.2012

Есть еще более простой способ, который не требует написания кода: просто добавьте эту строку в свой javascript:

if(<%=(Not Page.IsPostBack).ToString().ToLower()%>){//Your JavaScript goodies here}

or

if(<%=(Page.IsPostBack).ToString().ToLower()%>){//Your JavaScript goodies here}
person Faustin    schedule 24.08.2010
comment
Не будет работать во внешнем файле .js, и это также довольно грязно: плохо иметь зависимость от ASP от вашего Javascript. Делает его не портативным. - person md1337; 20.10.2010
comment
Я не согласен, что этот код отстой. Если ваш JavaScript так или иначе зависит от ASP.NET (в моем случае он вызывает PageMethods.* и использует различные встроенные вызовы .ClientID, чтобы иметь возможность ссылаться на элементы управления ASP.NET), тогда это нормально. Кроме того, как другие примеры более переносимы? Вы имеете в виду переменную isPostBack, которая без сопутствующего кода ASP.NET в отделенном коде не имела бы смысла. - person crdx; 12.01.2011

привет попробуй следующее...

function pageLoad (sender, args) {

alert (args._isPartialLoad);

}

результат - логическое значение

person Wily AO    schedule 01.03.2013
comment
Это правильный ответ. Не другие. Он использует встроенную функциональность, работает во внешних файлах .js и не требует реализации кода программной части. См. этот пост: stackoverflow.com/questions/602441/ для получения дополнительной информации - person Adam; 18.07.2016
comment
Спасибо, сэр! :) Это должен быть правильный ответ. Работает как в чистом ASP, так и в Telerik (RadScriptManager вместо ScriptManager) - person Skipper; 11.01.2018

Решение не сработало для меня, мне пришлось адаптировать его:

protected void Page_Load(object sender, EventArgs e)
{
    string script;
    if (IsPostBack)
    {
        script = "var isPostBack = true;";
    }
    else
    {
        script = "var isPostBack = false;";
    }
    Page.ClientScript.RegisterStartupScript(GetType(), "IsPostBack", script, true);
}

Надеюсь это поможет.

person md1337    schedule 20.10.2010
comment
И почему это не сработало? Вместо того, чтобы придумывать другое решение, возможно, вам следовало копнуть немного глубже, чтобы выяснить, почему это не сработает, чтобы вы могли, по крайней мере, опубликовать эту информацию здесь со своей адаптацией. - person Jason Bunting; 25.11.2010
comment
Послушайте, это было давно, и я не помню, почему это не сработало. Я должен был опубликовать почему, но мое время очень ограничено, поэтому я просто опубликовал свое исправление. Надеюсь, это принесет пользу 1 или 2 людям, рискуя навлечь на себя ваш гнев за то, что осмелился подвергнуть сомнению ваше двухлетнее решение. - person md1337; 02.12.2010
comment
Это не сработало, потому что, если вы сделаете if для несуществующей переменной, ваш скрипт закроется (по крайней мере, в Firefox 7). Но вам не нужно объявлять переменную, если обратная передача ложна, вы можете сделать это в своем JavaScript: if (typeof(isPostBack) != undefined && isPostBack) - person mhenry1384; 02.11.2011

Вы можете поместить скрытый ввод на страницу и после загрузки страницы присвоить ему значение. Затем вы можете проверить это поле, если оно было в данных поста, это постбэк, иначе это не так.

Было два решения, в которых использовался код на стороне сервера (специфический для ASP.NET), опубликованный в качестве ответов. Я думаю, стоит отметить, что это решение не зависит от технологии, поскольку оно использует только клиентские функции, доступные во всех основных браузерах.

person NerdFury    schedule 12.09.2008
comment
Это правда, что ваше решение является агностическим, но вопрос, основанный на том, как он был помечен, был специфичен для ASP.NET. Кроме того, поскольку мой ответ был принят в качестве ответа, Роман, очевидно, использует ASP.NET. - person Jason Bunting; 12.09.2008
comment
См. мой комментарий о том, почему я отредактировал этот вопрос, чтобы внести больше ясности. Я оставил комментарий к исходному вопросу. - person Jason Bunting; 12.09.2008

Попробуйте это, в этом JS мы можем проверить, является ли это обратным сообщением или нет, и, соответственно, выполнить операции в соответствующих циклах.

    window.onload = isPostBack;

    function isPostBack() {

        if (!document.getElementById('clientSideIsPostBack')) {
            return false;
        }

        if (document.getElementById('clientSideIsPostBack').value == 'Y') {

            ***// DO ALL POST BACK RELATED WORK HERE***

            return true;
        }
        else {

            ***// DO ALL INITIAL LOAD RELATED WORK HERE***

            return false;
        }
    }

person Developer_India    schedule 18.11.2010

Вы можете создать скрытое текстовое поле со значением 0. Поместите код onLoad() в блок if, который проверяет, что значение скрытого текстового поля равно 0. Если он выполняет код, и установите значение текстового поля равным 1.

person ctrlShiftBryan    schedule 12.09.2008

Здесь много вариантов.

Для чистого JS-решения ваша страница отправляется сама на себя, но с дополнительным параметром URL-адреса (mypage.html?postback=true) — затем вы можете получить URL-адрес страницы с помощью window.location.href и проанализировать его, используя разделение или регулярное выражение искать вашу переменную.

Гораздо проще, предполагая, что вы отправляете обратно на какой-то язык сценариев для обработки страницы (php/perl/asp/cf и т. д.), это заставить их повторить строку javascript на странице, устанавливающую переменную:

<html>

<?php
if ($_POST['myVar']) {
    //postback
    echo '<script>var postingBack = true;</script>';
    //Do other processing
} else {
    echo '<script>var postingBack = false;</script>'
 } ?>
<script>
function myLoader() {
     if (postingBack == false) {
          //Do stuff
     }
 }

<body onLoad="myLoader():"> ...
person Ian    schedule 12.09.2008
comment
Это был вопрос, специфичный для ASP.NET, но я не думаю, что вы должны получить отрицательный голос (я не знаю, кто это сделал) за публикацию решения PHP - ваша идея верна, даже если язык не так. :) - person Jason Bunting; 12.09.2008
comment
Правда, исходный вопрос был помечен как asp.net, но не был сформулирован как таковой. Проблема и все, кроме принятого ответа, не зависят от языка. Принятый ответ верен с точки зрения перефразированного вопроса, но, как и в большинстве материалов .net, защищает разработчика от основной механики. - person Ian; 13.09.2008
comment
Защищает разработчика от базовой механики? Как же так? Возможно, вы хотите использовать слово «изолирует» вместо «защищает». Это не то, от чего нам нужна защита. Я признаю, что ASP.NET WebForms, а не MVC, — это дерьмо. В лучшем случае это дырявая абстракция. Тем не менее, я полностью понимаю базовую механику протокола HTTP, HTML, браузеров и т. д. Дело не в этом — вы обходитесь хаками и тому подобным, когда у вас нет выбора в отношении среды, в которой вы работаете, что является случай для многих разработчиков программного обеспечения, которые работают в отрасли. Я не знаю, к чему ты клонишь. - person Jason Bunting; 25.11.2010

Вот один из способов (поместите это в Page_Load):

if (this.IsPostBack)
{
    Page.ClientScript.RegisterStartupScript(this.GetType(),"PostbackKey","<script type='text/javascript'>var isPostBack = true;</script>");
}

Затем просто проверьте эту переменную в JS.

person FlySwat    schedule 12.09.2008
comment
Все, что вы сделали, это взяли мой ответ и удалили пункт else. - person FlySwat; 12.09.2008
comment
Очень близко, но у Джейсона было больше деталей - проголосуйте за вас - person roman m; 12.09.2008
comment
Это не похоже на конкурс, который я пытаюсь выиграть - какая мотивация у меня может быть для копирования вашего ответа? Не обольщайтесь. - person Jason Bunting; 12.09.2008
comment
Кстати, еще одно доказательство того, что я не скопировал ваше, заключается в том, что вы изначально забыли о тегах сценария. Если вы посмотрите на мой ответ, я использую перегрузку RegisterStartupScript, которая автоматически включит это. :) - person Jason Bunting; 12.09.2008
comment
Спустя два года вы все еще огорчены этим? ;) - person Jason Bunting; 25.11.2010

Создайте глобальную переменную и примените значение

<script>
       var isPostBack = <%=Convert.ToString(Page.IsPostBack).ToLower()%>;
</script>

Затем вы можете ссылаться на него из другого места

person iuppiter    schedule 12.10.2012
comment
Почему за это проголосовали? Кажется, самый простой ответ. Будут ли проблемы, если я использую это? - person Martin Belcher - AtWrk; 15.06.2018
comment
Я думаю, что сторонники отрицательного ответа не одобряют решение, основанное на глобальном масштабе, которое легче всего случайно загрязнить/испортить. Так что нет никаких гарантий, что ваш код вдруг не начнет давать сбои. В противном случае это является на самом деле простым решением, которое мне тоже нравится. - person Water Cooler v2; 28.12.2018