基本上,当页面加载时,我将div可见性设置为false。当我单击按钮时,我希望调用函数后面的函数,并且div标签是可见的,为真。
$('#Button2').click(function () {
$('#edit').show(function () {
});
});
<input type="submit" id="Button2" runat="server" value="Search" OnServerClick="Button1_Click" />
但是当点击按钮时,页面会回发,导致div标签始终不可见。
我可以将return false设置为按钮的onlclick事件,但我也需要调用该函数。
答案 0 :(得分:1)
如果您不希望表单提交,则阻止该事件的默认操作应该起作用:
$('#Button2').click(function ( evt )
{
$('#edit').show(function ()
{
} );
evt.preventDefault();
} );
<input type="submit" id="Button2" runat="server" value="Search" OnServerClick="Button1_Click" />
如果您 希望表单提交,那么您将不得不在服务器上弄清楚div应该或不应该在页面加载时显示(根据您的表单标准)提交/确认/等)。 jQuery只能在特定页面加载期间在页面内执行。
答案 1 :(得分:1)
答案 2 :(得分:0)
看起来你得到了答案,但这里有一些可能会有所帮助,尽管你的问题对你的意图有点模糊。
更新以包含UpdatePanel和jQuery解决方案
这是使用模板的jQuery解决方案,尽管您可以通过几种不同的方式执行此操作。您不需要使用模板,但我可能是最简单的方法。通过仅发送回JSON,开销比UpdatePanel解决方案小得多。
<script src="https://github.com/jquery/jquery-tmpl/raw/master/jquery.tmpl.min.js" type="text/javascript"></script>
<script id="productTemplate" type="text/html">
<tr>
<td>${Name}</td><td>${Price}</td>
</tr>
</script>
<script type="text/javascript">
$(function () {
$("#searching").ajaxStart(function () {
$(this).show();
});
$("#searching").ajaxStop(function () {
$(this).hide();
});
$("#btnSearch").click(function (evt) {
// JSON.stringify requires json2.js for all browser support
//https://github.com/douglascrockford/JSON-js
//post to WebMethod
var p = { product: $("#product").val() };
$.ajax({
type: "POST",
url: "Default.aspx/Search",
data: JSON.stringify(p),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
//unwrap response if using .NET 3.5+
var results = data.d;
//jQuery templates make it much easier to render repeat data
$("#productTemplate").tmpl(results).appendTo($("#products").empty());
$("#results").show('slow');
}
});
evt.preventDefault();
});
</script>
HTML
<div id="searching" style="display:none;">
Searching Please Wait....
<img src="Products/ajax-loader.gif" alt="Searching" />
</div>
<input type="text" id="product" />
<input type="submit" id="btnSearch" value="Search" />
<div id="results" style="display:none;">
<table cellspacing="0" border="1" style="border-collapse:collapse;">
<tbody><tr><th scope="col">Product</th><th scope="col">Price</th></tr></tbody>
<tbody id="products"></tbody>
</table>
</div>
代码隐藏 - 您需要使用System.Web.Services;
//If you're going to be using this in multiple locations then I'd put this into a seperate WebService.asmx
[WebMethod]
public static List<Product> Search(string product)
{
//Simulate database call
System.Threading.Thread.Sleep(2000);
//Do your database code here
//Using strongly typed model makes generating the JSON much easier
var products = new List<Product>();
for (int i = 0; i < 10; i++) {
products.Add(new Product() { Name = String.Format("Product {0} {1}", product, i), Price = 10 * i });
}
return products;
}
public class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
更新面板解决方案可能对普通的ASP.NET更为熟悉,但它的缺点是只隐藏了回发周期。您仍在每个请求上发回完整的ViewState和HTMl。
<asp:ScriptManager ID="ScriptManager" runat="server"></asp:ScriptManager>
<!-- Grab a nice loading gif http://www.ajaxload.info/ -->
<asp:UpdateProgress ID="MainUpdateProgress" runat="server"
AssociatedUpdatePanelID="MainUpdatePanel">
<ProgressTemplate>
Searching Please Wait....
<img src="ajax-loader.gif" alt="Searching"/>
</ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel ID="MainUpdatePanel" runat="server">
<ContentTemplate>
<asp:TextBox id="tbProduct" runat="server" />
<asp:Button ID="btnSearch" runat="server" Text="Search Products"
onclick="btnSearch_Click" />
<asp:GridView ID="grdvProducts" runat="server"></asp:GridView>
<br />
<!-- if you dont want to use a gridview then a repeater will do -->
<asp:Repeater ID="rProducts" runat="server">
<HeaderTemplate>
<table cellspacing="0" border="1" style="border-collapse:collapse;">
<tbody>
<tr><th scope="col">Product</th><th scope="col">Price</th></tr>
</HeaderTemplate>
<ItemTemplate>
<tr><td><%# Eval("Product") %></td><td><%# Eval("Price") %></td></tr>
</ItemTemplate>
<FooterTemplate>
</tbody>
</table>
</FooterTemplate>
</asp:Repeater>
</ContentTemplate>
</asp:UpdatePanel>
背后的代码
protected void btnSearch_Click(object sender, EventArgs e)
{
//Do Validation
string product = tbProduct.Text;
//Do database calls here
Thread.Sleep(2000); //Simulate long search time
var dt = new DataTable();
dt.Columns.Add("Product");
dt.Columns.Add("Price");
for (int i = 0; i < 10; i++) {
dt.Rows.Add(String.Format("Product {0} {1}", product, i), i * 10);
}
grdvProducts.DataSource = dt;
grdvProducts.DataBind();
rProducts.DataSource = dt;
rProducts.DataBind();
}