1

私はそのような配列を持っています:

var data = [
    {
        "title" : "Title 1",
        "slideText" : "",
        "startTime" : 0
    },
    {
        "title" : "Title 2",
        "slideText" : "",
        "startTime" : 60
    },
    {
        "title" : "Title 3",
        "slideText" : "",
        "startTime" : 120
    }
];

HTML5ビデオにseekedイベントリスナーがあります。ユーザーが検索するときは、ユーザーがどこにいるかを確認し、配列内のどのインデックスを使用しているかを判断する必要があります。たとえば、72秒をシークすると、array[1]になります。

今私はこれを持っています:

player.addEventListener("seeked", function(event)
{
    currentTime = player.currentTime;
    angular.forEach($scope.data, function(value, key)
    {
        if (currentTime >= $scope.data[key].startTime && currentTime <= $scope.data[key + 1].startTime)
        {
            $scope.$apply(function()
            {
                $scope.setActive(key);
            });
        }
    });
});

これはすべて、シークされた時間が配列の最後に到達して$scope.data[key + 1].time未定義になるまで機能します。これにどのようにアプローチすればよいですか?私の心は今軌道に乗っておらず、私はまだコーヒーを飲んでいません:|

編集

動作する新機能

player.addEventListener("seeked", function(event)
{
    currentTime = player.currentTime;
    for (var i = 0; i <= $scope.data.length; i++)
    {
        if ($scope.data[i + 1] != undefined)
        {
            if (currentTime < $scope.data[i + 1].startTime)
            {
                $scope.$apply(function()
                {
                    $scope.setActive(i);
                });
                break;
            }
        }
        else
        {
            $scope.$apply(function()
            {
                $scope.setActive($scope.data.length - 1);
            });
        }
    }
}); 
4

3 に答える 3

2

最初に配列要素の存在をテストします。失敗した場合、他のテストは無視されます。

if ($scope.data[key+1] && currentTime>=$scope.data[key].startTime && currentTime<=$scope.data[key+1].startTime)
于 2013-03-15T17:31:06.733 に答える
1

[key + 1]配列の長さを超えて要素にアクセスしようとしないことを確認するためのチェックが必要になります。

player.addEventListener("seeked", function(event)
{
    currentTime = player.currentTime;
    angular.forEach($scope.data, function(value, key)
    {
        if ( ($scope.data[key+1] != undefined) && currentTime < $scope.data[key+1].startTime)
        {
           // this is the one we are after
           return false; // exit foreach
        } else {
          // we are on the last one.
        }
    });
});
于 2013-03-15T17:48:39.040 に答える
0

これがうまくいった最終的な解決策でした

player.addEventListener("seeked", function(event)
{
    currentTime = player.currentTime;
    for (var i = 0; i <= $scope.data.length; i++)
    {
        if ($scope.data[i + 1] != undefined)
        {
            if (currentTime < $scope.data[i + 1].startTime)
            {
                $scope.$apply(function()
                {
                    $scope.setActive(i);
                });
                break;
            }
        }
        else
        {
            $scope.$apply(function()
            {
                $scope.setActive(i - 1);
            });
        }
    }
}); 
于 2013-03-15T19:43:15.500 に答える