【问题标题】:$find() return null for defined ajax behaviour$find() 为定义的 ajax 行为返回 null
【发布时间】:2012-10-06 19:52:39
【问题描述】:

全部,

环境:ASP.NET 2.0,AjaxToolkit build 1.0.20229.0,IE9

我正在使用 $find() 来查找调用扩展器的行为,因此我可以使用 .show() 方法显式显示。不幸的是,$find() 返回 null。

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

仅供参考:ValidatorCalloutExtender 上的 BehaviorID 是使用控件的 ClientID 生成的(ClientID_ + "BehaviourID"

我查看了呈现的代码,我可以看到创建行为的 JS:

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

$find() 在 UpdatePanel 中的回发之后执行并始终返回 null。

编辑(添加): 我创建了新页面,下面是代码,find() 返回仍然为空,- ASP.NET 2.0 的 Ajax 控件中是否存在错误?

<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 中),因此,如果没有错误,则找不到它。

现在的问题是:如何在显示之前重新定位调出扩展气球?真的是catch 22,不显示的时候访问不了,显示的时候已经晚了,因为显示的地方不对。

【问题讨论】:

  • 为什么你决定扩展器组件的 id 由 control + BehaviorID 的 ClientID 生成?如果你为扩展器指定了 BehaviorID 属性,你应该在 $find 方法中使用它作为组件 ID。
  • 因为它是一个可以在页面上多次出现的用户控件,这意味着如果我设置 BehaviorID = 'myID',它就不会是唯一的。尽管如此,我创建了一个简单的页面,包括 ValidatorCalloutExtender,分配了一个唯一的行为 ID,而 $find('assigned behavior ID') 仍然没有找到它。框架中一定有一个错误。我正在使用 ASP.NET 2.0,用于 ASP.NET 2.0 的 Ajax 工具包。
  • 在 JS 调试器中观察后发现,validator callout 扩展器只有在出现错误时才会出现(动态添加到 DOM 中),因此如果没有错误则找不到。
  • 我完全尝试了您的代码,如果我将您发布的 javascript 放在窗口加载事件中,它确实会找到它。这意味着您尝试访问它的时间很重要,因为它可能尚未创建。
  • 您使用的是什么版本的 asp.net 和工具包?在 asp.net 2.0 和最新版本的 asp.net 2.0 工具包中,IE9 不起作用。

标签: javascript asp.net ajaxcontroltoolkit behavior extender


【解决方案1】:

问题的原因是您在页面完成组件初始化之前尝试查找组件。尝试在 Sys.Application.add_load 事件处理程序中访问您的编辑器。我尝试了以下代码,一切正常:

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

编辑: 解决您的最新问题:如何重新定位它。 Callout 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>

注意:这段代码我没有验证,但可以作为起点。

【讨论】:

    【解决方案2】:

    修改您的代码并验证,弹出位置正在改变。

    <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>
    

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多