为什么api必须与每个darn浏览器不同?

时间:2016-03-27 22:16:12

标签: api browser

例如,像RTCPeerConnection。这个api在firefox,chrome中是不同的。

此代码段只是为了修复该api的差异。它解决了开发人员在尝试创建适用于所有主流现代浏览器的网站时所遇到的烦恼:...... 我非常感谢创造这个的人。这是一个很好的解决方案。

var RTCPeerConnection = null;
var getUserMedia = null;
var attachMediaStream = null;
var reattachMediaStream = null;
var webrtcDetectedBrowser = null;
function trace(text) {
    if (text[text.length - 1] == '\\') {
        text = text.substring(0, text.length - 1);
    }
    console.log((performance.now() / 1000).toFixed(3) + ": " + text);
}

if (navigator.mozGetUserMedia) {
    console.log("This appears to be Firefox");
    webrtcDetectedBrowser = "firefox";

    RTCPeerConnection = mozRTCPeerConnection;
    RTCSessionDescription = mozRTCSessionDescription;
    RTCIceCandidate = mozRTCIceCandidate;
    getUserMedia = navigator.mozGetUserMedia.bind(navigator);
    attachMediaStream = function (element, stream) {
        console.log("Attaching media stream");
        element.mozSrcObject = stream;
        element.play();
    };
    reattachMediaStream = function (to, from) {
        console.log("Reattaching media stream");
        to.mozSrcObject = from.mozSrcObject;
        to.play();
    };
    MediaStream.prototype.getVideoTracks = function () {
        return [];
    };
    MediaStream.prototype.getAudioTracks = function () {
        return [];
    };
} else if (navigator.webkitGetUserMedia) {
    console.log("This appears to be Chrome");
    webrtcDetectedBrowser = "chrome";
    RTCPeerConnection = webkitRTCPeerConnection;
    getUserMedia = navigator.webkitGetUserMedia.bind(navigator);

    attachMediaStream = function (element, stream) {
        if (typeof element.srcObject !== 'undefined') {
            element.srcObject = stream;
        } else
        {
            if (typeof element.mozSrcObject !== 'undefined') {
                element.mozSrcObject = stream;
            } else
            {
                if (typeof element.src !== 'undefined') {
                    element.src = URL.createObjectURL(stream);
                } else {
                    console.log('Error attaching stream to element.');
                }
            }
        }
    };
    reattachMediaStream = function (to, from) {
        to.src = from.src;
    };
    if (!webkitMediaStream.prototype.getVideoTracks) {
        webkitMediaStream.prototype.getVideoTracks = function () {
            return this.videoTracks;
        };
        webkitMediaStream.prototype.getAudioTracks = function () {
            return this.audioTracks;
        };
    }
    if (!webkitRTCPeerConnection.prototype.getLocalStreams) {
        webkitRTCPeerConnection.prototype.getLocalStreams = function () {
            return this.localStreams;
        };
        webkitRTCPeerConnection.prototype.getRemoteStreams = function () {
            return this.remoteStreams;
        };
    }
} else {
    console.log("Browser does not appear to be WebRTC-capable");
}

为什么这些网络浏览器的创建者必须如此尴尬?我真的不明白吗?哈哈?

2 个答案:

答案 0 :(得分:0)

这总结在MDN documentation

  

这是一项实验技术

     

由于此技术的规范尚未稳定,请检查兼容性表以了解各种浏览器的用法。另请注意,随着规范的更改,实验技术的语法和行为可能会在未来版本的浏览器中发生变化。

the specification

  

作为编辑草案的出版并不意味着W3C会员资格的认可。这是一份草案文件,可能随时被其他文件更新,替换或废弃。除了正在进行的工作之外,引用此文档是不恰当的。

简而言之:您生活在最前沿并实施仍在设计中的规格。完成的规范倾向于在浏览器中获得稳定,一致的实现。

答案 1 :(得分:0)

WebRTC规范近年来发生了很大的变化,有些浏览器仍然不足以支持它们修改PeerConnection或getUserMedia API的版本(Mozilla最近有)。

您拥有的代码段来自名为adapter.js的项目。您可能希望使用该版本而不是过时版本。