在javascript中检测Ajax CalendarExtender的存在

在javascript中检测Ajax CalendarExtender的存在,javascript,asp.net,ajaxcontroltoolkit,calendarextender,Javascript,Asp.net,Ajaxcontroltoolkit,Calendarextender,我有一个表单,其中的一些部分需要通过javascript动态克隆,以允许用户输入其他详细信息。一切正常,除非其中一个被克隆的文本框连接了CalendarExtender用于日期选择。textbox已克隆,但calendar extender未克隆,因为它显然不作为DOM中的元素存在,并且事件未直接附加到要克隆的textbox 所以,我要寻找的是一种确定是否连接了日历扩展程序的方法,最好是通过检查文本框本身的某些属性。或者,如果有某种方法可以检查扩展程序集合中的textbox id等,那么我可以向

我有一个表单,其中的一些部分需要通过javascript动态克隆,以允许用户输入其他详细信息。一切正常,除非其中一个被克隆的文本框连接了CalendarExtender用于日期选择。textbox已克隆,但calendar extender未克隆,因为它显然不作为DOM中的元素存在,并且事件未直接附加到要克隆的textbox

所以,我要寻找的是一种确定是否连接了日历扩展程序的方法,最好是通过检查文本框本身的某些属性。或者,如果有某种方法可以检查扩展程序集合中的textbox id等,那么我可以向克隆的textbox添加一个新行为

如有任何关于在何处查找此数据的建议,将不胜感激。 谢谢


更新,示例

这是我正在使用的asp.net ajax calendarExtender,页面上有正在使用的实例。(我相信您也可以从该网站下载工具包。)

我将在这里提供我正在使用的代码的简化版本(删除页面上的所有内容,除了有问题的控件)


在ASP.Net页面上,我有一个表,其中包含一个带有日历扩展程序的文本框。正如您在这里看到的,它是指textbox的calendar extender的属性,因此textbox在服务器端没有特殊的属性

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
  <table>
    <tr>
      <td>
        <asp:TextBox ID="txtDateFrom" runat="server" />
        <ajx:CalendarExtender ID="calFrom" runat="server" TargetControlID="txtDateFrom" Format="dd/MM/yyyy" />
      </td>
    </tr>
  </table>
</asp:Content>


呈现的客户端HTML如下所示。正如您所看到的,表中没有任何内容表明calendar extender的存在,它只是作为页面中最后一个内容生成的脚本存在

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>...</head>
  <body>
    <form method="post" action="Default.aspx" id="ctl101">
      <table>
        <tr>
          <td>
            <input name="ctl00$MainContent$txtDateFrom" type="text" id="txtDateFrom">
          </td>
        </tr>
      </table>
      ...
      <script type="text/javascript">
        //<![CDATA[
        Sys.Application.add_init(function() {
          $create(Sys.Extended.UI.CalendarBehavior, {"format":"dd/MM/yyyy","id":"calFrom"}, null, null, $get("txtDateFrom"));
        });
        //]]>
      </script>
    </form>
  </body>
</html>

...
...
//

用于克隆表行的javascript如下所示:

function addRow(tr) {
  var cl = tr.cloneNode(true);
  cl.style.display = "table-row";
  for (var i = 0; i < cl.cells.length; i++)
    if (cl.cells[i].firstChild) {
      cl.cells[i].firstChild.value = ""; // reset inputs
      if (cl.cells[i].firstChild.id.match(/date/i)) // check & add calendar extender
        $create(Sys.Extended.UI.CalendarBehavior, { "format": "dd/MM/yyyy", "id": "cal"+tr.rowIndex }, null, null, cl.cells[i].firstChild);
    }
  tr.parentNode.insertBefore(cl, tr.nextSibling);
}
函数addRow(tr){
var cl=tr.cloneNode(真);
cl.style.display=“表格行”;
对于(变量i=0;i


也许你可以用不同的方式解决这个问题,让我解释一下

$$ Panel 1 $$
First Name = Tom
Last Name = Miller
Menu Item = Pizza
Drink = Yes

$$ Panel 2 $$ (if Menu Item == Pizza Panel.Display = True)
Topping = Onion

$$ Panel 3 $$ (if Drink == Yes Panel.Display = True)
Drink = Soda
因此,基本上,所有内容都已构建并显示在单独的面板中,但您可以根据条件打开或关闭问题部分的显示


这有帮助吗?

对不起,我认为你没有正确地阅读这个问题。我正在克隆页面的各个部分,而不仅仅是显示/隐藏现有元素。克隆过程本身工作正常,但AjaxControlToolkit.CalendarExtender除外,它不是表单中的实际元素,而是由附加到特定文本框的行为表示。我正在寻找一种通过检查文本框来检测这种行为是否存在的方法。总之,你想知道某个文本框是否正在日历扩展程序的扩展中使用吗?如果文本框ID使用了特定的命名约定,该怎么办?我一直在重读你的问题,我想说,我明白你的要求,但我认为还有更多。您能否提交示例代码、图片或其他内容,为我们提供更好的想法来帮助您。您是对的,我应该从一开始就发布代码示例-我的工作假设是人们会熟悉extender控件的工作方式。正如您现在应该能够看到的,我的解决方法正如您刚才所建议的,在文本框名称中检查“日期”。希望现在情况更清楚了。是的,我知道发生了什么。使用name属性怎么样,我知道您可以直接从Javascript使用它。名称和Id都已设置,但在.net编译器中,我可以在服务器端设置Id,但名称是基于元素层次结构生成的。目前我有一个解决方法,包括手动设置文本框用于日期的特定标志。然后,我可以选中此标志并向克隆的文本框添加新的日历行为。我觉得这是一个不太优雅的解决方案,尽管如此,我还是希望有人能想出一个更干净的方法来解决这个问题。