Странная ошибка проверки JQuery при рендеринге на сервере в IE7 («this.0.form» имеет значение null или не является объектом) - PullRequest
1 голос
/ 16 августа 2011

Я пытаюсь реализовать пользовательскую функцию проверки, которая требует, чтобы группа полей была либо заполнена, либо пуста. Я использовал этот ответ , и все, казалось, работало, когда Я запускаю это локально. Когда я помещаю его на сервер Tomcat и он отображается с помощью сервлета, я получаю следующую ошибку при запуске в IE7, в Firefox он отлично работает в обоих случаях.

this.0.form 'является нулем или не является объектом строка jquery.validate.js 97

Вы можете найти плагин проверки здесь . Соответствующий код ниже. В комментариях говорится об ошибке.

 /*
  * Form Validation
  */
 $.validator.addMethod("notEmpty", function (value, element) {
     return value !== "";
 }, "This value cannot be empty");

 $.validator.addMethod("all", function (value, element, options) {

    var row = $(element).closest(options[1]);
    var empties_in_group = $(options[0], row).filter(function() {
        return $(this).val() === "";
    }).length;

    //Either all have to be empty or filled
    var valid = empties_in_group === 0 || empties_in_group === $(options[0], row).length;

    if (!$(element).data('reval')) {
        var fields = $(options[0], row);
        fields.data('reval', true).valid(); //Error happens in this line
        fields.data('reval', false);
    }
    return valid;
 }, "Either none or all fields in this section have to be filled");

$.validator.addClassRules({
    percentage: {
        digits: true,
        min: 0,
        max: 100
    },
    cpu_util:   {all: [".cpu_util", 'tr']},
    cpu_load:   {all: [".cpu_load", 'tr']},
    disk_used:  {all: [".disk_used", 'tr']},
    disk_cons:  {all: [".disk_cons", 'tr']},
    time_field: {all: [".time_field", 'li']},
    log_msgs:   {all: [".log_msgs", 'li']},
    log_unchng: {all: [".log_unchng", 'td']},
    log_ex:     {all: [".log_ex", 'td']},
    mem_free:   {all: [".mem_free", 'tr']},
    mem_used:   {all: [".mem_used", 'tr']},
    cpu_mem:    {all: [".cpu_mem", 'tr']},
    cpu_util:   {all: [".cpu_util", 'tr']},
    swap:       {all: [".swap", 'tr']}
});

Есть идеи?

РЕДАКТИРОВАТЬ: файлы загружаются в шапку:

<head>
  <link rel="stylesheet" type="text/css" href="<rootfolder>/css/style.css"/>
  <script type="text/javascript" src="<rootfolder>/js/jquery-1.6.2.min.js"></script>
  <script type="text/javascript" src="<rootfolder>/js/jquery.timebox.js"></script>
  <script type="text/javascript" src="<rootfolder>/js/jquery.validate.js"></script>
  <script type="text/javascript" src="<rootfolder>/js/jquery.qtip.min.js"></script>
  <script type="text/javascript" src="<rootfolder>/js/script.js"></script>
</head>

Javascript в скрипте js загружается так:

$(document).ready(function() {
  <JQUERY AND JAVASCRIPT THINGS>
});

РЕДАКТИРОВАТЬ 2: Я также попытался с Javascript в нижней части тела, и он все еще имеет ту же ошибку.

Ответы [ 3 ]

0 голосов
/ 16 августа 2011

Если все, что вам нужно сделать, это убедиться, что обязательные поля заполнены. Тогда код очень прост, оставьте сложный плагин. Все, что вам нужно сделать, это примерно так:

Примечание : простая версия, все, что она делает, чтобы убедиться, есть вход или нет.

function validateForm() {
    var req = $('.required');
    $.each(req, function(index, value){
        if($(value).val() != null &&  $(value).val().length < 1){
            markError($(value), "Cannot be empty");
            error=true;
        } else {
            unmarkError($(value));
        }
    });

    function markError(ele, msg) {
        $(ele).prev().addClass("alert");
        var msgSpan = $(ele).next('span.errorMsg');
        if(msgSpan.length > 0) {
            $(msgSpan).text(msg);
        } else {
            $(ele).after("<span class='errorMsg'>"+msg+"</span>");
        }
    }

    function unmarkError(ele) {
        $(ele).prev().removeClass("alert");
        $(ele).next('span.errorMsg').remove();
    }
}

Я получаю все поля с классом CSS required и проверяю их значение. Я выполняю этот код в форме отправки:

<form .... onSubmit="return validateForm()" >
0 голосов
/ 21 ноября 2012

Я тестировал свое приложение MVC в IE 8, последних версиях FF и Chrome, и все работало нормально. Когда я попытался запустить IE со стандартами IE 7, многое не работало, включая некоторые проверки jquery.

Проблема была именно в том, что было указано в сообщении об ошибке, форма была нулевой.

То, что происходило в моем случае, было то, что я проверял форму как это

var form = $("#divThatWrapsTheForm #Form"); //changed this line

form.removeData("validator");
$.validator.unobtrusive.parse(form);


if (!$(form).valid()) {
    return;
}

Судя по всему, IE 7 не понравился способ определения переменной формы, поэтому я исправил это так:

var form = $("#divThatWrapsTheForm").children("#Form"); //to this

form.removeData("validator");
$.validator.unobtrusive.parse(form);


if (!$(form).valid()) {
    return;
}

Надеюсь, это поможет.

0 голосов
/ 16 августа 2011

JQuery не отображается на стороне сервера. необработанный файл JavaScript передается клиенту, а браузер клиента выполняет любой код, который вы написали, без помощи сервера.

так что, если tomcat на самом деле не переписывает код перед отправкой его клиенту, я серьезно сомневаюсь, что это из-за проблемы на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...