IE中不会调用事件监听器 - 这里有什么问题?

时间:2013-11-15 03:05:12

标签: javascript internet-explorer dojo dgrid

技术背景

  • dojo 1.8.1
  • dgrid 0.3.4-pre
  • IE 10.0.9200

简短版:

我有一些dojo / on我正在听的事件(来自_WidgetBase),但它们有时会被调用,有时却不会被调用。 dgrid,分页和IE都在混合中。可能是什么问题?

详细信息:

我有一个dgrid网格这种奇怪的情况,尽管我已经尝试过,但我还是无法找出问题的实际原因。我将尽可能彻底,但随时可以要求更多信息。

我有一个使用分页的dgrid组件和一个组合框,它有一些我将过滤的值。这几乎是如何设置的(简化,实际代码引用其他模块,并且有更多模块化的东西):

// GridContainerWidget
var CustomGrid = declare([Grid, CompoundColumns, Selection, Keyboard, Pagination], {
    selectionMode: "single",
    rowsPerPage: 20
});
var grid = new CustomGrid({
    deselectOnRefresh: false
}, domContainer);

网格后来被绑定到JsonStore。

我的过滤器按以下方式设置:

// SearchBarWidget
// inside a custom widget, inheriting from _WidgetBase
var self = this;
var statusCombo = new ComboBox({
    store: new Memory(/* data and labels */),
    onChange: function (selection) {
        self.emit("status_changed", self.getSomeData());
    }
}, comboDomContainer);

回到封装过滤器和网格的小部件:

// GenericListWidget, contains both the SearchBarWidget and the GridContainerWidget
var self = this;
this._searchToolbar.on("status_changed", function (data) {
    // ... some "calibrations" ...
    self._grid.set("query", { newCriteria: "something" });
});

这是奇怪的地方:

  • 有时会在IE emit("status_changed")中调用,但不会调用回调on("status_changed")。其他一些时候,将调用emit并且也会调用回调(预期)。

    • 这与分页或网格刷新有某种关系,但我无法隔离重现问题的完全相同的步骤
    • 在深入研究这个问题时,我已经看到IE达到了执行以下任务的程度:( dojo / on,第314到322行)

      var nativeEvent = target.ownerDocument.createEvent("HTMLEvents");
      nativeEvent.initEvent(type /* "status_changed" */, !!event.bubbles /* true */, !!event.cancelable /* true */);
      // ... copies properties ...
      return target.dispatchEvent(nativeEvent) && nativeEvent; // returns true
      
    • 我确认永远不会调用挂起的remove()调用

    • 我确认每次触发和侦听事件的DOM元素实际上是相同的

我的问题是:我怎样才能找到潜在的问题,并确保每次调用我的on()回调?

1 个答案:

答案 0 :(得分:0)

您遇到了https://github.com/SitePen/dgrid/issues/379,它已在dgrid 0.3.7中修复。要解决与分页扩展中的分页控件相关的问题,您需要更新您的dgrid版本或自行应用更改集。

这是由于IE9和IE10中存在一个相当荒谬且烦人的IE漏洞(在IE11中修复):