Cách phát hiện/theo dõi/kiểm tra postback trong javascript (ví dụ: trong asp.net Page.isPostBack())? Bất kỳ đề xuất nào?Làm thế nào để phát hiện/theo dõi postback trong javascript?
Trả lời
ASPX:
<input type="hidden" id="_ispostback" value="<%=Page.IsPostBack.ToString()%>" />
Client-side Script:
function isPostBack() { //function to check if page is a postback-ed one
return document.getElementById('_ispostback').value == 'True';
}
PS: Tôi đã không kiểm tra nó, nhưng tôi đã thực hiện somthing tương tự trước và nó hoạt động.
Như một vấn đề hoặc sở thích tôi thêm runat = "server" vào đầu vào bị ẩn và thay đổi giá trị của nó trong tệp codebehind nhưng điều này chỉ hoạt động tốt. Và tôi sẽ khuyên bạn nên jQuery để làm javascript vì điều đó sẽ trở thành: function isPostBack() {return $ ("#_ ispostback"). Val() == 'true';} –
@Shhnap: Vâng tôi đồng ý. Chỉ là một cách lười biếng cho tôi: P –
Tại sao phải chèn một phần tử ''? Bạn chỉ có thể có isPostBack() trả về trực tiếp giá trị của Page.IsPostBack: 'return <% = Page.IsPostBack%>;' – RickNZ
Bạn chỉ có thể theo dõi các postback nếu bạn đang sử dụng yêu cầu AJAX hoặc có một lĩnh vực ẩn của một số loại javascript đọc trên tải trang. Nếu không trang được tạo lại và tất cả dữ liệu POST bị mất; như bạn mong đợi và hy vọng.
Xem sau:
<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>
Nếu bạn muốn kiểm tra xem các trang hiện tại sẽ là một postback nếu người dùng nhấp vào một nút gửi, bạn có thể kiểm tra sự hiện diện của ViewState:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="xxxxx" />
Bạn có thể sử dụng một cái gì đó như document.getElementById("__VIEWSTATE")
hoặc tương đương jQuery.
Tuy nhiên, nếu bạn muốn xem liệu trang hiện tại đã được tạo ra để phản hồi lại một lần đăng, thì trước tiên bạn cần chèn dữ liệu đó vào trang ở phía máy chủ.
Ví dụ:
function isPostBack() {
return <%= Page.IsPostBack %>;
}
Có bạn đi. +1 :) –
Điều này rơi xuống nếu bạn không có quyền truy cập vào mã phía máy chủ và các khối mã không được phép. –
Nhưng kỳ lạ, điều đó không làm việc cho tôi, nhưng điều này: \t \t \t chức năng IsPostBack() { \t \t \t \t var ret = '<% = Page.IsPostBack%>' == 'True'; \t \t \t \t trả lại lần lượt; \t \t \t} – Zeek
Trong một số trường hợp, bạn có thể muốn kiểm tra xem có postback mà không bất kỳ mã server-side. Ví dụ, trong SharePoint, bạn không thể có các khối mã trong các trang SharePoint Designer, do đó bạn không thể sử dụng bất kỳ giải pháp nào yêu cầu <% = something%>. Đây là một sự thay thế có liên quan đến không có mã server-side:
<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>
Một caveat (hoặc tính năng, tùy thuộc vào cách bạn nhìn vào nó), điều này sẽ phát hiện không chỉ postbacks, nhưng bất kỳ trường hợp mà các liên kết trang với chính nó .
Tính năng này hoạt động cho SharePoint 2010 - JavaScript trong danh sách. – FAA
Nó hoạt động trong một số trường hợp. – Shawn
var offset = document.location.href.indexOf (". Aspx"); trả lại document.referrer.substring (0, offset + 5) == document.location.href.substring (0, offset + 5) – Shawn
Như JavaScript không nên được viết với mã server-side, và tiêm yếu tố mới vào trang có vẻ như quá mức cần thiết, có vẻ như với tôi rằng các giải pháp đơn giản nhất là thêm [datat-*]
thuộc tính đến yếu tố <head>
:
Page.Header.Attributes["data-is-postback"] IsPostBack ? "true" : "false";
này sau đó có thể được truy cập như:
jQuery:$('head').data('isPostback');
Vanilla JS:
document.head.getAttribute('data-is-postback') === 'true';
Tất nhiên, nếu bạn đối xử với thuộc tính [data-is-postback]
như một thuộc tính boolean, bạn có thể luân phiên sử dụng:
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')
Trong khi điều này là rất tốt nếu bạn truy cập vào mã phía máy chủ, nó rơi xuống nếu bạn không. Một số phần mềm thậm chí không cho phép các khối mã, do đó, một giải pháp JavaScript thuần túy sẽ là cần thiết. –
Đây là giải pháp sử dụng jQuery:
$("a[href^='javascript:__doPostBack']").click(function() {
alert('ok');
});
Tôi có một giải pháp mà làm việc cho tôi.
// Postback catch
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function (s, e) {
alert("post back");
});
nó chỉ hoạt động đối với các yêu cầu không đồng bộ ajax – devi
trên Page_Load trên server-side của bạn: Sau đây sử dụng một quá tải của RegisterClientScriptBlock() sẽ bao quanh chuỗi của chúng tôi với các thẻ script cần thiết
Server-Side
if (Page.IsPostBack){
ClientScript.RegisterClientScriptBlock(GetType(),
"IsPostBack", "var isPostBack = true;", true);
}
Sau đó, trong kịch bản của bạn chạy cho onLoad, kiểm tra sự tồn tại của biến đó.
if (isPostBack){
//do something here
}
sử dụng để kiểm tra bodyonloadfunc postback về phía khách hàng
function bodyonloadfunc() {
alert("Postback");
}
Cân nhắc tạo câu trả lời mở rộng hơn. – Sam
@Sam bodonloadfunc là một hàm javascript mà nó gọi là trang khi được postback. –
Ý anh là gì bởi "theo dõi"? –