firefox提供XMLHttpRequest" null"访问Vimeo API时出错,但Youtube或其他浏览器没有错误

时间:2014-04-21 19:37:54

标签: javascript ajax firefox youtube

我试着在google上查找这个,以及其他类似的问题,但我仍然无法弄清楚这一点。我从代理请求模型(AJAX请求到我的服务器上的脚本然后从外部服务器发出请求)转移到完全基于浏览器的解决方案,以从Youtube和Vimeo API中提取视频数据。这与Youtube完美配合,但Vimeo似乎在firefox中触发异常(但在konqueror - webkit中工作正常)。 Firefox是17.0.1。以下是相关的代码段:

function getAsync(url2)
    {
    console.log('async url: ' + url2);
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        }

    if (req != undefined) {
        req.onreadystatechange = function() {console.log("statechanged ");};            
        console.log('3a');
        try {
           console.log(" try... ");
           req.open("GET", url2, false); // 3rd param is whether "async"
        } catch (err) {
           console.log('err name=['+err.name + ']: err.message=[' + err.message + '] (line ' + err.lineNumber + ')');
        }
        console.log('3b');
        try {
           console.log(' about to send... ');
           req.send("");
        } catch (err) {
           console.log('err name=['+err.name + ']: err.message=[' + err.message + '] (line ' + err.lineNumber + ')');
        }

        console.log('4');
        if (req.readyState == 4) { // only if req is "loaded"
            console.log('5');
            if (req.status == 200) 
                { // only if "OK"
                console.log('6a');
                return req.responseText ;
                }
            else
                {
                console.log('6b');
                return "xml error: " + req.status +" "+req.statusText;
                }
            }
        }
    }  

这会为vimeo记录以下内容:

  

async url:http://vimeo.com/api/v2/video/56945114.json
  3A
   尝试...
  http://vimeo.com/api/v2/video/56945114.json
  err name = [null]:err.message = [](第204行)
  3B
   即将发送...
  err name = [NS_ERROR_NOT_INITIALIZED]:err.message = [组件未初始化](第211行)
  4

(第204行对应req.open("GET", url2, false);,第211行对应req.send("");

以下是youtube:

  

async url:http://gdata.youtube.com/feeds/api/videos/rkbzZakcVrg?v=2&alt=json
  3A
    尝试...
  http://gdata.youtube.com/feeds/api/videos/rkbzZakcVrg?v=2&alt=json
   statechanged
   3B
    即将发送...
   statechanged
   4
   5
   6a

我做错了什么?或者,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我只是偶然发现导致此问题的问题,我的调试似乎并没有显示出来。如果有人遇到这个问题,这就解决了它:

似乎我的JavaScript阻止程序(NoScript)阻止了vimeo.com域,由于某种原因,该域必须成功执行XMLHttpRequest。一旦我注意到它说有被阻止的域(因为我自己的服务器没有被阻止,并且它没有使用外部script,奇怪的是它会这样说)我启用了vimeo.com,再次尝试,它工作得很好。所以我想这可能源于XMLHttpRequest的实现方式,可能试图在其他域上运行http请求作为javascript调用或类似的东西(也许你们其中一个知识渊博的人可以为我们澄清这一点)。但无论如何,我的问题以这种方式得到了解决。希望能帮助其他任何沮丧的google人员。