2015-12-02 95 views
0

我有以下代码为多个自动完成的各个领域。所有的工作正常,但问题是,我的用户输入太快,Ajax没有时间加载所有结果。因此,当有人键入整个单词时(它在建议列表中,但尚未出现 - 速度太慢)时,我需要使用该单词,以便它的行为与点击列表中此单词时使用的单词相似。自动完成 - 用户输入速度太快 - 选择输入的输入

答案可能是这样的 - >How do you trigger autocomplete "select" event manually in jQueryUI?,但我不知道它是如何处理填充多个领域。我需要在onchange之后再次执行mysql查询吗?任何人都可以帮忙吗?我是一个初学者,所以请抱歉我不知道。我可能需要一步一步的指导。

如果我需要这个 - 我把它放在我的代码中?

$(this).data('ui-autocomplete')._trigger('select', 'autocompleteselect', {item:{value:$(this).val()}}); 

我的代码是这样的:

$(".addmore").on('click',function(){ 
count=$('table tr:visible').length; 
var data="<tr><td><div class='form-control rohy'><i class='fa fa-trash-o vymazat' id='"+i+"' onclick='reply_click(this.id);calculatecelkovoucenu();removeRow(this)' value='delete_"+i+"' data-val='"+i+"' style='font-size: 18px;color: #e70000;cursor: pointer;'></i><div></td><td><div class='form-control rohy'><span id='snum"+i+"'>"+count+".</span><div></td>"; 
data +="<td style='padding-right: 10px;'><input class='form-control rohy' type='text' id='produktyname_"+i+"' name='produktyname_"+i+"' placeholder='Kod zbozi' ></td> <td style='padding-right: 10px;'><input class='form-control rohy' type='text' id='produkty_no_"+i+"' name='produkty_no_"+i+"' placeholder='Popis zbozi' ></td><td style='padding-right: 10px;'><input class='form-control rohy' type='text' id='phone_code_"+i+"' name='phone_code_"+i+"' placeholder='Cena za 1 ks' oninput='calculate"+i+"();calculatecelkovoucenu();'></td><td style='padding-right: 10px;'><input class='form-control rohy' type='text' id='produktypocet_"+i+"' name='produktypocet_"+i+"' placeholder='Ks' oninput='calculate"+i+"();calculatecelkovoucenu();'></td><td><input class='form-control rohy' type='text' id='celkovacena_"+i+"' name='celkovacena_"+i+"' placeholder='Celkova cena' onchange='calculate"+i+"();calculatecelkovoucenu();' readonly></td></tr>"; 
$('table').append(data); 
row = i ; 
$('#produktyname_'+i).autocomplete({ 
source: function(request, response) { 
    $.ajax({ 
     url : 'getprodukty.php', 
     dataType: "json", 
     method: 'post', 
    delay: 0, 
     data: { 
      name_startsWith: request.term, 
      type: 'produkty_table', 
      row_num : row 
     }, 
     success: function(data) { 
      response($.map(data, function(item) { 
       var code = item.split("|"); 
       return { 
        label: code[0], 
        value: code[0], 
        data : item 
       } 
      })); 
     } 
    }); 
}, 
autoFocus: true,    
minLength: 3, 
select: function(event, ui) { 
    var names = ui.item.data.split("|"); 
    id_arr = $(this).attr('id'); 
    id = id_arr.split("_");     
    $('#produkty_no_'+id[1]).val(names[1]); 
    $('#phone_code_'+id[1]).val(names[2]); 
    $('#produkty_code_'+id[1]).val(names[3]); 
}    
});   


$('#produkty_code_'+i).autocomplete({ 
source: function(request, response) { 
    $.ajax({ 
     url : 'getprodukty.php', 
     dataType: "json", 
     method: 'post', 
    delay: 0, 
     data: { 
      name_startsWith: request.term, 
      type: 'produkty_table', 
      row_num : row 
     }, 
     success: function(data) { 
      response($.map(data, function(item) { 
       var code = item.split("|"); 
       return { 
        label: code[3], 
        value: code[3], 
        data : item 
       } 
      })); 
     } 
    }); 
}, 
autoFocus: true,    
minLength: 3, 
select: function(event, ui) { 
    var names = ui.item.data.split("|"); 
    id_arr = $(this).attr('id'); 
    id = id_arr.split("_");   
    $('#produkty_no_'+id[1]).val(names[1]); 
    $('#phone_code_'+id[1]).val(names[2]); 
    $('#produktyname_'+id[1]).val(names[0]); 
}    
    }); 
$('#phone_code_'+i).autocomplete({ 
source: function(request, response) { 
    $.ajax({ 
     url : 'getprodukty.php', 
     dataType: "json", 
     method: 'post', 
    delay: 0, 
     data: { 
      name_startsWith: request.term, 
      type: 'produkty_table', 
      row_num : row 
     }, 
     success: function(data) { 
      response($.map(data, function(item) { 
       var code = item.split("|"); 
       return { 
        label: code[2], 
        value: code[2], 
        data : item 
       } 
      })); 
     } 
    }); 
}, 
autoFocus: true,    
minLength: 3, 
select: function(event, ui) { 
    var names = ui.item.data.split("|"); 
    id_arr = $(this).attr('id'); 
    id = id_arr.split("_");      
    $('#produkty_no_'+id[1]).val(names[1]); 
    $('#produkty_code_'+id[1]).val(names[3]); 
    $('#produktyname_'+id[1]).val(names[0]); 
}    
}); 
$('#produkty_no_'+i).autocomplete({ 
source: function(request, response) { 
    $.ajax({ 
     url : 'getprodukty.php', 
     dataType: "json", 
     method: 'post', 
    delay: 0, 
     data: { 
      name_startsWith: request.term, 
      type: 'produkty_table', 
      row_num : row 
     }, 
     success: function(data) { 
      response($.map(data, function(item) { 
       var code = item.split("|"); 
       return { 
        label: code[1], 
        value: code[1], 
        data : item 
       } 
      })); 
     } 
    }); 
}, 
autoFocus: true,    
minLength: 3, 
select: function(event, ui) { 
    var names = ui.item.data.split("|"); 
    id_arr = $(this).attr('id'); 
    id = id_arr.split("_");      
    $('#produkty_code_'+id[1]).val(names[3]); 
    $('#phone_code_'+id[1]).val(names[2]); 
    $('#produktyname_'+id[1]).val(names[0]); 
}    
}); 

i++; 
}); 

getprodukty.php如下:

if($_POST['type'] == 'produkty_table'){ 
$row_num = $_POST['row_num']; 
$name = $_POST['name_startsWith']; 
$query = "SELECT kod,cena,popis FROM produkty where kod LIKE '".$name."%' ORDER by kod ASC LIMIT 5"; 
$result = mysqli_query($spojeni, $query);  
$data = array(); 
while ($row = mysqli_fetch_assoc($result)) { 
    $name = $row['kod'].'|'.$row['popis'].'|'.$row['cena'].'|'.$row_num; 
    array_push($data, $name); 
} 
echo json_encode($data); 
} 

谢谢!

+1

您可能需要存储对先前ajax请求的引用,然后在创建新引用时将其中止。你可以尝试去掉事件 – adeneo

+0

你能给我一个提示,我该怎么做? –

回答

0

这是我将如何处理它:

  • 存储用于自动完成部分字段值
  • 与储值执行Ajax请求
  • 检查电流值,如果相同的进展,如果不同的中止(大概新的添加以更新的值触发了更多的Ajax请求)。