我的JSONP调用适用于Chrome的Tampermonkey,但不适用于Firefox的Greasemonkey

时间:2014-11-10 09:57:58

标签: jquery firefox jsonp greasemonkey tampermonkey

我写了一个用户脚本,在Forvo.com上调用API,并在第三方页面Memrise.com上显示结果。访问Forvo的API需要私钥;我在测试时使用它,但是我已经在公开的代码中删除了它。该脚本在Chrome中完美运行,但在Firefox中无法运行。

下面的代码是this user script的重要部分,添加了一些额外的调试注释。在Firefox中运行时,日志显示回调函数存在,发送了ajax调用,成功事件是触发,但“回调函数已触发”永远不会出现,并且回调函数中的代码都没有执行。

我做错了什么? jsonp代码是以某种方式在不同的上下文中运行的吗?

document.addEventListener("DOMNodeInserted", function(e) {

    if (e.relatedNode.className != "level-things table") return false;

    $(e.relatedNode).find('th').eq(4).after('<th class="column"><span class="txt">Other Audio</span></th>');
    $(e.relatedNode).find('tr').each(function(){
        var word = $(this).find('td').eq(1).find('.text').text();
        $(this).find('td').eq(4).after('<td><div class="btn-group forvo-check" data-word="' + word + '"><button class="btn btn-mini dropdown-toggle" data-toggle="dropdown" style="overflow:hidden;">Check Forvo<i class="ico ico-s ico-arr-down"></i></button><div class="dropdown-menu audios"><img src="https://d107cgb5lgj7br.cloudfront.net/img/icons/loader@2x.gif" style="width:30px;" /></div></div></td>');
    });

    $('.forvo-check .dropdown-menu').css({'min-width':'30px', padding:'5px'});

    $('.forvo-check').click(function(){
        var languageCode = forvoCodes[ $('.add-level .dropdown-menu a:first').text().trim() ];
        //console.log(languageCode);

        var word = encodeURI( $(this).attr("data-word") );

        console.log("Confirming callback function");
        console.log(showForvoLinks);

        console.log("Sending ajax");
        $.ajax({
            url: "http://apifree.forvo.com/action/word-pronunciations/format/json/word/" + word + "/language/" + languageCode + "/order/rate-desc/limit/4/key/" + forvoApiKey + "/",
            jsonpCallback: "showForvoLinks",
            dataType: "jsonp",
            type: "jsonp",
            cache: false,
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                // typically only one of textStatus or errorThrown
                // will have info
                console.log("Error occured textStatus=" + textStatus + " errorThrown=" + errorThrown);
            },
            success: function(data) {
                console.log('API response successful');    
            }
        });
    });

}, true);  //end of addEventListener




showForvoLinks = function(data){
    console.log("callback function triggered")
    popupHTML = '';
    for (i in data.items) popupHTML += '<p><a class="audio-player audio-player-hover" href="' + decodeURI(data.items[i].pathmp3) + '"></a></p>';
    if (popupHTML=='') popupHTML = '<a href="http://www.forvo.com/word/' + encodeURI( $('.forvo-check.open').attr("data-word") ) + '/" target="_blank">nothing</a>';
    $('.forvo-check.open .dropdown-menu').html(popupHTML);
}

0 个答案:

没有答案