以前曾经问过这个问题,但是我仍然在努力解决如何解决我的错误问题。我是学习Javascript / jQuery的新手。 Firefox给出错误" ReferenceError:getFirstArr未定义"。我有一个简化的脚本,说明我在这里尝试做的事情JSFiddle(为了使其正常工作,请在月份按钮之前先选择年份按钮)。
罪魁祸首似乎是getFirstArr(videos [i])第28行。我真的不知道该尝试什么,因为我的代码似乎是正确的。它适用于Safari,Chrome和IE。 Firefox是奇怪的人。这是问题所在的点击事件的片段。
$('.campbutton').on('click', function () {
camp = $(this).attr('id');
$('.campbutton').removeClass('green');
$(this).addClass('green');
$('#searcharea').html('<table></table>');
var campyear = camp + year;
var count = 1;
var noResultCount = 0;
for (i = 0; i < videos.length; i++) {
for (j = 0; j < 5; j++) {
getFirstArr(videos[i]); // Firefox doesn't like this line
function getFirstArr(video) { // prints the the array where a match is found
JSFiddle将拥有整个代码。所以我的问题是,为什么Firefox不接受函数调用,需要更改什么?任何帮助或提示都很受欢迎(顺便说一句,我还在努力获取正确的表格标签以正确格式化输出,以便视频不会叠加在自己的顶部)。
编辑:Firefox的具体问题是点击营地按钮时,div中没有视频加载。其他按钮事件很好。
以下是有问题的整个代码:
var videos = [ ["string1A", "string1B", "string1C"], ["string2A", "String2B", String2C"] ];
var camp = "";
var year = "";
$('#searcharea').html('select a year button first');
$('.yearbutton').on('click', function () {
year = $(this).attr('id');
$('.yearbutton').removeClass('green');
$(this).addClass('green');
});
$('.campbutton').on('click', function () {
camp = $(this).attr('id');
$('.campbutton').removeClass('green');
$(this).addClass('green');
$('#searcharea').html('<table></table>');
var campyear = camp + year;
var count = 1;
var noResultCount = 0;
for (i = 0; i < videos.length; i++) {
for (j = 0; j < 5; j++) {
getFirstArr(videos[i]);
function getFirstArr(video) {
if (campyear === video[j]) {
var pos = video.indexOf(video[j]);
$('#searcharea').append('<tr><td>' + video[(pos - pos)] + '</td>' + '<td>' + 'Composer: ' + video[(pos -pos) + 1] + '<br>' + 'Player: ' + video[(pos - pos) + 2] + '<br>' + 'Piece: ' + video[(pos - pos) + 3] + '</td>');
}
else noResultCount++;
if (campyear === video[j] && count % 3 === 0 && j === 4)
$('#searcharea').append('</tr><tr>');
if (i === videos.lenght && j === 4)
$('#searcharea').append('</table>');
}
}
count++;
}
if (noResultCount === videos.length * 5)
$('#searcharea').html("No results found");
});
答案 0 :(得分:1)
http://jsfiddle.net/3ncc5xdx/123/
在这里,我已经将你的功能移到了循环之外,我认为它有效,除非我误解了问题所在:
$('.campbutton').on('click', function () {
camp = $(this).attr('id');
$('.campbutton').removeClass('green');
$(this).addClass('green');
$('#searcharea').html('<table></table>');
var campyear = camp + year;
var count = 1;
var noResultCount = 0;
function getFirstArr(video) {
if (campyear === video[j]) {
var pos = video.indexOf(video[j]);
$('#searcharea').append('<tr><td>' + video[(pos - pos)] + '</td>' + '<td>' + 'Composer: ' + video[(pos -pos) + 1] + '<br>' + 'Player: ' + video[(pos - pos) + 2] + '<br>' + 'Piece: ' + video[(pos - pos) + 3] + '</td>');
}
else noResultCount++;
if (campyear === video[j] && count % 3 === 0 && j === 4)
$('#searcharea').append('</tr><tr>');
if (i === videos.lenght && j === 4)
$('#searcharea').append('</table>');
}
for (i = 0; i < videos.length; i++) {
for (j = 0; j < 5; j++) {
getFirstArr(videos[i]);
}
count++;
}
if (noResultCount === videos.length * 5)
$('#searcharea').html("No results found");
});
因此它起作用的原因是该函数现在在使用一次之前被声明。此外,它现在只在你的循环中声明一次而不是一次又一次。它可能适用于Chrome,因为Chrome非常聪明并且能够理解我们所暗示的内容 - 但Firefox需要稍微严格的方法。