Javascript 动态添加的类上的.hasClass()不';行不通

Javascript 动态添加的类上的.hasClass()不';行不通,javascript,jquery,html,ajax,Javascript,Jquery,Html,Ajax,我目前正在使用jQuery编写一个简单的脚本,在提交完整表单之前检查所有文件(通过AJAX发送)是否正确上传。因此,交易是:当用户将图像放入浏览器(拖放)时,它将使用AJAX发送到服务器,当上传完成时,它只需向某个div标记添加一个类“done” 因此,每当用户删除图像时,它都会添加这种div: <div class="preview">/* blablabla other div and span classes */</div> 但是。。。不管怎样,表单都会被发送,

我目前正在使用jQuery编写一个简单的脚本,在提交完整表单之前检查所有文件(通过AJAX发送)是否正确上传。因此,交易是:当用户将图像放入浏览器(拖放)时,它将使用AJAX发送到服务器,当上传完成时,它只需向某个div标记添加一个类“done

因此,每当用户删除图像时,它都会添加这种div:

<div class="preview">/* blablabla other div and span classes */</div>
但是。。。不管怎样,表单都会被发送,即使现在有15个图像正在上传,15个div标签有.preview类,但没有.done

我肯定我犯了一些愚蠢的错误,或者那只是我不知道的一些事情。each()或。hasClass(),有人能帮我吗

提前谢谢

编辑:考虑到我犯的两个错误,下面是更正后的脚本:

function checkUploadFiles(){
    var ret = true;
    $(".preview").each(function() {
        var $this = $(this);
        if(!$this.hasClass('done')){
            alert("Something is not fully uploaded yet, please wait");
            ret = false;
        };
    });
    return ret;
};

您正在从each循环返回
false
,而不是从validate方法返回,因此无论验证如何,它都将始终返回true

另外,
val
是一个dom元素引用,不是jQuery对象,因此它没有
hasClass()
方法

function checkUploadFiles() {
    if (!$(".preview").not('.done').length) {
        alert("Something is not fully uploaded yet, please wait");
        return false;
    };
    return true;
};

在.each中,
val
(和
this
)是DOM对象,而不是jQuery包装的对象。因此,您想要的是:

function checkUploadFiles(){
    $(".preview").each(function() {
        var $this = $(this);
        if(!$this.hasClass('done')){
            alert("Something is not fully uploaded yet, please wait");
            return false;
        };
    });
    return true;
};

如果您在回调中执行任何操作,最好创建一个
$this
变量(因为您不能信任内部函数中
this
的值)。

若要扩展我的注释,以提供Ethan方法的替代方法,只需“jquery”每个循环中获得的dom元素,因此,您的代码如下所示:

<div class="preview done">/* blablabla other div and span classes */</div>
function checkUploadFiles(){
    var isDone = true;
    $(".preview").each(function(i, val) {
        if(!$(val).hasClass('done')){
            alert("Something is not fully uploaded yet, please wait");
            isDone = false;
        };
    });
    return isDone;
};
如果您仍然需要索引值,则此方法非常有用,并可避免任何“是什么”
This
混淆


编辑以解决使用布尔变量而不是硬编码布尔值在每个循环中返回false的问题。

尝试jquerying类似$(val)的元素。HasClassJavaScript控制台中没有出现错误吗?这难道没有帮助您找出原因吗?您的
return false
语句只是从
.each()
迭代函数返回,而不是从
checkUploadFiles
返回。因此,
checkUploadfiles
将始终返回
true
。当我发布此答案时,我确信val是dom对象是一个问题,我不确定这样调用return false的结果,我正在更新它。@Barmar我已经解决了这个问题,您是否愿意更新您对Ethan答案的评论,因为它现在具有误导性。这确实是因为val是dom元素,谢谢!我还更正了我原来帖子中从each循环返回的“false”。这与Phaeze的回答有相同的问题。
function checkUploadFiles(){
    $(".preview").each(function() {
        var $this = $(this);
        if(!$this.hasClass('done')){
            alert("Something is not fully uploaded yet, please wait");
            return false;
        };
    });
    return true;
};
function checkUploadFiles(){
    var isDone = true;
    $(".preview").each(function(i, val) {
        if(!$(val).hasClass('done')){
            alert("Something is not fully uploaded yet, please wait");
            isDone = false;
        };
    });
    return isDone;
};