'Uncaught TypeError: Illegal invocation' when trying to support cross browser prefixes in clojurescript

'Uncaught TypeError: Illegal invocation' when trying to support cross browser prefixes in clojurescript

getUserMedia 有许多前缀在许多浏览器中仍然是必需的。我试图通过将所有前缀放在 getUserMedia.

中来隐藏这些前缀的使用
(def getUserMedia
  (or js/navigator.getUserMedia
      js/navigator.webkitGetUserMedia
      js/navigator.mozGetUserMedia
      js/navigator.msGetUserMedia))

(defn start-fx [app]
  (if getUserMedia
    (getUserMedia 
     ;; WORKS IF I REPLACE THE ABOVE getUserMedia WITH
     ;; js/navigator.webkitGetUserMedia USING CHROME BROWSER
     #js {:video true :audio true}
     #(om/update! app :record-src (.createObjectURL js/window.URL %))
     #(throw %))
    (js/alert "This browser does not support video recording!")))

然后当我尝试从 start-fx 调用它时,我在调用 getUserMedia 时得到一个 Uncaught TypeError: Illegal invocation。我应该怎么做才能让我的代码跨浏览器兼容?

getUserMedia 必须绑定到 navigator 对象。等效的 JavaScript 是这样的:

var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
                   navigator.mozGetUserMedia || msGetUserMedia;
if (getUserMedia) {
  getUserMedia = getUserMedia.bind(navigator);
}

为了得到答案,我发布了我对问题的修复。呃,一定有更好的解决方案吗?

(def getUserMedia
  (or js/navigator.getUserMedia
      js/navigator.webkitGetUserMedia
      js/navigator.mozGetUserMedia
      js/navigator.msGetUserMedia))

(defn start-fx [app]
  (if getUserMedia
    (let [[c s f] [#js {:video true :audio true}
                   #(om/update! app 
                               :record-src 
                               (.createObjectURL js/window.URL %))
                   #(throw %)]]
      (getUserMedia c s f))
    (js/alert "This browser does not support video recording!")))