Асинхронный триггер для панели обновления обновляет всю страницу при слишком частом запуске в слишком короткое время - PullRequest
1 голос
/ 13 апреля 2010

У меня есть кнопка поиска, привязанная к панели обновления в качестве триггера, например:

<asp:Panel ID="CRM_Search" runat="server">
    <p>Search:&nbsp;<asp:TextBox ID="CRM_Search_Box" CssClass="CRM_Search_Box" runat="server"></asp:TextBox>
    <asp:Button ID="CRM_Search_Button" CssClass="CRM_Search_Button" runat="server" Text="Search" OnClick="SearchLeads" /></p>
</asp:Panel>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="CRM_Search_Button" />
    </Triggers>
    <ContentTemplate> 
     /* Content Here */
    </ContentTemplate>
</asp:UpdatePanel>

В моем javascript я использую jQuery, чтобы захватить окно поиска и связать его, чтобы кнопка поиска нажала:

    $($(".CRM_Search_Box")[0]).keyup(
        function () {
            $($(".CRM_Search_Button")[0]).click();
        }
    );

Это работает отлично, за исключением случаев, когда я начинаю печатать слишком быстро. Как только я набираю слишком быстро (я думаю, что это быстрее, чем на самом деле возвращают данные), вся страница обновляется (выполняет обратную передачу?) Вместо только панели обновления.

Я также обнаружил, что вместо того, чтобы печатать, если я просто быстро нажимаю на кнопку, он начинает делать то же самое.

Есть ли способ помешать этому? Возможно предотвратить 2-ые запросы, пока первый не был закончен? Если я не на правильном пути, у кого-нибудь есть другие идеи?

Спасибо,
Matt

1 Ответ

3 голосов
/ 13 апреля 2010

Лучше сделать что-то подобное и дать ему вздохнуть:)

Я устанавливаю таймер, поэтому вы ждете 250 Мс, прежде чем отправить его. Я всегда так делаю, я никогда не называю поиск правильным способом, потому что, когда кто-то вводит слово, на самом деле у программы нет причин для постоянного поиска ...

Также это позволит избежать вашей проблемы.

var hTimeOut = null;
$($(".CRM_Search_Box")[0]).keyup(
        function () {
            if(hTimeOut)
                clearTimeout(hTimeOut);
            hTimeOut = setTimeout(function() { $($(".CRM_Search_Button")[0]).click(); }, 250);            
        }
);
...