从DropDownList中选择选项时激活function

我设计了一个自动完成function,当一个人在文本框中输入至少3个字母时,它将通过几个火车站数据库中的一个来查找具有这三个(或更多)字母的所有可能的站。

该function完美运行,在打开网页时,自动完成列表会提供正确的站点。

但是,用于生成自动完成建议的数据库的选择基于用户输入到页面上的下拉列表。

目前使用的数据库是基于页面加载时选择的选项(所以顶部选项),我似乎无法在用户输入更改时更改此选项。

这是代码的问题部分:

$(function () { for(i=0;i<30;i++){ $("#_Q6_Q" + i + "_Q3_C").change(function(){ transportChange($("#_Q6_Q" + i +"_Q3_C").val(), i) }); }; } 

以下是transportChange函数如何使用参数的粗略示例:

 function transportChange(lst, i) { /* lst = input into Mode of Transport question. i correlates to the row number - these are auto generated when the respondent changes their answer. */ //Blank auto complete box //Use for loops to generate numbers correlating to input boxes for(var q=5; q<7; q++){ for(var u=0; u<3; u++){ $("#_Q6_Q".concat(String(i),"_Q", String(q), "_Q0_Q", String(u))).val(''); }; }; // disable drop down and auto complete boxes whilst loading data; $("#_Q6_Q".concat(String(i),"_Q4_Q0_Q0")).prop('disabled', true); } 

我可以告诉你,’lst’参数被连接成一个链接,然后定义将使用哪个数据库。

自动完成function来自JQuery。

忽略第一个for循环中缺少的var (技术上将i放在全局范围内) ,以及你在30个选择框上对change事件应用回调函数的事实(这是正确的吗?!)

看起来问题 – 至少是第一部分 – 是回调共享相同的执行范围。 这意味着在所有函数中, i将始终等于指定的最后一个值(30)。

这种行为比我在这里做的要好得多: Javascript闭包如何工作?

那么……你能否按如下方式更新你的第一个代码块:

 $(function(){ for(var i=0; i<30; i++){ $("#_Q6_Q"+ i +"_Q3_C").change(callbackFactory(i)); } function callbackFactory(i){ return function(){ transportChange($("#_Q6_Q"+ i +"_Q3_C").val(), i); }; } // ... }); 

这将确保生成的每个函数都封装在它自己的范围内i将是你认为的那样) - 这是我到目前为止发现的唯一逻辑缺陷,如果它不起作用那么我们需要更多的信息。