2016-06-09 5 views
-1

У меня есть метод, который предположил, чтобы перебрать все элементы управления на моей странице и вернуть false, если какое-либо из них имеет значение, отличное от пустой строки/null. Это называется частью OnSaveValidation. Если форма пуста, то должен сэкономить.Как проверить, нет ли всех элементов управления на странице?

function IsFormEmpty() 
{ 
    var ancestor = document.getElementById('PAIQIFunc'); //PAIQIFunc is the id of a div 
    var descendents = ancestor.getElementsByTagName('*'); 

    var i = 0; 
    for (i = 0; i < descendents.length; ++i) 
    { 
     var e = descendents[i]; 

     try 
     { 
      var eVal = $("#" + e).val(); 

      // just check to make sure eVal has *some* value 
      if (eVal != '' || eVal != undefined || eVal != null) 
       return false; 
     } 
     catch (err){ 
      //simply move on to next control... 
     } 
    } 

    return true; 
} 

В большинстве случаев var eVal = $("#" + e).val(); выбрасывает исключение, потому что это div или что-то подобное. Меня интересуют только 108 выпадающих меню и 1 текстовое поле в моей форме.

Я установил точку останова в своем заявлении if, и он никогда не попадал. Но descendents имеет в себе 1200 элементов; Я не мог бы пройти через все это, пытаясь найти то, что я ищу ...

Как еще я могу изменить код, чтобы проверить каждый элемент управления на странице?

EDIT: Я хотел бы отметить, что веб-приложение представляет собой проект C#/ASP.NET с помощью представлений Razor и мы используем Telerik в Кендо управления веб-интерфейса, а не «ванильные» управления .NET, если это делает разницу. Таким образом, все элементы управления определены в файле .cshtml следующим образом:

@(Html.Kendo().DropDownListFor(m => m.SomeProperty).HtmlAttributes(new { id = "cmbSomeProperty", @class = "k-dropdown-width-30", @tabIndex = "1", style = "width:60px" }).BindTo(ViewBag.SomePropertyDataSource).OptionLabel(" ")) 
+1

Вы уже используете запрос, так почему бы просто не использовать его для выбора всех элементов формы (и только тех)? '$ ('# PAIQualityIndicatorFunctionalV14 input, # PAIQualityIndicatorFunctionalV14 select, # PAIQualityIndicatorFunctionalV14 anyelseyoumighthave')' – CBroe

+0

@CBroe Извините, я не уверен, что вы имеете в виду. Я по-прежнему новичок в jquery/js в целом. Я не знаю, что вы пытаетесь показать в своем фрагменте кода. – sab669

+0

@ sab669 - потому что вы не понимаете ответа, не делает его неправильным ответом. Почему бы не пойти читать jQuery и понять это. SO не предназначен для использования API-интерфейсов для загрузки ложки. Вы комментируете/задаете этот вопрос вне темы: слишком широкий **, потому что теперь вопрос: «Я не знаю jquery, и я хочу, чтобы вы объяснили мне фундаментальные основные вещи, потому что мне слишком лениво читать инструкции * *. –

ответ

2

Вы можете попробовать следующее:

var hasValue = false; 
var div = document.getElementById('PAIQIFunc'); 

$(div).find('input') 
    .each(function() { // iterates over all input fields found 
     if($.trim($(this).val()).length != 0) { 
      hasValue = true; // if field found with content 
      break; 
     } 
    }); 

if(hasValue === false) { 
    // save logic here 
} 

Надеется, что это помогает.

+0

Хорошая работа Почему n ot использовать '$ (" # PAIQIFunc ")' непосредственно, вместо 'getElementById', а затем' $ (div) '? –

+0

Спасибо! Нет особой причины, я только что привык кэшировать элементы DOM, чтобы оптимизировать производительность, что, я думаю, не особенно плохо. – Sandman

+0

Спасибо! Между пониманием того, что имел в виду CBroe в своем комментарии, я смог понять это. Пришлось добавить второй сегмент для 'find ('select')', но в остальном это сработало отлично! – sab669

Смежные вопросы