。包裹();打破prevent.Default();

问题描述 投票:3回答:2

我写了一个自定义表单验证脚本,但由于某种原因,在input[type=text]中包装<div class="inputWrapper" />元素阻止我阻止input[type=submit]的默认设置。

这是相关的代码:

$("input[type=text]").wrap("<div class=\"inputWrapper\" />");

破了:

$("input[type=submit]").click(function(event) {
    event.preventDefault();
});

为什么会这样?如果您需要更完整的脚本,请告诉我,我将发布整个内容。

好吧,所以由于某种原因,禁用该行代码允许.preventDefault上的input[type=submit]工作,但如果我只是使用

// wrap inputs

    $("input[type=text]").wrap("<div class=\"inputWrapper\" />");
    // validate on form submit
    $("input[type=submit]").click(function(event) {
        event.preventDefault();
    });

它工作正常。所以这是完整的脚本,可能导致这种奇怪的东西?

    $(document).ready(function() {
        // wrap inputs
        $("input[type=text]").wrap("<div class=\"inputWrapper\" />");
        $("textarea").wrap("<div class=\"inputWrapper\" />");
        // validate text inputs on un-focus
        $("input[type=text].required").blur(function() {
            if ($(this).hasClass("error")) {
                // do nothing
            } else if ($(this).val() === "") {
                $(this).addClass("error");
                $(this).parent(".inputWrapper").append("<div class=\"errorPopup\">" + $(this).attr("placeholder") + "</div>");
            }
        });
        // validate textareas on un-focus
        $("textarea.required").blur(function() {
            if ($(this).hasClass("error")) {
                // do nothing
            } else if ($(this).val() === "") {
                $(this).addClass("error");
                $(this).parent(".inputWrapper").append("<div class=\"errorPopup\">" + $(this).attr("placeholder") + "</div>");
            }
        });

        // validate on form submit
        $("input[type=submit]").click(function(event) {
            event.preventDefault();
            // check fields

            $(this).parent("form").children("input.required").each(function() {
            // check textboxes

            if ($(this + "[type=text]")) {
                if (!$(this).val()) {
                    $(this).addClass("error");
            };
            };

            // end textboxes
    // check textareas
            $(this).parent("form").children("textarea.required").each(function() {
            if (!$(this).val()) {
                    $(this).addClass("error");
                };
            });

            // end textareas
        // check checkboxes and radio buttons
        if ($(this).is(":checkbox") || $(this).is(":radio")) {
                var inputName = $(this).attr("name");
                if (!$("input[name=" + inputName + "]").is(":checked")) {
                    var inputId = $(this).attr("id");
            $("label[for=" + inputId + "]").addClass("error");
                };
            };

            // end checkboxes and radio buttons
        });

        // end fields
        // submit form
        var errorCheck = $(this).parent("form").children(".error").length > 0;
            if (errorCheck == 0) {
                $(this).parent("form").submit();
            } else {
                alert("You didn't fill out one or more fields. Please review the form.");
                window.location = "#top";
            };
        // end submit form
    });
    // clear errors 
    $("input.required").each(function() {
        // clear textboxes
            if ($(this + "[type=text]")) {
                $(this).keypress(function() {
                    $(this).removeClass("error");
                    $(this).next(".errorPopup").remove();
                });
            };
        // end textboxes
        // clear textareas
            $("textarea.required").each(function() {
                $(this).keypress(function() {
                    $(this).removeClass("error");
                    $(this).next(".errorPopup").remove();
                });
            });
        // end textareas
        // check checkboxes and radio buttons
            if ($(this).is(":checkbox") || $(this).is(":radio")) {
                var inputName = $(this).attr("name");
                var labelFor = $(this).attr("id");
                $(this).click(function() {
                    $("input[name=" + inputName + "]").each(function() {
                        var labelFor = $(this).attr("id");
                        $("label[for=" + labelFor + "]").removeClass("error");
                    });
                });
            };
        // end checkboxes and radio buttons
    });
    // end clear textbox errors
});

好吧,我错的是问题是什么。它与我认为的那条线有关,但实际上在我包装输入后找到.error的问题。

这就是问题所在:

var errorCheck = $(this).parent("form").children(".error").length > 0;`\
javascript jquery preventdefault
2个回答
2
投票
var errorCheck = $(this).parent("form").children(".error").length > 0;

当你.wrap文本输入时,他们不再是表格的孩子。使用.find

顺便说一句,$(this + "selector")无效。你可能想用$(this).is("selector")


0
投票

您需要使用新DOM元素维护某种引用。这将首先将它作为初始化的DOM元素放在变量中(而不是像你所做的那样作为字符串),并将原始元素放在原始元素中,它将被放回来维护事件:

var $inputWrapper = $("<div class=\"inputWrapper\" />"),
    $inputText = $("input[type=text]");
$inputText.wrap("<div class=\"inputWrapper\" />");

然后你可以重新替换元素。

© www.soinside.com 2019 - 2024. All rights reserved.