2017-03-21 5 views
1

Wenn ich meine Tests ausführen lokal sie ohne Probleme passieren, aber wenn Tests auf dem Server gehe ich bekommen:MouseEventConstructor ist kein Konstruktor

TypeError: MouseEventConstructor is not a constructor (evaluating 'new MouseEvent('mousedown', 
EXEC : error : TypeError: MouseEventConstructor is not a constructor (evaluating 'new MouseEvent('mousedown', 
     { 
      'which': 1, 
      'view': window, 
      'bubbles': true, 
      'cancelable': true 
     })') 

für den Code:

HTMLElement.prototype.mouseDownLeftButton = function() { 
     var event = new MouseEvent('mousedown', 
     { 
      'which': 1, 
      'view': window, 
      'bubbles': true, 
      'cancelable': true 
     }); 
     this.dispatchEvent(event); 
    }; 

, die vollständig ist fein. Gibt es eine andere Möglichkeit, eine new MouseEvent zu erstellen?

+1

"Lokal", „o n den Server "- Bitte präzisieren Sie die verwendete Umgebung. Klingt so, als gäbe es einfach kein DOM. – Bergi

+0

@Bergi Bedeutet, dass wenn ich meine qUnit-Tests lokal ausführe, alles in Ordnung ist, aber wenn der Server sie als Teil von Continous Integeration ausführt, scheitern sie aus diesem Grund. Ich habe keine Kenntnisse über die Konfiguration des Servers selbst. Gibt es eine ältere Versionssyntax als 'new MouseEvent'? Über "no DOM" die RHS versagt nicht die LHS, also denke ich, dass dom intakt ist. Vielen Dank. – Yoda

Antwort

3

Wahrscheinlich verwendet Ihr lokaler Test infra einen echten Browser und auf dem Server PhantomJS.

Letztere noch nicht unterstützt neue Mouseevent: https://github.com/ariya/phantomjs/issues/11289

ich die folgenden Trick zu tun hatte, Tests zu machen passieren:

function createMouseEvent(typeArg: string): MouseEvent { 
     let event = document.createEvent('MouseEvent'); 
     event.initMouseEvent(typeArg, 
      undefined, 
      undefined, 
      undefined, 
      undefined, 
      undefined, 
      undefined, 
      undefined, 
      undefined, 
      undefined, 
      undefined, 
      undefined, 
      undefined, 
      undefined, 
      undefined); 
     return event; 
    } 
0

Es gibt eine polyfill von MDN, die das Problem lösen wird:

https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent#Polyfill

(function (window) { 
    try { 
     new MouseEvent('test'); 
     return false; // No need to polyfill 
    } catch (e) { 
     // Need to polyfill - fall through 
    } 

    // Polyfills DOM4 MouseEvent 

    var MouseEvent = function (eventType, params) { 
     params = params || { bubbles: false, cancelable: false }; 
     var mouseEvent = document.createEvent('MouseEvent'); 
     mouseEvent.initMouseEvent(eventType, params.bubbles, params.cancelable, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 

     return mouseEvent; 
    }; 

    MouseEvent.prototype = Event.prototype; 

    window.MouseEvent = MouseEvent; 
})(window);