JS在Firefox中造成无限循环

时间:2011-02-21 10:34:41

标签: javascript jquery firefox

我页面上的脚本在FireFox中导致无限循环。

这是Javascript:

var Cacaoweb = {
version: "2.11",
timerTasksInterval: 0.5,
lasttimeclientrunning: null,
isclientrunningHysteresisInterval: 30000,
timeoutClientAlive: 2000,
timeStart: (new Date()).getTime(),
status: 'Unknown',
myFunc: null,
videowidth: 640,
videoheight: 360,
autoplay: true,


/**
 * Lance le téléchargement de cacaoweb en fonction de la plateforme de l'utilisateur
 */
download: function() {
    var platform = "Windows";

    if ( navigator.platform != null ) {
        if ( navigator.platform.indexOf( "Win32" ) != -1 ) {
            platform = "Windows";
        } else if ( navigator.platform.indexOf( "Win64" ) != -1 ) {
            platform = "Windows";
        } else if ( navigator.platform.indexOf( "Win" ) != -1 ) {
            platform = "Windows";
        } else if ( navigator.platform.indexOf( "Linux" ) != -1 ) {
            platform = "Linux";
        } else if ( navigator.platform.indexOf( "Mac" ) != -1 && navigator.platform.indexOf( "Intel" ) != -1 ) {
            platform = "Mac OSX Intel";
        } else if ( navigator.platform.indexOf( "Mac" ) != -1 && navigator.platform.indexOf( "PPC" ) != -1 ) {
            platform = "Mac OSX PPC";
        } else if ( navigator.platform.indexOf( "Mac" ) != -1 ) {
            platform = "Mac OSX" ;
        } else
            platform = navigator.platform;
    }

    var uri;

    if (platform == "Windows"){
        uri = "http://www.sourceforge.net/projects/cacaoweb/files/cacaoweb.exe/download";
    } else if (platform == "Mac OSX" || platform == "Mac OSX Intel") {
        uri = "http://www.sourceforge.net/projects/cacaoweb/files/cacaoweb.dmg/download";
    } else if (platform == "Linux") {
        uri = "http://www.sourceforge.net/projects/cacaoweb/files/cacaoweb.linux/download";
    } else {
        alert("cacaoweb is not available for your platform");
    }

    setTimeout(function() { window.location.href = uri; },  0 ); // timeout could be 500 in case of direct download to make the user at ease
},

/**
 * Inclut le script 'filename' en utilisant l'id 'scriptname'
 * Supprime les précédents scripts insérés avec la même id 'scriptname'
 * 
 * @param   filename        Nom du fichier JS à inclure
 * @param   scriptname      Id du script inclus
 */
includeScript: function(filename, scriptname){
    var htmlDoc = document.getElementsByTagName('body').item(0);
    var scriptblock = document.getElementById(scriptname); 
    if (scriptblock) {
        htmlDoc.removeChild(scriptblock);
    }
    var script = document.createElement("script");

    script.id = scriptname;
    script.src = filename;
    script.language = 'javascript';
    script.type = 'text/javascript';
    htmlDoc.appendChild(script);
},

/**
 * Permet de spécifier une fonction qui sera appelée régulièrement ou lorsque le status de cacaoweb change (On, Off ou Unknown)
 * La fonction doit prendre un argument (qui sera le statut de cacaoweb)
 * ATTENTION: ne marche qu'avec une fonction maximum
 */
subscribeStatusChange: function(myFunc) {
    this.myFunc = myFunc;
},
unsubscribeStatusChange: function() {
    this.myFunc = null;
},

/**
 * Met à jour le statut de cacaoweb.
 * On       si cacaoweb tourne sur la machine
 * Off      si cacaoweb ne tourne pas sur la machine
 * Unknown  si le statut n'a pas encore été initialisé ou s'il n'a plus été mis à jour depuis un certain délai
 */
updateStatusVariable: function() {
    if ((new Date()).getTime() - this.lasttimeclientrunning < this.timeoutClientAlive + this.isclientrunningHysteresisInterval) {
        this.status = 'On';
    } else if ((new Date()).getTime() - this.timeStart < 2000) {
        this.status = 'Unknown';
    } else {
        this.status = 'Off';
    }
},

/**
 * Toutes les actions à effectuer à chaque fois qu'il peut y avoir un changement dans le statut
 */
updateActions: function() {
    this.updateStatusVariable();

    if (this.myFunc != null) {
        this.myFunc(this.status);
    }
},

/**
 * Vérifie et met à jour à jour le statut de cacaoweb
 */
checkStatus: function() {
    if (this.lasttimeclientrunning == null || (new Date()).getTime() - this.lasttimeclientrunning > this.isclientrunningHysteresisInterval) {
        var i = Math.floor(Math.random() * 1000000);
        this.lasttimeclientrunning = 0;
        this.includeScript('http://127.0.0.1:4001/isrunning?unique=' + i, 'isrunningscript');
    }
    this.updateActions();
},

/**
 * Fonction appelée en callback de checkInstalled (par le client cacaoweb s'il est en route)
 */
callbackIsRunning: function() {
    Cacaoweb.lasttimeclientrunning = (new Date()).getTime();
    this.updateActions();
},


playvideo: function(o, width, height) {
    var link = o.getAttribute("link");
    var player = '<object width="' + width + '" height="' + height + '">';
    player += '<param name="allowFullScreen" value="true" />';
    player += '<param name="flashvars" value="file=' + link + '" />';
    player += '<param name="movie" value="http://127.0.0.1:4001/player.swf" />';
    player += '<embed src="http://127.0.0.1:4001/player.swf" ';
    player += 'flashvars="file=' + link + '" ';
    player += 'width="' + width + '" height="' + height + '" allowFullScreen="true" />';
    player += '</object>';
    o.innerHTML = player;
},

insertAllVideos: function() {
    var all = document.getElementsByTagName("cacao");
    for (var i = 0; i < all.length; i++) {
        this.playvideo(all[i], this.videowidth, this.videoheight);
    }
},

insertDownloadPlugin: function() {
    var all = document.getElementsByTagName("cacao");
    for (var i = 0; i < all.length; i++) {
        all[i].innerHTML = '<a href="javascript:Cacaoweb.download()"><img src="http://streaming.fortechlovers.com/wp-content/uploads/2011/02/5.png" /></a>';
    }
},

/**
 * On joue les vidéos de la page en attendant 2s pour voir si cacaoweb est en route, sinon on affiche une image de téléchargement
 */
checkandplay: function() {
    if (this.status == 'On') {
        this.insertAllVideos();
    } else {
        var timeout = setTimeout("Cacaoweb.insertDownloadPlugin()", this.timeoutClientAlive);
        this.subscribeStatusChange(function (status) { 
                                    if (status == "On") {
                                        clearTimeout(timeout);
                                        this.unsubscribeStatusChange();
                                        this.insertAllVideos();
                                    }
                                });
    }
}}

setInterval(function() { Cacaoweb.checkStatus(); }, Cacaoweb.timerTasksInterval * 1000);

IE或Chrome中没有问题。但由于某种原因,函数在FF中无限循环。因此函数中的某些东西导致它在Firefox中循环。

我不知道是什么?

这是the page

1 个答案:

答案 0 :(得分:1)

我没有看到无限循环(如果有的话,firefox会提示我并提供停止脚本的选项)。

http://127.0.0.1:4001/isrunning有很多无用的(?)请求(如jomanlk所说)。
你应该解决这个问题,我确信我的本地主机没有任何答案,我不知道你在那里期待什么。