asp.net中ScriptManager自帶Ajax與jQuery事件衝突

問題引訴:最近在使用asp.net自帶的無刷新提交ScriptManager時,發現一個問題,就是和我本身用jQuery寫的一些事件函數和局部刷新相沖突。經過在網上收索,發現不少人都遇到這個一樣的問題。最終仍是找到的解決的辦法,在此我想將其解決的辦法分享出來供你們參考。javascript

問題解決辦法:html

方法1、二者實現都可以實現頁面的無刷新效果,因此能夠保留其中的一種便可;java

方法2、若是必需要二者混合應用,那麼在用jQuery綁定事件是就要注意一些了jquery

   咱們平時在jQuery中綁定事件最經常使用的方式有如下三種:以click事件爲例app

   (1)target.click(function(){});-----和純js綁定事件沒得什麼區別asp.net

   (2)target.bind("click",function(){});-----只綁定頁面已經存在的控件函數

   (3)target.live("click",function(){});------採用事件委託,把事件綁定在DOM樹的根節點上,而不是直接綁定在某個元素上,這樣新增長的元素能夠經過事件冒泡被綁定上。測試

  因此針對上面問題,只須要在綁定事件的時候使用target.live("click",function(){})方式便可(jQuery版本必須是在1.4及其以上)spa

 

下面簡單說明一下jQuery經過bind和live兩種方式綁定事件的區別.net

       live方法實際上是bind方法的變種,其基本功能就同bind方法的功能是同樣的,都是爲一個元素綁定某個事件,可是bind方法只能給當前存在的元素綁定事件,對於過後採用JS等方式新生成的元素無效,而live方法則正好彌補了bind方法的這個缺陷,它能夠對後生成的元素也能夠綁定相應的事件。那麼live方法的這個特性是怎麼實現的呢?下面來探討一下其實現原理。

      live方法之因此能對後生成的元素也綁定相應的事件的緣由歸結在「事件委託」上面,所謂「事件委託」就是指綁定在祖先元素上的事件能夠在其後代元素上進行使用。live方法的處理機制就是把事件綁定在DOM樹的根節點上,而不是直接綁定在某個元素上。舉一個例子來講明:

              $(".clickMe").live("click",fn);

             $("body").append("<div class='clickMe'>測試live方法的步驟</div>");

    當咱們點擊這個新增的元素時會依次發生以下步驟:

      (1)生成一個click事件,傳遞給div來作處理

      (2)因爲沒有事件直接綁定在div上,因此事件直接冒泡到DOM樹上

      (3)事件不斷冒泡,直到DOM樹的根節點上,默認狀況下,根節點上就綁定了這個click事件

      (4)執行由live綁定的click事件

      (5)檢測綁定事件的對象是否存在,判斷是否須要繼續執行綁定的事件。檢測事件對象是經過檢測 

              $(event.target).closest('.clickMe') 可否找到匹配的元素來實現的。

     (6)經過(5)的測試,若是綁定事件的對象存在的話,就執行綁定的事件。

      因爲只有在事件發生的時候,live方法纔會去檢測綁定事件的對象是否存在,因此live方法能夠實現後來新增的元素也可實現事件的綁定。相比之下,bind會在事件在綁定階段就會判斷綁定事件的元素是否存在,並且只針對當前元素進行綁定,而不是綁定到父節點上。

 

想必到此,你們已經明白了上述問題產生的緣由了吧,因此最好的解決的辦法就是將其事件綁定方式修改一下便可!

 

下面是一個簡單的例子:

<head runat="server">
    <title></title>
    <script src="Js/jquery-1.7.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function () {
            $(".asa").live("click", function () {
                alert(4);
            });
        })
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /><asp:TextBox
                    ID="TextBox1" runat="server"></asp:TextBox>
                <input type="button" class="asa" value="danji" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>
相關文章
相關標籤/搜索