在Firefox中未定义Javascript事件

时间:2014-12-04 16:50:41

标签: javascript jquery

以前曾经问过这个问题,但是我仍然在努力解决如何解决我的错误问题。我是学习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");



});

1 个答案:

答案 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需要稍微严格的方法。