如何在onclick函数中使用javascript淡出多个元素


how to fadeout multiple elements with javascript in onclick function

SOF用户:今天我有另一个挑战给你:

我有一段代码,它是jqueryUploader的一部分。上传的每个文件都使用这个代码,如果文件上传正常或不正常,我会创建正确的答案。

当一个文件上传后,我放了一个删除按钮(不能在这里使用表单标记)。我想添加淡出效果。

编辑:现在所有有趣的代码。

<script>
    var conexion;
    var numarch = 0;
    var idactual = 0;
    function crearXMLHttpRequest(){
        var xmlHttp=null;
        if (window.ActiveXObject) 
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        else
            if (window.XMLHttpRequest) 
                xmlHttp = new XMLHttpRequest();
        return xmlHttp;
    }
    function borrar_archivo(iddiv, ruta, header){
        conexion=crearXMLHttpRequest();
        idactual = iddiv;
        conexion.onreadystatechange = procesarEventos;
        conexion.open(header, ruta, true);
        conexion.send(null);
    }
    function procesarEventos(){
        var detalles = document.getElementById(idactual);
        if(conexion.readyState == 4){
            var resultado = conexion.responseText;
            if(resultado.indexOf("true")!=-1){
                nomArchivo = conexion.responseText.split(":",1);
                nombreArchivo = nomArchivo[0].substring(1);
                detalles.innerHTML = "<p style='float: left; clear:left; color: #66CC00; font-size:12px;'>"+nombreArchivo+" ha sido borrado.";
            }
            else{
                detalles.innerHTML = "<p style='float: left; clear:left; font-size:12px;' class='text-danger'>Ha habido un error al borrar el archivo.</p>";
            }
        }
        else{
            detalles.innerHTML = "<p style='float: left; clear:left; font-size:12px;'>Cargando...</p>";
        }
        setInterval(function(){
             $("#"+idactual).fadeOut(1000);
        },1500);
    }
    $(function(){
        $('#fileupload').fileupload({
            dataType: 'json',
            done: function (e, data){
                $.each(data.result.files, function (index, file) {
                    numarch++;
                    $('<div id="archivo_'+numarch+'" />').appendTo('#files');
                    if (file.error){
                        $('<img style="width: 16px; float: left; clear:left; margin-right: 10px;" src="img/x.png" title="Error" alt="Error"/>').appendTo('#archivo_'+numarch);
                        $('<p style="float: left; font-size:12px;" class="text-danger"/>').text(file.error).appendTo('#archivo_'+numarch);
                    }
                    else{
                        var newFileDiv = $("<img style='width: 16px; float: left;  clear:left; margin-right: 10px;' src='img/v.png' title='Archivo subido OK' alt='Archivo subido OK'/><p style='float: left; color: #66CC00; font-size:12px;'>"+file.name+"</p><div style='float :left; height: 5px;margin-left: 25px;' class='btn btn-danger delete' onclick=borrar_archivo('archivo_"+numarch+"','"+file.deleteUrl+"','"+file.deleteType+"')><i style='top: -5px;left: -5px;' class='glyphicon glyphicon-trash'></i><span style='top: -6px;position: relative;'>Borrar</span></div>");
                        $('#archivo_'+numarch).append(newFileDiv);
                    }
                });
            },
            progressall: function (e, data){
                var progress = parseInt(data.loaded / data.total * 100, 10);
                $('#progress .progress-bar').html(progress + '%');
                $('#progress .progress-bar').css('width',progress + '%');
            }
        });
    });
</script>

我刚刚发现我可以"删除"一个项目。但当我使用多个按钮删除很多项目时,功能会中断,只删除我点击的最后一个元素。。。

我想做这个淡出效果异步。(这就是使用setInterval而不是setTimeout的原因)。。。

但对我来说什么都不管用。现在我对此有点不知所措。

有什么需要帮忙的吗?

编辑2:

现在,我试着找到如何删除2个或多个项目,但fadeout()效果只适用于第一个:

function borrar_archivo(iddiv, ruta, header){
    conexion=crearXMLHttpRequest();
    idactual = iddiv;
    conexion.onreadystatechange = procesarEventos;
    conexion.open(header, ruta, true);
    conexion.send(null);
    setInterval(function(){
        $("#"+idactual).fadeOut(1000);
    },1500);
    setInterval(function(){
        $("#"+idactual).remove();
    },1000);
}

知道为什么会发生这种事吗?以及如何解决?

假设您有一个删除按钮:

$deletebutton.on('click', function (e) {
   $(e.currentTarget).fadeOut();
});

推荐:console.log(e)-您可以在其中找到许多其他项目,您可以访问这些项目,这些项目可能会有所帮助

但是,如果你不想删除你点击的项目怎么办?

.fadeOut更改为…

$itemtoremove.fadeOut();

好吧,经过大量研究,我找到了解决方案:

当你有一堆带有Delete按钮的元素时,所有按钮都调用同一个函数:当你使用计时器时,这是一个问题,因为当你处于"等待时间"并重新执行计时器时,计时器的内部操作可能会停止(在发送之前被覆盖)。

我发现的解决方案是:将等待时间设置为小于淡出时间,不允许内部函数停止。为什么这样有效?我不知道,但你可以点击按钮,所有的内部功能都可以工作。

我把我的代码粘贴在这里。如果您需要更多的代码来理解它,请编写它:idactual是要淡出的div的id名称。numarc是用于识别每个div的数字:(例如:idactual=archivo_1,numarch=1)

setInterval(function(){
    $("#"+idactual).fadeOut(1500, function(){
        var i=0;
        for(i=1;i>numarc;i++){
            elemento=$(document).getElementById("archivo_"+i);
            texto = elemento.innerHTML;
            if(texto.indexOf("borrado")!=-1){
                elemento.remove();
            }
        }
    });
},100);