2017-03-21 25 views
1

當我在本地執行我的測試中,他們通過,沒有任何問題,但是當測試繼續在服務器上,我得到:MouseEventConstructor是不是構造

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 
     })') 

的代碼:

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

這完全是精細。有沒有其他方法可以創建一個new MouseEvent

+1

「局部」,「O在服務器上「 - 請更具體地說明使用環境。聽起來就像沒有DOM。 – Bergi

+0

@Bergi意思是說,當我在本地運行我的qUnit測試時,一切都很好,但是當服務器將它們作爲Continous Integeration的一部分運行時,它們因此失敗。我不知道服務器本身的配置。是否有可用的新的MouseEvent語法?關於「沒有DOM」,RHS不是LHS,所以我認爲dom是完好的。謝謝。 – Yoda

回答

3

最有可能您的本地測試使用真正的瀏覽器,並在服務器上使用PhantomJS。

後者仍然不支持新的MouseEvent:https://github.com/ariya/phantomjs/issues/11289

我不得不這樣做下面的技巧,使測試通過:

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

有來自MDN一個填充工具,將解決這個問題:

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);