Отключение функции с помощью другой функции — Vanilla JS

#javascript #html #css

#JavaScript #HTML #css

Вопрос:

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

В чем мне нужна помощь, так это в написании отказоустойчивой функции, которая проверяет: если функция 1 сработала, отключите ее.

CodePen: http://codepen.io/theodore_steiner/pen/ORzpQQ

  function hideCourseWork() {
   var otherEducationHistory = document.getElementById("otherEducationHistory");
   otherEducationHistory.style.display = "none";

   if (otherEducationHistory.style.display == "none") {
     var noAdditionalCourseWork = document.getElementById("noAdditionalCourseWork");

     var checkNo = document.getElementById("checkNo");

     var undo = document.getElementById("undoNoAdditionalCourseWork");

     noAdditionalCourseWork.style.top = "-48px";
     checkNo.style.top = "-65px";
     undo.style.top = "-65px";
     undo.style.top = "-63px";
   }

 };  
 <div class="input-group" id="other-education">
  <p class="subtitleDirection">Please list in chronological order, any additional cources beyond the degree(s) listed above, including any Ministry of Education Courses. If you have not completed any additional course work, please indicate.</p>
  <div class="clearFix"></div>
  <label id="otherEducation">Additional Courses*</label>
  <div id="otherEducationHistory">
    <input type="text" class="three-lines" name="otherUniversity_1" placeholder="Institution" onblur="this.placeholder='Institution'" onfocus="this.placeholder=''" />
    <input type="text" class="three-lines" name="otherDegree_1" placeholder="Degree/Diploma" onblur="this.placeholder='Degree/Diploma'" />
    <input type="date" class="three-lines" name="otherEducationYear_1" />
    <input type="button" value=" " onclick=addOtherEducation() />
  </div>
  <!--end of otherEducationHistory div-->

  <div class="clearFix"></div>
</div>
<!--end of other-education div-->

<p id="noAdditionalCourseWork">I have not completed any additional course work.</p>
<input type="radio" name="checkNo" id="checkNo" onclick="hideCourseWork()" />
<br />
<p id="undoNoAdditionalCourseWork" onclick="reAddCourseWork()">(Undo).</p>  

Комментарии:

1. Я действительно смущен, в чем проблема? Разве мы не просто скрываем и отображаем HTML-элементы на основе значения радио?

2. ДА. Тем не менее, я хотел сделать еще один шаг вперед и узнать, как я мог бы сделать это с помощью функций… Только для этого примера, а также для будущих знаний.

3. Но зачем перестраивать вещи? Мне никогда за всю мою карьеру не приходилось «отключать» функцию

4. Спасибо за информацию!

Ответ №1:

Вы не очень четко сформулировали свой вопрос, но, возможно, это поможет.

Функции — это то же самое, что и переменные. Их можно переназначить (например, для пустой функции, например)..

 function doSomething(){
    alert("didSomething");
}

function disableDoSomething(){
    window.doSomething = function(){};
}
  

Если вы хотите иметь возможность повторно включить функцию позже, вы могли бы сделать что-то вроде этого…

 function doSomething(){
    alert("didSomething");
}

var functionHolder;
function disableDoSomething(){
    if(!functionHolder) functionHolder = window.doSomething;
    window.doSomething = function(){};
}

function enableDoSomething(){
    window.doSomething = functionHolder;
}
  

Комментарии:

1. Позвольте мне посмотреть, правильно ли я вас понимаю, в моем примере doSomething будет начальной функцией. Но в disableDoSomething вы поместили function(){}; Должен ли код отключения входить туда? Я не понимаю, как на самом деле отключить функцию.

2. просто doSomething замените своей фактической функцией. Пустые функции должны быть пустыми. Этот ответ фактически является тем же самым ответом, что и приведенный выше, единственное отличие заключается в том, как определяются функции. оба используют одну и ту же концепцию назначения функции пустой функции.

3. Имеет смысл. Спасибо за объяснение.

Ответ №2:

 var foo = () => { /* foo definition */ },
    bar = foo;

/* re-assign foo to a new, empty, function implementation;
   effectively "disabling" it */
foo = () => {};

/* ... code that uses function reference foo ...*/

/* re-enable foo's original behavior by assigning bar to foo */
foo = bar;
  

Ради потомков (ES5):

 var foo = function() { /* foo definition */ },
    bar = foo;

/* re-assign foo to a new, empty, function implementation;
   effectively "disabling" it */
foo = function(){};

/* ... code that uses function reference foo ...*/

/* re-enable foo's original behavior by assigning bar to foo */
foo = bar;
  

Комментарии:

1. это здорово, если вы используете последнюю версию firefox или Chrome, кто-нибудь еще будет SOL