Проверьте различные поля в зависимости от того, что выбрано в раскрывающемся списке в форме с помощью jQuery? - PullRequest
0 голосов
/ 19 августа 2010

У меня есть следующий код для проверки некоторых полей на sharepoint newform.aspx.Чтобы не отправлять форму в sharepoint, я должен вернуть ложное утверждение в функцию по умолчанию PreSaveItem.

Проверка:

//bind a change event to all controls to validate
    $("input[title=Target Date],input[id$=UserField_hiddenSpanData],input[title=Start Date],select[title=Strategic Objective],select[title=Strategic 

Priority]").change(function(){
        checkControls()
    });

    //the change event function - check the status of each control
    function checkControls(){

    //set a variable to count the number of valid controls
    var controlsPassed = 0;

    //set up a selector to pick .each() of the target controls
    $("input[title=Target Date],input[id$=UserField_hiddenSpanData],input[title=Start Date],select[title=Strategic Objective],select[title=Strategic 

Priority]").each(function(){

        //if the control value is not zero AND is not zero-length
        var txt = $('#ctl00_m_g_c6ae303a_6013_4adb_8057_63a214bcfd24_ctl00_ctl00_UserField_hiddenSpanData').val();
        var val = $(this).val();
        if($(this).is(':hidden') || (val != 0 && val.length != 0 && txt.length != 0)) { 

            //add one to the counter
            controlsPassed += 1;
        }

        });

    //call the PreSaveItem function and pass the true/false statement of 5 valid controls

return (controlsPassed == 5) 

    }
        function PreSaveItem() {
            return checkControls()
    }

Я хочу проверить различные элементы в зависимости от того, что я выбрал вРаскрывающийся список под названием Уровень предмета.

Я получаю значения из Уровня предмета с помощью:

$("select[title='Item Level']").change(function() {
        var itemLevel = $(this).val();      
        if (itemLevel == "Strategic Objective") {


        alert(itemLevel);
        }
        if (itemLevel == "Strategic Priority") {


        alert(itemLevel);
        }
        if (itemLevel == "Milestone Action") {


        alert(itemLevel);
        }
        if (itemLevel == "Performance Measure") {


        alert(itemLevel);
        }

        });

Я думал, что было бы легко просто вставить код проверки в if, но это не такработа.

Например:

        $("select[title='Item Level']").change(function() {
        var itemLevel = $(this).val();      
        if (itemLevel == "Strategic Objective") {


        alert(itemLevel);
        }
        if (itemLevel == "Strategic Priority") {


        alert(itemLevel);
        }
        if (itemLevel == "Milestone Action") {
        //bind a change event to all controls to validate
    $("input[title=Target Date],input[id$=UserField_hiddenSpanData],input[title=Start Date],select[title=Strategic Objective],select[title=Strategic 

Priority]").change(function(){
        checkControls()
    });

    //the change event function - check the status of each control
    function checkControls(){

    //set a variable to count the number of valid controls
    var controlsPassed = 0;

    //set up a selector to pick .each() of the target controls
    $("input[title=Target Date],input[id$=UserField_hiddenSpanData],input[title=Start Date],select[title=Strategic Objective],select[title=Strategic 

Priority]").each(function(){

        //if the control value is not zero AND is not zero-length
        var txt = $('#ctl00_m_g_c6ae303a_6013_4adb_8057_63a214bcfd24_ctl00_ctl00_UserField_hiddenSpanData').val();
        var val = $(this).val();
        if($(this).is(':hidden') || (val != 0 && val.length != 0 && txt.length != 0)) { 

            //add one to the counter
            controlsPassed += 1;
        }

        });

    //call the PreSaveItem function and pass the true/false statement of 5 valid controls

return (controlsPassed == 5) 

    }
        function PreSaveItem() {
            return checkControls()
    }


        alert(itemLevel);
        }
        if (itemLevel == "Performance Measure") {


        alert(itemLevel);
        }

        });

и в элементе уровня предмета Стратегическая цель проверьте некоторые другие элементы.Есть идеи?

