Javascript(asp.net Page.isPostBack()など)でポストバックを検出/追跡/チェックする方法は?なにか提案を?
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:私はそれをテストしていませんが、以前同様のことをやったことがあり、動作します。
場合によっては、サーバー側のコードなしでポストバックを確認したい場合があります。たとえば、SharePointでは、SharePoint Designerページにコードブロックを含めることはできないため、<%= something%>を必要とするソリューションは使用できません。サーバー側のコードを使用しない代替手段を次に示します。
<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>
1つの注意点(または、見方によっては機能)は、ポストバックだけでなく、ページがそれ自体にリンクするインスタンスを検出します。
ユーザーが送信ボタンをクリックしたときに現在のページがポストバックになるかどうかを確認する場合は、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');
バニラ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]');
バニラJS:document.head.hasAttribute('data-is-postback')
以下を参照してください。
<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>
私に合った解決策があります。
// Postback catch
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function (s, e) {
alert("post back");
});
AJAXリクエストを使用している場合、またはページの読み込み時にJavaScriptが読み取る非表示フィールドがある場合のみ、ポストバックを追跡できます。そうでない場合、ページは再生成され、すべてPOSTデータは失われます;あなたが期待し期待するように。
サーバー側の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;
}
JQueryを使用したソリューションは次のとおりです。
$("a[href^='javascript:__doPostBack']").click(function () {
alert('ok');
});