0

チェックされたチェックボックスのリストを調べ、チェックされたボックスごとにビデオファイルをアップロードするJavaScript関数があります。アップロードプロセスを開始する前に、ビデオが小さい形式にトランスコードされていることを確認しようとしています。トランスコードプロセスを完了したアレイビデオのインデックスを追跡するために使用します。特定の動画のアップロードプロセスを開始する前に、counterが>=idであることを確認します。カウンターが低すぎる場合(ファイルがまだトランスコードされていない場合)、setTimout()を使用してuploadVideos関数を再度呼び出します。アラートポップアップが2回表示されないため、uploadVideos関数が再度呼び出されることはありません。

どうすればこれを機能させることができますか?

function uploadVideos(id, videos, selected, boxes) {

        var status = document.getElementById('currentUploadStatus');
        // need to deal with element an array
        var fields = videos[id].split(":", 2);
        var playlist = document.getElementById('playlist');
        var dataString = 'videoId='+ fields[0] + '&playlist=' + escape(playlist.value); 

// need to determine the maxTranscodedId
        var counter = document.getElementById('counter');
        alert('counter: ' + counter.innerHTML + " id: " + id);
        if (counter.innerHTML >= id) {

            id++;
            status.innerHTML = "<b class='status'>Uploading Bout #" + fields[1] + " (" + id + " of " + videos.length + ")</b>";

            $.ajax({  
                type: "GET",  
                url: "floUpload.php",  
                data: dataString,  
                success: function(txt) {
                    if (txt != 'Success') {
                        alert(':' + txt + ':');
                    }

                    if (id < videos.length) {
                        uploadVideos(id, videos, selected, boxes);

                    } else {
                        //re-enable the start button
                        var startButton = document.getElementById('start');
                        startButton.disabled = false;

                        status.innerHTML = "<b class='status'>Upload Complete</b>";
                        alert('Upload Completed');

                    }

                    //deselect the checkbox
                    if (boxes == 1 ) {
                        document.videos.video.checked = false;
                        document.videos.video.style.display = 'none';
                    } else {
                        document.videos.video[selected[id-1]].checked = false;
                        document.videos.video[selected[id-1]].style.display = 'none';
                    } 
                },
                async: true

            }); 



        } else {
            // timer call myself the same way I was called

            status.innerHTML = "<b class='status'>Upload waiting for trancode.</b>";
            var t=setTimeout("uploadVideos(id, videos, selected, boxes)",3000);
            //var t=setTimeout("alert('waking')",3000);
        }


}
4

1 に答える 1

3

これはJS初心者によくあるエラーです。setTimeout次の2種類の最初のパラメーターのいずれかを許可します。a)評価対象のJSコードをスコープ外に置くことができるテキスト(参照される変数が未定義の場合があります)。あまり役に立ちません。b)私が提案する修正などの機能は、次の行を置き換えることです。

setTimeout("uploadVideos(id, videos, selected, boxes)",3000);

と:

setTimeout(function(){
    uploadVideos(id, videos, selected, boxes);
},3000);

ご覧のとおり、関数呼び出しを別の無名関数内にラップしています。なんで?引数を渡す必要があるという理由だけで、そうでなければ、引数として渡すのではなく、単にそれを呼び出すことになります。

于 2012-05-02T03:09:05.090 に答える