jQuery .load似乎正在意外地运行

时间:2008-12-27 00:34:17

标签: c# asp.net javascript jquery ajax

所以我试图从.aspx页面加载一些返回的html,但是在执行AJAX请求所依赖的东西之前需要触发click事件。更具体地说,我这样做。当用户键入文本字段时,将运行此功能...

function KeyPress() {
  $("#" + HiddenButtonId).click();
  $("#test").load("TempJumpToAJAX.aspx");
}

然后$(“#”+ HiddenButtonId).click();确实在文件后面的代码中设置了一些会话数据。具体地说...

Session["SearchText"] = Search.Text;

然后,$(“#test”)。load(“TempJumpToAJAX.aspx”);调用.aspx页面返回一个新建的选择框...

        Response.Expires = -1;

        StringBuilder builder = new StringBuilder();


        builder.Append("<select id=\"testListId\" name=\"testList\" size=\"4\" style=\"width:200px;\">");
        builder.Append("<option>");
        builder.Append(Session["SearchText"]);
        builder.Append("</option>");            
        builder.Append("</select>");

        Response.ContentType = "text/HTML";
        Response.Write(builder.ToString());
        Response.End();

问题是,顺序似乎搞砸了,它首先试图附加Session [“SearchText”],然后运行click事件运行的代码。所以它的功能更像......

function KeyPress() {
  $("#test").load("TempJumpToAJAX.aspx");
  $("#" + HiddenButtonId).click();
}

命令反转的位置。所以实际发生的是会话变量有一个空字符串,而不是用户在文本框中键入的字符串。对我来说奇怪的是它似乎不应该有一个空字符串,似乎它应该什么都没有,因为此时会话变量尚未初始化为任何东西。我真的不知道发生了什么。我想,这可能会让我缺乏经验。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

你在这里混合技术。 hiddenButtonID click事件试图对页面进行完整的回发,而AJAX调用不会进行回发。没有理由回复邮件,然后通过AJAX调用进行跟进。 AJAX的目的是消除回发页面的需要,而只是使用对服务器的小回调重新加载页面上的少量HTML。您应该在AJAX调用参数中将该数据传递给服务器,而不是访问HiddenButtonID单击事件处理程序中的搜索文本框文本。

以下客户端脚本应该这样做。


function KeyPress() {
  $("#test").load("TempJumpToAJAX.aspx", {searchText: $("#").val()});
}

在此代码中,您将获取搜索文本框的ID,然后使用jQuery检索该文本框的值。这将作为名为'searchText'的POST变量传递给TempJumpToAJAX.aspx页面。您应该可以通过访问'TempJumpToAJAX.aspx'页面中的Request ['searchText']变量来访问此数据。

答案 1 :(得分:1)

您正在做的另一个智能扩展是,只要按下某个键,就不会执行ajax调用。如果用户快速输入一个长单词,您将获得多个ajax http请求,这些请求的触发速度超过了他们返回和更新UI的速度。

这会增加您的服务器负载,并可能使客户端的UI缓慢。

相反,onkeypress,存储所有适当的细节,然后调用

var timeout = setTimeout('some_method()',100);

其中说100毫秒内调用some_method()。您在按键方法中应该做的第一件事是使用clearTimeout取消/清除超时调用。

http://www.w3schools.com/js/js_timing.asp

some_method()也应该清除任何超时,然后发出http ajax请求。

此处的净效果是您的ajax请求稍有延迟,但如果用户按下另一个键则永远不会发生。换句话说,在用户停止/暂停键入之前,请勿尝试触发ajx请求。 100毫秒可能太高或太低,但你希望得到这个想法!

您还应该注意处理“慢速服务器”的情况。考虑一下:

  • 用户输入“hello”,暂停1秒钟,以“hello”作为参数触发ajax请求
  • 用户继续输入“world”,因此textfield现在包含“hello world”,并停止输入。
  • 以“hello world”作为参数,发出第二个ajax请求。
  • 第二个请求(“hello world”)首先返回,您更新UI
  • 第一个请求(“hello”)返回,您再次更新UI。

哎呀!让服务器在其返回给客户端的(json)数据中包含原始查询字符串。当客户端获取ajax数据时,检查结果/数据是否与查询(“hello”/“hello world”)匹配,该查询与当前文本字段中的匹配。

答案 2 :(得分:1)

有一个JQuery插件封装了前面的答案所讨论的内容。它被称为TypeWatch。它允许在用户停止在文本字段中键入指定的毫秒数后触发函数。我以前用过它并且效果很好。

答案 3 :(得分:1)

真棒!感谢大家,所有答案都非常有见地。我学到的真正问题是我不知道如何使用该ajax请求发送变量。在这里。

$("#test").load("TempJumpToAJAX.aspx", {searchText: $("#").val()});

也是mintywalker,感谢您的洞察力。这一切都很好。