2012-10-16 40 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>