2011-11-20 49 views
0

我有一個表單使用兩個元素上的jQuery UI自動完成功能,並且還具有使用SheepIt!插件克隆自身的能力。爲什麼jQuery自動完成更新克隆表單上的所有元素?

這兩個元素都是文本輸入。從第一個自動填充(大洲)中選擇一個值後,第二個自動填充(國家/地區)的值將根據第一個選擇填充選項。

我的問題是,當創建克隆時,如果用戶從第一個自動填充(大陸)中選擇一個選項,它會更改所有克隆上的第一個輸入值。第二個輸入(國家)不會發生這種情況。

我錯過了什麼?

注意:表單id和名稱中的#index#不是CFML。我使用PHP,並且哈希標記是SheepIt的一部分!克隆插件。

的Javascript:

<script src="../../scripts/jquery-1.6.4.js"></script> 
<script src="../../scripts/jqueryui/ui/jquery.ui.core.js"></script> 
<script src="../../scripts/jquery.ui.widget.js"></script> 
<script src="../../scripts/jquery.ui.position.js"></script> 
<script src="../../scripts/jquery.ui.autocomplete.js"></script> 
<script src="../../scripts/jquery.sheepIt.min.js"></script> 
<script type="text/javascript"> 

$(document).ready(function() { 

    function ord(chr) { 

     return chr.charCodeAt(0); 

    } 

    function chr(num) { 

     return String.fromCharCode(num); 

    } 

    function quote(str) { 

     return '"' + escape(str.replace('"', "'")) + '"'; 

    } 

    String.prototype.titleCase = function() { 

     var chars = [" ", "-"]; 
     var ths = String(this).toLowerCase(); 

     for (j in chars){ 

      var car = chars[j]; 
      var str = ""; 
      var words = ths.split(car); 
      for(i in words){ 

       str += car + words[i].substr(0,1).toUpperCase() + words[i].substr(1); 

      } 

      ths = str.substr(1); 

     } 

     return ths; 

    } 

    function incrementTerm(term) { 

     for (var i = term.length - 1; i >= 0; i--){ 

      var code = term.charCodeAt(i); 

      if (code < ord('Z')) 

       return term.substring(0, i) + chr(code + 1); 

     } 

     return '{}' 

    } 

    function parseLineSeperated(data){ 

     data = data.split("\n"); 

     data.pop(); // Trim blank element after ending newline 

     var out = [] 

     for (i in data){ 

      out.push(data[i].titleCase()); 

     } 

     return out; 

    } 

    function loadcontinent(request, response) { 

     var startTerm = request.term.toUpperCase(); 

     var endTerm = incrementTerm(startTerm); 

     $.ajax({ 

      url: '/db/continent.php?startkey='+startTerm+'&endkey='+endTerm, 

      success: function(data) { 

       var items = parseLineSeperated(data); 

       response(items); 

      }, 

      error: function(req, str, exc) { 

       alert(str); 

      } 

      }); 

    } 

    function loadcountry(request, response) { 

     var startTerm = request.term.toUpperCase(); 

     var endTerm = incrementTerm(startTerm); 

     var continent = $('.continent_autocomplete').val().toUpperCase(); 

     $.ajax({ 

      url: '/db/country.php?key=' + continent, 

      success: function(data) { 

       var items = parseLineSeperated(data); 

       response(items); 


      }, 

      error: function(req, str, exc) { 

       alert(str); 

      } 

      }); 

    } 

    $('#location_container_add').live('click', function() { 
     $("input.continent_autocomplete").autocomplete(continent_autocomplete); 
     $("input.continent_autocomplete").keyup(continent_autocomplete_keyup); 
     $("input.country_autocomplete").autocomplete(country_autocomplete);  
     $("input.country_autocomplete").keyup(country_autocomplete_keyup);  
     $('input.country_autocomplete').focus(country_autocomplete_focus); 
    }); 


    var location_container = $('#location_container').sheepIt({ 
      separator: '', 
      allowRemoveLast: true, 
      allowRemoveCurrent: false, 
      allowRemoveAll: false, 
      allowAdd: true, 
      allowAddN: false, 
      maxFormsCount: 10, 
      minFormsCount: 1, 
      iniFormsCount: 1 
    }); 

    var continent_autocomplete = { 

     source: loadcontinent, 

     select: function(event, ui){ 

      $("input.continent_autocomplete").val(ui.item.value); 

     } 

    } 

    var continent_autocomplete_keyup = function (event){ 

     var code = (event.keyCode ? event.keyCode : event.which); 

     event.target.value = event.target.value.titleCase(); 

    } 

    var country_autocomplete = { 

     source: loadcountry, 

    } 

    var country_autocomplete_keyup = function (event){ 

     event.target.value = event.target.value.titleCase(); 

    } 

    var country_autocomplete_focus = function(){   
     if ($(this).val().length == 0) { 
      $(this).autocomplete("search", " "); 
     } 
    } 

    $("input.continent_autocomplete").autocomplete(continent_autocomplete); 
    $("input.continent_autocomplete").keyup(continent_autocomplete_keyup); 
    $("input.country_autocomplete").autocomplete(country_autocomplete); 
    $("input.country_autocomplete").keyup(country_autocomplete_keyup); 
    $('input.country_autocomplete').focus(country_autocomplete_focus); 

}); 

</script> 

HTML:

<div id="location_container"> 
    <div id="location_container_template" class="location_container"> 
     <div id="continent_name"> 
      <label> Continent Name:</label> 
      <input type="text" id="continent_name_#index#" name="continent_name_#index#" class="continent_autocomplete" /> 
     </div> 
     <div id="country"> 
      <label> Country:</label> 
      <input type="text" id="country_autocomplete_#index#" name="country_autocomplete_#index#" class="country_autocomplete" /> 
     </div> 
    </div> 
</div> 

回答

2
select: function(event, ui){ 

     $("input.continent_autocomplete").val(ui.item.value); 

    } 

該代碼表示​​明確設定每個<input>帶班 「continent_autocomplete」 到選定值的值。

你可能要像

 $(this).val(ui.item.value); 

,但它取決於你的自動完成代碼是如何工作的。

+0

啊,非常感謝。以爲我從這開始太久了! :) – Michael

1

該行:$("input.continent_autocomplete").val(ui.item.value);正在使用continent_autocomplete類更新所有輸入。

UPDATE:jQueryUI Autocomplete Doc:select

當從菜單中選擇的項目觸發; ui.item指 所選項目。 select的默認操作是將字段值的文本 替換爲所選項目的值。取消此 事件可防止更新該值,但不會阻止 菜單關閉。

你根本不需要select位,它看起來像你只是試圖實現默認操作。

+0

這不提供答案?只是突出了問題..可能應該是一個評論或編輯OP ... – rlemon

+0

我到了那裏,抱歉的延誤。問題是「我錯過了什麼?」我在技術上回答。 – nachito