Обвийте манипулатори на събития за изглед на опорната мрежа или манипулатори на събития на jQuery в блок try catch

Искам да направя глобална обработка на събития за докладване на грешки в JavaScript. Имаме минимизирани JS файлове в производство, така че се опитвам да го направя с помощта на sourcemap.

За съжаление неуловените грешки (докладвани от програмата за обработка на грешки от най-високо ниво на браузъра, window.onerror) в момента не включват номера на колони в който и да е текущ браузър. Спецификацията на HTML5 е актуализирана, за да изисква това, така че това може да се промени в близко бъдеще.
Източник: https://rollbar.com/docs/guides_sourcemaps/

Така че сега трябва да обвия събитията за изглед на опорната мрежа в блока try catch. Трябва да има общ начин за разширяване на Backbone.View. Вероятно някъде при delegateEvents функция.


person IsmailS    schedule 28.02.2014    source източник


Отговори (1)


Ето как най-накрая увих всички манипулатори на jQuery събития в блок try-catch.

// maintain a reference to the existing function
var oldOn = $.fn.on;
// ...before overwriting the jQuery extension point
$.fn.on = function(types, selector, data, fn, /*INTERNAL*/ one) {
  // parameter correction for backward compatibility copied from `on` function of jQuery JavaScript Library v1.9.0

  // Types can be a map of types/handlers
  if (typeof types === "object") {
    // ( types-Object, selector, data )
    if (typeof selector !== "string") {
      // ( types-Object, data )
      data = data || selector;
      selector = undefined;
    }
    for (type in types) {
      this.on(type, selector, data, types[type], one);
    }
    return this;
  }

  if (data == null && fn == null) {
    // ( types, fn )
    fn = selector;
    data = selector = undefined;
  } else if (fn == null) {
    if (typeof selector === "string") {
      // ( types, selector, fn )
      fn = data;
      data = undefined;
    } else {
      // ( types, data, fn )
      fn = data;
      data = selector;
      selector = undefined;
    }
  }
  if (fn === false) {
    fn = returnFalse;
  } else if (!fn) {
    return this;
  }
  // ENDS - parameter correction for backward compatibility copied from `on` function of jQuery JavaScript Library v1.9.0

  if (fn) {
    var origFn = fn;
    var wrappedFn = function() {
      try {
        origFn.apply(this, arguments);
      } catch (e) {
        //handle the error here.
      }
    };
    fn = wrappedFn;
  }
  return oldOn.apply(this, [types, selector, data, fn, /*INTERNAL*/ one]);
};


АКТУАЛИЗАЦИЯ:

Имаше грешка, че jQuery-UI droppable divs се залепваха за показалеца на мишката като лепило ;) вместо да бъдат изпуснати и беше проследено до този код като виновник.

Така че, моля, уверете се, че обвивате това разширение с условие if(!(arguments.length === 4 && arguments[1] === null)) {}

Като този.

// maintain a reference to the existing function
var oldOn = $.fn.on;
// ...before overwriting the jQuery extension point
$.fn.on = function(types, selector, data, fn, /*INTERNAL*/ one) {

    // We can ignore .bind() calls - they are passed from jquery-ui or other outdated components
    if(!(arguments.length === 4 && arguments[1] === null)) {
       //rest of the above code here.
    }
}
person IsmailS    schedule 28.02.2014