Javascript 无法启用动态生成的选择选项

Javascript 无法启用动态生成的选择选项,javascript,jquery,ajax,servlets,Javascript,Jquery,Ajax,Servlets,我有一个系统,在这个系统中,使用对servlet的ajax调用动态填充多个select。这些选项是在servlet上生成的,该servlet决定启用或禁用哪些选项 一选择,我需要启用一个或多个标记为禁用的选项。但是,在ajax调用之后,我似乎无法启用它们。起初我认为这可能是一个异步问题,但我处理了这个问题,仍然无法启用它们 我试过.prop(“禁用”,false),试过.attr(“禁用”,false),试过.removeAttr(“禁用”)。这些都不起作用 调用的HTML。selEditRun

我有一个系统,在这个系统中,使用对servlet的ajax调用动态填充多个select。这些选项是在servlet上生成的,该servlet决定启用或禁用哪些选项

一选择,我需要启用一个或多个标记为禁用的选项。但是,在ajax调用之后,我似乎无法启用它们。起初我认为这可能是一个异步问题,但我处理了这个问题,仍然无法启用它们

我试过.prop(“禁用”,false),试过.attr(“禁用”,false),试过.removeAttr(“禁用”)。这些都不起作用

调用的HTML。selEditRun的选项也是动态生成的,其值对应于“run”的数据库id:

最后,在servlet上:

