JavaScript setInterval()和setTimeout()冻结浏览器

时间:2016-08-04 16:50:37

标签: javascript php jquery html

我正在使用基于rrdtool的移动友好监控工具。

所有工作正常,但当我打开网页超过1小时冻结我的电脑时。

我使用此代码段来刷新图像。

void log_ssl_err(const char *mes)
{
    unsigned long err;
    char errstr[1000];

    while ((err = ERR_get_error())) {
        ERR_error_string(err, errstr);
        printf("%s: %s", mes, errstr);
    }
}

int encrypt_block(const unsigned char *IV, const unsigned char *key,
                  const unsigned char *src, unsigned int srclen,
                  unsigned char *dest, unsigned int *destlen)
{
    EVP_CIPHER_CTX ctx;
    const EVP_CIPHER *cipher = EVP_get_cipherbyname("AES-256-CBC");
    int mode, len;

    if (cipher == NULL) {
        printf("Invalid keytype");
        return 0;
    }
    mode = EVP_CIPHER_mode(cipher);
    EVP_CIPHER_CTX_init(&ctx);
    if (!EVP_EncryptInit_ex(&ctx, cipher, NULL, NULL, NULL)) {
        log_ssl_err("EncryptInit for cipher failed");
        return 0;
    }
    if (!EVP_EncryptInit_ex(&ctx, NULL, NULL, key, IV)) {
        log_ssl_err("EncryptInit for key/IV failed");
        return 0;
    }
    len = 0;
    if (!EVP_EncryptUpdate(&ctx, dest, &len, src, srclen)) {
        log_ssl_err("EncryptUpdate for data failed");
        EVP_CIPHER_CTX_cleanup(&ctx);
        return 0;
    }
    *destlen = len;
    if (!EVP_EncryptFinal_ex(&ctx, dest + *destlen, &len)) {
        log_ssl_err("EncryptFinal failed");
        EVP_CIPHER_CTX_cleanup(&ctx);
        return 0;
    }
    *destlen += len;
    EVP_CIPHER_CTX_cleanup(&ctx);

    return 1;
}

int decrypt_block(const unsigned char *IV, const unsigned char *key,
                  unsigned char *src, unsigned int srclen,
                  unsigned char *dest, unsigned int *destlen)
{
    EVP_CIPHER_CTX ctx;
    const EVP_CIPHER *cipher = EVP_get_cipherbyname("AES-256-CBC");
    int mode, len;

    if (cipher == NULL) {
        printf("Invalid keytype");
        return 0;
    }
    mode = EVP_CIPHER_mode(cipher);
    EVP_CIPHER_CTX_init(&ctx);
    if (!EVP_DecryptInit_ex(&ctx, cipher, NULL, NULL, NULL)) {
        log_ssl_err("DecryptInit for cipher failed");
        return 0;
    }
    if (!EVP_DecryptUpdate(&ctx, dest, &len, src, srclen)) {
        log_ssl_err("DecryptUpdate for data failed");
        EVP_CIPHER_CTX_cleanup(&ctx);
        return 0;
    }
    *destlen = len;
    if (!EVP_DecryptFinal_ex(&ctx, dest + *destlen, &len)) {
        log_ssl_err("DecryptFinal failed");
        EVP_CIPHER_CTX_cleanup(&ctx);
        return 0;
    }
    *destlen += len;
    EVP_CIPHER_CTX_cleanup(&ctx);

    return 1;
}

我将这个php文件包含在我有图像的页面中,我想要刷新。

我尝试了2个选项,但正如我所说,冻结我的浏览器。

任何人都知道我该怎么办?因为我只需要刷新图像,所以我不想重写整个页面。

修改

这是用于在数据库中打印所有图像的PHP脚本。

<?php

if(!isset($includeCheck))
{
        exit ("No tienes permisos para ver directamente el archivo");
}

//echo "
//<script language='JavaScript'>
//        function refreshIt(element) {
//                setTimeout(function() {
//                element.src = element.src.split('?')[0] + '?' + new Date().getTime();
//                refreshIt(element);
//              }, 50000); 
//      }
//</script>";

echo "
<script language='JavaScript'>
        function refreshIt(element){
                setInterval(function() {
                element.src = element.src.split('?')[0] + '?' + new Date().getTime();
                }, 50000);
        }
</script>";


?>

1 个答案:

答案 0 :(得分:2)

您的图片有onload处理程序:

refreshIt(this)

...并且每隔50秒设置一个间隔(意味着它会重复)。该间隔的回调设置图像的src,这意味着onload将再次触发,并且您将再次执行设置间隔。因此,每次加载新版本的图像时,都会添加另一个间隔,因此最终会发生大量重复的回调。

您可能希望使用setTimeout,或致电refreshIt(this)一次,而不是每onload次。