我写了一个用户脚本,在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);
}