private String getOfficersWithDisables(HttpServletRequest request) throws ClassNotFoundException, SQLException, ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy");
    String htmlString = "<option value=''>&nbsp;</option>\n";
    List<Officer> officerList = TCAUDatabaseUtil.getOfficers();
    String dateString = request.getParameter("date");

    Date d = sdf.parse(dateString);
    Calendar cal = Calendar.getInstance();
    cal.setTime(d);
    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

    for (Officer officer : officerList) {
        boolean hasRun = !(TCAUDatabaseUtil.getRunName(d, officer.getId()).equals(""));
        boolean hasAppt = TCAUDatabaseUtil.hasAppt(d, officer.getId());
        boolean isReserveDay = (dayOfWeek == convertTCAUDayToCalendarDay(officer.getRd1()) || dayOfWeek == convertTCAUDayToCalendarDay(officer.getRd2()));
        boolean isAssigned = !(TCAUDatabaseUtil.getAttendanceEvent(d, officer.getId()).equals(""));
        boolean isDisabled = (hasAppt || hasRun || isReserveDay || isAssigned);

        htmlString += "<option value='" + officer.getId()+ "'" + (isDisabled?" disabled":"") + ">" + officer.getDisplayName() + "</option>";
    }
    return htmlString;
}
私有字符串getOfficersWithDisables(HttpServletRequest请求)抛出ClassNotFoundException、SQLException、ParseException{
SimpleDataFormat sdf=新的SimpleDataFormat(“dd MMM yyyy”);
字符串htmlString=“\n”;
List officerList=TCAUDatabaseUtil.getOfficers();
String dateString=request.getParameter(“日期”);
dated=sdf.parse(日期字符串);
Calendar cal=Calendar.getInstance();
校准设定时间(d);
int dayOfWeek=cal.get(日历。每周的第几天);
适用于(官员:公务员名单){
布尔值hasRun=!(TCAUDatabaseUtil.getRunName(d,officer.getId()).equals(“”);
boolean hasAppt=TCAUDatabaseUtil.hasAppt(d,officer.getId());
布尔值isReserveDay=(dayOfWeek==ConvertCaudeToCalendarDay(officer.getRd1())| | dayOfWeek==ConvertCaudeToCalendarDay(officer.getRd2());
布尔值isAssigned=!(TCAUDatabaseUtil.getAttendanceEvent(d,officer.getId()).equals(“”);
布尔值isDisabled=(hasAppt | | hasRun | | isReserveDay | | isAssigned);
htmlString+=“”+officer.getDisplayName()+“”;
}
返回htmlString;
}

我意识到要发布的代码太多了(因为在这里发布了太多的代码而被大骂),但我不知道我在哪里搞砸了。

我无法理解你试图解释的逻辑。没什么大不了的,问题归结为启用和禁用选项。我认为你的问题与格式有关

考虑以下几点:

<select>
  <option>1</option>
  <option disabled>2</option>
</select>
<select>
  <option>1</option>
  <option disabled="disabled">2</option>
</select>
因此,更有效的方法是:

<select>
  <option>1</option>
  <option disabled>2</option>
</select>
<select>
  <option>1</option>
  <option disabled="disabled">2</option>
</select>
JavaScript

function enableOptions(deputies) {
  var tmpArray = [];
  $.each(deputies, function(name, value) {
    tmpArray.push(value.id); //get option values that are to be enabled
    $("#selEditRunDeputies option[value='" + value.id + "']").prop("disabled", false); //set to enabled
  });
  $('#selEditRunDeputies').val(tmpArray);
}

希望这能有所帮助。

当解析
json
作为响应时,为什么您的
数据类型是:“html”
?另外,如果值为
null
或“”,那么AJAX调用会得到什么响应?@Twisty:该AJAX调用返回一个“run”对象。我认为“datatype:html”是一个复制粘贴错误,但它仍然有效,所以我没有注意到它。值不会为null或“”,除非有人手动进入数据库并开始删除内容。如果我理解操作,用户选择一个日期,这将反过来启用或禁用select元素中的许多选项,从而无法将它们分配给该日期。这是否沿着正确的路径工作?您在选择元素中也有
作为选项;因此,值
'
可以作为
id
传递给,除非我读错了。查看结果HTML或AJAX数据的示例将非常有帮助。@Twisty:Close…用户选择包含日期的跑步。然后通过ajax更新seleditrunreports。无法分配的个人选项已禁用,但需要启用分配的原始个人(由于分配给此“运行”而禁用),以便为同一运行重新选择一个或多个。这有意义吗?我得到了同样的结果。然而,我想确保我得到的是有效的id,所以我将alert(value.id)作为enableOptions中循环的第一行。令我惊讶的是,一切都如期进行。我解除了警报,它停止了工作。UpdateDisableList中的加载是否可以在…完成时完成?我怀疑是这样。可以看看
private String getOfficersWithDisables(HttpServletRequest request) throws ClassNotFoundException, SQLException, ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy");
    String htmlString = "<option value=''>&nbsp;</option>\n";
    List<Officer> officerList = TCAUDatabaseUtil.getOfficers();
    String dateString = request.getParameter("date");

    Date d = sdf.parse(dateString);
    Calendar cal = Calendar.getInstance();
    cal.setTime(d);
    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

    for (Officer officer : officerList) {
        boolean hasRun = !(TCAUDatabaseUtil.getRunName(d, officer.getId()).equals(""));
        boolean hasAppt = TCAUDatabaseUtil.hasAppt(d, officer.getId());
        boolean isReserveDay = (dayOfWeek == convertTCAUDayToCalendarDay(officer.getRd1()) || dayOfWeek == convertTCAUDayToCalendarDay(officer.getRd2()));
        boolean isAssigned = !(TCAUDatabaseUtil.getAttendanceEvent(d, officer.getId()).equals(""));
        boolean isDisabled = (hasAppt || hasRun || isReserveDay || isAssigned);

        htmlString += "<option value='" + officer.getId()+ "'" + (isDisabled?" disabled='disabled'":"") + ">" + officer.getDisplayName() + "</option>";
    }
    return htmlString;
}
function enableOptions(deputies) {
  var tmpArray = [];
  $.each(deputies, function(name, value) {
    tmpArray.push(value.id); //get option values that are to be enabled
    $("#selEditRunDeputies option[value='" + value.id + "']").prop("disabled", false); //set to enabled
  });
  $('#selEditRunDeputies').val(tmpArray);
}