IE8 - 复选框不会在首次点击时更改状态

时间:2018-05-10 02:23:44

标签: javascript jquery checkbox sharepoint-2010 ie8-compatibility-mode

我已经搜索了一下,并且无法找到与我的具体问题相关的内容,所以如果在其他地方已经回答了这个问题,请道歉。

我正在使用带有javascript和jQuery(1.7.2)的内容编辑器webpart来创建一个sharepoint 2010网站,以构建一个可以使用多个复选框进行过滤的表格显示。该表汇总了我在页面加载时查询的多个后端列表中的数据,并将其存储到数据结构中以构建表。浏览器IE11在IE8强制仿真模式下运行

我遇到了一个问题,虽然有些复选框在第一次点击时没有改变它们的状态,但点击事件处理程序仍然会触发,方法仍然可以正确地确定当前状态。

代码看起来像下面的内容(由于实际代码非常冗长而被释义)

function filterActivity() {
  $('#displaytable').empty();

  //returns an array of keys sorted by the project's name
  //so that they appear in sorted order in display table
  //the key is sharepoint's internal listItem ID
  //but each project has an activity ID that uniquely identifies it
  var projectItems = sortByActivityName('projectDB');
  for (var i = 0; i < projectItems.length; i++) {
    var projectKey = projectItems[i];
    var projectItem = Lists['ProjectDB'][projectKey]; //get corresponding info from stored data

    var scheduleItems = sortByActivityName('scheduleDB');
    var endDate = '';
    for (var j = 0; j < scheduleItems.length; j++) {
      var scheduleKey = scheduleItems[j];
      var scheduleItem = Lists['ScheduleDB'][scheduleKey];

      if (projectItem.activity_ID == scheduleItem.activity_ID) {
        //get related records to the current project
        endDate = scheduleItem.endDate;
      }
    }
    //similar loops to get related records from other list

    var rowstring = "<tr>";
    if (projectItem.status == "Open" && $('#open_check').is(":checked")) {
      //if the project is open and the filter for showing open projects is checked, build the table row and append it
      rowstring += "<td>" + projectItem.displayName + "</td>";
      rowstring += "<td>" + endDate + "</td>";
      rowstring += "</tr>";
      $('#displaytable').append(rowstring);
    }
  }
}
<input type="checkbox" id="open_check" onclick="filterActivity()" value="Open" checked>
<table id="displaytable">
  <thead>
    <tr>
      <th>Name</th>
      <th>Project End Date</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>

当我运行页面时,在加载时它会正确地将打开的项目附加到表中。但是当我点击“打开”复选框取消选中它并隐藏打开的项目时,复选框会触发onclick事件并运行,但状态不会改变,例如

  1. 页面加载,选中Open Checkbox,仅打开附加的项目
  2. 点击打开复选框
  3. 打开复选框保持选中状态,点击处理程序触发并filterActivity()运行
  4. $("#open_check").is(":checked")返回true,只有打开的项目再次附加到表中
  5. 点击打开复选框
  6. 打开复选框变为未选中状态
  7. 从这一点开始按预期正确行为
  8. 这似乎只影响专门运行filterActivity()方法的复选框,页面上的其他复选框工作正常。它也是不一致的,因为在极少数情况下,复选框会在第一次单击时正确更改状态。

    据我所知,这是某种竞争条件,但我不确定是什么导致它 - 是否存在IE8如何管理点击处理程序的阻塞行为?我不认为这是一个jQuery问题,因为我没有使用jQuery设置复选框,jQuery确定的状态似乎与显示的一致。

    因为这是遗留系统,遗憾的是我没有选择使用更新的浏览器或更新版本的jQuery。

1 个答案:

答案 0 :(得分:0)

我很傻,错过了森林的树木

在页面的其他地方我动态创建一些复选框并使用jQuery绑定click处理程序,但是我使用了选择器$('input:checkbox'),它错误地将另一个单击处理程序绑定到受影响的复选框。

更改选择器以排除非编程生成的复选框解决了问题