2009-11-28 48 views
0

我正在按钮点击动态地使用jQuery创建文本框。注册动态控件使用jQuery的自动完成

<table width="100%" border="0" cellpadding="0" cellspacing="0"> 
     <tr> 
      <td> 
       <div id="lblCustName"> 
       </div> 
      </td> 
      <td> 
       <div id="lblRemove"> 
       </div> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <input type="button" value="Add" id="AddRow" /> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <input type="submit" value="Submit" id="SaveCustomers" /> 
      </td> 
     </tr> 
     </table> 

    <script type="text/javascript" language="javascript"> 
     $(document).ready(function() { 
      //validate post form 
      $("#CustomersForm").validate({ ignore: ":not(:visible)" }); 
      //Initialize the dynamic id 
      _DynId = 1; 
      //Click Event for Customers 
      $('#AddRow').click(function(e) { 
       $('#lblCustName').append('<div id="lblCustName' + _DynId + '" style="height:20px;padding-left:10px;">' + '<input type="text" name="CustName" id="CustName' + _DynId + '" class="required" value="" title="*" />'); 
       $('#lblRemove').append('<div id="lblRemove' + _DynId + '" style="height:20px;padding-left:10px;">' + '<img src="../../Content/Images/delete_icon.gif" onclick=Remove("' + _DynId + '"); title="Remove" id="iRemove' + _DynId + '"></img>'); 
       _DynId += 1; 
      }); 
</script> 

我想为客户动态添加文本框。 这是用于添加报表处理功能的示例html,... 我需要为文本框提供自动完成选项。

我用下面的脚本是:

$.getJSON("/User/GetAllCustomers/?t=" + new Date(), {}, 
     function(data) { 
      if (data != null) { 
       $("input:text[name=CustName]").autocomplete(data, { mustMatch: false, matchContains: 4, max: 50, 
        formatItem: function(row) { 
         if (row.CustomerName!= "") { 
          return row.CustomerName; 
         } 
        }, 
        formatResult: function(row) { 
         return row.CustomerName; 
        } 
       }).result(function(e, row) { 
        //do something 
       }); 
      } 
     }); 

自动完成不工作的动态添加控件。

我想任何可能性的动态添加控件注册的形式,从而使自动完成将为动态添加控件

回答

1

的问题是,当你绑定的是自动完成它的结合领域的工作,匹配功能运行时的选择器。如果您稍后添加的内容与其匹配,则不会自动绑定。

对于基本的jQuery的事件有一个Live结合,可以让你自动做这个,但自动完成不会通过这项工作 - 基本上是你唯一的选择就是在每次添加一个新的文本字段时绑定一个新的自动完成

EG:添加到AddRow功能:

$("#lblCustName" + _DynId + " input[name=CustName]").autocomplete(...); 

你可能会希望把你的数据对象,你从WebService拉回(很明显,你想要的参数取代...)在一个 全局变量来支持这一点,并可能与自动完成选项相同(只是为了避免代码重复)。

+0

如果我有成千上万的客户,那么根据您的答案,如果我每次添加一个新控件时绑定,那么它必须在新控件添加时不必要地调用数据库,这会在应用程序端造成性能问题。任何想法,以避免数据库调用。我也无法使用缓存,因为用户可能拥有不同数量的客户。 – Prasad 2009-11-30 04:28:10

+0

如果您将getJSON调用的结果存储在全局JavaScript变量中(或者如果您想要整洁,则使用名称空间),那么您将不必为添加的每一个调用回服务器,而是可以重新使用现有的每次都是可变的。这就是我在文章最后一段提到的。你仍然可以使用输出缓存,你应该查看VaryBy参数(如果你通过用户ID改变输出缓存,那么每个用户的信息将被单独缓存),但是如果JavaScript不需要做的话,它仍然会更快即使它不会击中分贝,也是一次往返。 – fyjham 2009-11-30 21:31:41