1

ページが自動的に初期化されて実行されるjs関数があります。このjsは、最初にページを開いたときに呼び出されて完全に実行されますが、ページをポストバック(asp.netページのリンクをクリック)すると、呼び出されず、関数が壊れます。

これはDefault.aspxの私のjs関数です:

<script type="text/javascript">
        function HightLightKeywords() {
            var container = document.getElementById("result");
            var keywords = new Array();
            <%  
                // This is C# code runs in server side.
                for (int i = 0; i < keywords.Count; i++)
                {
                    Response.Write(string.Format("keywords['{0}'] = '{1}';", i, keywords[i]));
                }
            %>
            for (var i = 0; i < keywords.length; i++)
            {
                var a = new RegExp(keywords[i], "igm");
                container.innerHTML = container.innerHTML.replace(a, "<span style='background:#FF0;'>" + keywords[i] + "</span>");
            }
        }
        HightLightKeywords();
    </script>

最初にDefault.aspxを入力すると1回だけ実行され、ページのボタンをクリックした後は2回トリガーされません(ポストバック)。

これはクライアントキャッシュに関連していますか?ポストバック時にクライアントキャッシュを防ぐ方法はありますか(いくつかのプロパティを設定することによって?)?

ありがとう

4

1 に答える 1

0

<%= ... %>ブロック内のコードは、ページ全体のリロード時にのみ実行されることに注意してください。必要なのは、配列を更新し、部分的なポストバックごとに関数keywordsを再呼び出しして制御することです。以下のコードを確認してください。hHightLightKeywordsScriptManager

 <script type="text/javascript">
      function hHightLightKeywords() {
           var container = document.getElementById("result");
           for (var i = 0; i < keywords.length; i++) {
                var a = new RegExp(keywords[i], "igm");
                container.innerHTML = container.innerHTML.replace(a, "<span style='background:#FF0;'>" + keywords[i] + "</span>");
           }
      }
 </script>

 <asp:UpdatePanel runat="server">
      <ContentTemplate>
           <asp:TextBox runat="server" ID="KeywordsTextBox" Text="cras turpis et" />
           <asp:Button runat="server" Text="Click Me" />
      </ContentTemplate>
 </asp:UpdatePanel>
 <p id="result">
      Et ac tincidunt nisi pid vel? Nunc turpis risus duis porta cursus cum augue, nisi,
      scelerisque turpis aliquam. Scelerisque tristique pid, elementum augue sociis augue
      cras mauris lundium nisi rhoncus diam cras parturient nec, velit odio, et turpis
      risus porttitor aliquam facilisis, ut duis augue porta magnis velit velit, augue
      vut sed facilisis dignissim, arcu, cras! Ultrices adipiscing? Est eros ac augue
      turpis integer mus massa! Est nisi auctor sagittis augue sit? Tortor tristique elementum,
      adipiscing. Nec platea ac natoque facilisis, porta tincidunt magna lorem augue tincidunt
      turpis, scelerisque adipiscing elementum scelerisque. Risus'vel ac augue lorem odio!
      Cursus ultrices et elementum egestas dapibus proin arcu velit augue?
 </p>

分離コード:

protected IEnumerable<string> Keywords
{
    get
    {
        return KeywordsTextBox.Text.Split(' ').Where(kw => !string.IsNullOrEmpty(kw)).Select(kw => "'" + kw.Trim().Replace("'", @"\'") + "'");
    }
}

protected void Page_PreRender(object sender, EventArgs e)
{
    ScriptManager.RegisterArrayDeclaration(this, "keywords", string.Join(",", Keywords));
    ScriptManager.RegisterStartupScript(this, this.GetType(), "hHightLightKeywords", "hHightLightKeywords()", true);
}
于 2013-03-11T12:36:15.783 に答える