Заранее спасибо.

Редактировать: рабочий код с помощью casablanca:

function checkControls() {
  var itemLevel = $("select[title='Item Level']").val();
  switch (itemLevel) {
    case 'Strategic Objective':

    var controlsPassed = 0;

    $("input[id$=UserField_hiddenSpanData]").each(function(){

        var txt = $('#ctl00_m_g_c6ae303a_6013_4adb_8057_63a214bcfd24_ctl00_ctl04_ctl08_ctl00_ctl00_ctl04_ctl00_ctl00_UserField_hiddenSpanData').val();
        var val = $(this).val();
        if(val != 0 && val.length != 0 && txt.length != 0) { 

            //add one to the counter
            controlsPassed += 1;
        }

        });
        return (controlsPassed == 1) 

    case 'Milestone Action':

      var controlsPassed = 0;

    $("input[title=Target Date],input[id$=UserField_hiddenSpanData],input[title=Start Date],select[title=Strategic Objective],select[title=Strategic 

Priority]").each(function(){

        var txt = $('#ctl00_m_g_c6ae303a_6013_4adb_8057_63a214bcfd24_ctl00_ctl04_ctl08_ctl00_ctl00_ctl04_ctl00_ctl00_UserField_hiddenSpanData').val();
        var val = $(this).val();
        if($(this).is(':hidden') || (val != 0 && val.length != 0 && txt.length != 0)) { 

            //add one to the counter
            controlsPassed += 1;
        }

        });
        return (controlsPassed == 5) 

    case 'Performance Measure':

        var controlsPassed = 0;

    $("select[title=Strategic Objective],select[title=Strategic Priority]").each(function(){

        var val = $(this).val();
        if(val != 0 && val.length != 0) { 

            //add one to the counter
            controlsPassed += 1;
        }

        });
    return (controlsPassed == 2) 

case 'Strategic Priority':

        var controlsPassed = 0;

    $("input[title=Target Date],input[id$=UserField_hiddenSpanData],input[title=Start Date],select[title=Strategic Objective]").each(function(){

        var txt = $('#ctl00_m_g_c6ae303a_6013_4adb_8057_63a214bcfd24_ctl00_ctl04_ctl08_ctl00_ctl00_ctl04_ctl00_ctl00_UserField_hiddenSpanData').val();
        var val = $(this).val();
        if($(this).is(':hidden') || (val != 0 && val.length != 0 && txt.length != 0)) { 

            //add one to the counter
            controlsPassed += 1;
        }

        });
    return (controlsPassed == 4) 

  }
}

function PreSaveItem() 
    {
            return checkControls()
    }

1 Ответ

0 голосов
/ 19 августа 2010

Хорошо, вот проблема, которую я вижу в вашем текущем скрипте: привязка обработчика событий постоянна, поэтому, если вы выберите «Действие вехи» хотя бы один раз, а затем переключитесь на другую опцию, вы все равно подтвердите исходный выбор.

Вы можете покончить со всеми обработчиками change и вместо этого добавить свои условия непосредственно в checkControls, проверяя необходимые элементы на основе текущего выбора.Я также заменил ваши if s на switch, так как он чище:

function checkControls() {
  var itemLevel = $("select[title='Item Level']").val();
  switch (itemLevel) {
    case 'Strategic Objective':
      // Perform validation for this item level
      return result; // true or false

    case 'Milestone Action':
      // Perform validation for this item level
      return result; // true or false

    // etc...
  }
}

Обновление : Например, если выбрано "Действие вехи", вы быхотел бы проверить, не является ли какое-либо текстовое поле не пустым, то в case 'Milestone Action': вы бы добавили что-то вроде этого:

if ($('something').val().length > 0)
  return true;
else
  return false;

Редактировать: Если у вас есть доступ кКод формы (я не знаком с SharePoint), вы должны назначить идентификаторы для элементов формы, чтобы вы могли ссылаться на них как $('#itemLevel') вместо того, чтобы использовать длинный селектор.

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