2012-10-16 62 views
0

所有,

環境:ASP.NET 2.0,AjaxToolkit建立1.0.20229.0,IE9

我使用$ find()方法找到一個行爲的調用擴展器,所以我可以顯式使用.show()方法顯示。不幸的是,$ find()返回null。

$find('my auto generated behvaiour Id').show(); 

FYI:本BehaviorID在ValidatorCalloutExtender使用控制的客戶端ID生成(ClientID_ +「BehaviourID」 < - 也是我在我的$查找()函數中使用),因爲我有這個控制的許多實例在同一頁上。

我看着渲染代碼,我可以看到JS創建一個用於創建行爲:

Sys.Application.add_init(function() { 
$create(AjaxControlToolkit.ValidatorCalloutBehavior ... 

的$ find()方法執行一個UpdatePanel和回報總是空一回發後。編輯(新增): 我創建了新頁面,下面是代碼,find()返回仍然爲null, - Ajax控件中是否存在一個bug,用於ASP.NET 2.0?

<body> 
<form id="form1" runat="server"> 

<asp:ScriptManager ID="ScripManager1" runat="server" EnablePageMethods="True" > 

     </asp:ScriptManager> 

    <asp:TextBox runat="server" ID="txtInputField" /> 
    <asp:RequiredFieldValidator runat="server" ID="valInput" 
ControlToValidate="txtInputField" 
ErrorMessage="ERROR STRING" 
Display="none" /> <ajaxToolkit:ValidatorCalloutExtender runat="server" ID="extValInput" TargetControlID="valInput" BehaviorID="myID" /> 
<asp:Button runat="server" ID="btn" OnClick="btn_click" CausesValidation="True" /> 

<script type="text/javascript"> 

     var obj = $find("myID"); 
     alert(obj); 

</script> 
</form> 

新增: 在JS調試器的觀察後,我意識到,只有出現驗證標註擴展(動態添加到DOM)時,有錯誤,因此,如果沒有錯誤,你無法找到它。

現在問題是:如何在顯示呼叫之前重新定位呼叫擴展器baloon?它真的趕上了22,當它沒有被顯示時,你不能訪問它,當它被顯示時,它已經遲到了,因爲它顯示在錯誤的地方。

+0

爲什麼您決定使用control + BehaviorID的ClientID生成的擴展器組件ID?如果您爲擴展器指定了BehaviorID屬性,則應該將其用作$ find方法中的組件ID。 –

+0

因爲它是一個不止一次出現在頁面上的用戶控件,這意味着如果我設置了BehaviorID ='myID',它將不會是唯一的。不過,我創建了一個簡單的頁面,包含ValidatorCalloutExtender,分配了一個唯一的行爲ID,$ find('分配的行爲ID')仍然沒有找到它。在框架中必須有一個錯誤。我正在使用ASP.NET 2.0,用於ASP.net 2.0的Ajax工具包。 – ActiveX

+0

在JS調試器中觀察之後,我意識到驗證器標註擴展器僅在出現錯誤時纔會出現(動態添加到DOM),因此,如果沒有錯誤,則無法找到它。 – ActiveX

回答

4

問題的原因是您在頁面完成組件初始化之前嘗試查找組件。嘗試在Sys.Application.add_load事件處理程序中訪問您的編輯器。我想下面的代碼,一切工作正常:

<script type="text/javascript"> 
    Sys.Application.add_load(function() { 
     var obj = $find("myID"); 
     alert(obj); 
    }); 
</script> 

編輯: 爲了解決您的最新的問題:你如何重新定位。標註ValidatorCalloutExtender使用PopupExtender來顯示它。因此,您可以嘗試綁定到彈出式擴展程序的「顯示」和「顯示」事件,然後嘗試重新定位標註。

<script type="text/javascript"> 
    Sys.Application.add_load(function() { 
     var callouotComponent = $find("myID"); 
     var popupBehavior = callouotComponent._popupBehavior; 

     popupBehavior.add_showing(function(){alert("I am showing");}); 
     popupBehavior.add_shown(function(){alert("I was shown");}); 
    }); 
</script> 

注意:我沒有驗證此代碼,但它可以用作起點。

1

修改了你的代碼並驗證了,彈出的位置正在改變。

<script type="text/javascript"> 
    Sys.Application.add_load(function() { 
     var callouotComponent = $find("myID"); 
     //Below line is to init popup ballon, otherwise popup behaviour will return null 
     callouotComponent._ensureCallout(); 
     var popupBehavior = callouotComponent._popupBehavior; 
     popupBehavior.set_x(100); 
     popupBehavior.set_y(100); 
    }); 

</script>