javscript, возвращающий значение идентификатора другой функции, не работает

#javascript #html

#javascript #HTML

Вопрос:

я делаю судоку для игрушечного проекта. Что я хотел бы сделать, так это вернуть значение идентификатора пробелов и передать его другой функции. Поэтому, когда я нажимаю на число, я хочу, чтобы оно было вставлено в пробелы, но это не работает. Можете ли вы, ребята, помочь мне, в чем проблема?

 <!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <style>
    div {
      cursor: pointer;
      display: inline-block;
      padding: 10px;
    }
  </style>
</head>

<body>
  <div class="item" id="su1" style="border: 1px solid powderblue;" onclick="change_id()"></div>
  <div class="item" id="su2" style="border: 1px solid powderblue;" onclick="change_id()"></div>
  <div class="item" id="su3" style="border: 1px solid powderblue;" onclick="change_id()"></div>

  <div class="number" id='num1' style="border: 1px solid powderblue;" onclick="put_value()">1</div>
  <div class="number" id='num2' style="border: 1px solid powderblue;" onclick="put_value()">2</div>
  <div class="number" id='num3' style="border: 1px solid powderblue;" onclick="put_value()">3</div>

  <script>
    function change_id() {
      var idname = event.target.getAttribute('id');
      return idname;
    }

    function put_value() {
      var get_num_id = event.target.getAttribute('id');
      var num = document.querySelector('#'   get_num_id);
      document.querySelector('#'   change_id()).textContent = num.textContent;
    };
  </script>
</body>

</html>  

Ответ №1:

Чего вам не хватает, так это того, что вам нужно передать объект события JavaScript из вашего файла .html, когда функция щелкает и перехватывает событие в параметрах функции. вы можете использовать следующий код:

 <div class="item" id="su1" style="border: 1px solid powderblue;" onclick="change_id(e)"></div>
<div class="item" id="su2" style="border: 1px solid powderblue;" onclick="change_id(e)"></div>
<div class="item" id="su3" style="border: 1px solid powderblue;" onclick="change_id(e)"></div>

<div class="number" id='num1' style="border: 1px solid powderblue;" onclick="put_value(e)">1</div>
<div class="number" id='num2' style="border: 1px solid powderblue;" onclick="put_value(e)">2</div>
<div class="number" id='num3' style="border: 1px solid powderblue;" onclick="put_value(e)">3</div>

<script>

 var changedId = null; // we create a variable which stored the changed id value

 function change_id(event){
  changedId = event.target.getAttribute('id');
 }

 function put_value(event){
  var get_num_id = event.target.getAttribute('id');
  var num = document.querySelector('#' get_num_id);
  document.querySelector(`#${changedId}`).textContent = num.textContent;
 };
</script>
  

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

1. Большое спасибо! Теперь это работает :))) я не знал, что я должен использовать ‘null’. Не возражаете, если я задам еще один вопрос? Почему я не могу использовать return для получения значения идентификатора?

2. Установка null вы можете использовать пустую строку или любые другие вещи для инициализации переменной, поскольку, насколько я знаю, инициализировать переменную подобным образом не рекомендуется var changedId; мы должны сохранять любые вещи, такие как null или пустые строки или начальное значение.

3. Теперь по вашему вопросу: когда вы вызываете функцию change_id(event) , для этого требуется фактический элемент item, который вы получаете из события JavaScript при нажатии на элемент item , поэтому, если вы нажмете на элемент item, он сохранит идентификатор последнего нажатого элемента глобально, а при нажатии на элемент number он заменит его.

Ответ №2:

Если я понял вашу точку зрения, когда пользователь нажимает на заполненное / пустое поле, мы устанавливаем его идентификатор, а когда пользователь нажимает на пустое / заполненное поле, мы заполняем пустое поле заполненным innerText , а также отключаем обе id переменные, чтобы быть готовыми к следующему раунду;

 let suId, numId;

function change_id() {
    suId = event.target.getAttribute('id');
    fill();
}

function put_value() {
    numId = event.target.getAttribute('id');
    fill();
};

function fill() {
  if (suId amp;amp; numId) {
    document.getElementById(suId).innerText = document.getElementById(numId).innerText;
    suId = null;
    numId = null;
  }
}  
 div {
  cursor:pointer;
  display: inline-block;
  padding: 10px;
  border: 1px solid powderblue
}  
 <div class="item" id="su1" onclick="change_id()"></div>
<div class="item" id="su2" onclick="change_id()"></div>
<div class="item" id="su3" onclick="change_id()"></div>

<div class="number" id='num1' onclick="put_value()">1</div>
<div class="number" id='num2' onclick="put_value()">2</div>
<div class="number" id='num3' onclick="put_value()">3</div>  

Ответ №3:

Мое решение

https://jsfiddle.net/9wovdsup/1/

JS

 let app = function() {
    this.cellSelected = false
  this.$btns = document.querySelector('.btns');
  this.$items = document.querySelector('.items');
  this.$items.querySelectorAll('.item').forEach(el => {
    el.addEventListener('click', (e) => {
      this.selectCell(e.currentTarget);
      this.checkSelected();
    });
  });
  

  this.$btns.querySelectorAll('.btn').forEach(el => {
    el.addEventListener('click', (e) => {
        if(this.cellSelected) {
        this.cellSelected.innerText = e.currentTarget.innerText
      }
    });
  });
}
app.prototype.checkSelected = function(el) {    
  this.$btns.querySelectorAll('.number').forEach(el => {
        if(this.cellSelected) {
        el.setAttribute('tabindex', 0);
      el.removeAttribute('aria-disabled');
    } else {
        el.setAttribute('tabindex', -1);
      el.setAttribute('aria-disabled', true);
    }
  });  
}
app.prototype.selectCell = function(el) {
    if(this.cellSelected) {
        this.cellSelected.setAttribute('tabindex', -1);
      this.cellSelected.classList.remove('selected');
      if(this.cellSelected == el) {
        this.cellSelected = false;
        return
      }
    }
        el.classList.add('selected');
    el.setAttribute('tabindex', 0);
    this.cellSelected = el;
}

new app;
  

HTML

   <div class="items">
    <div tabindex="-1" class="item"></div>
    <div tabindex="-1" class="item"></div>
    <div tabindex="-1" class="item"></div>
  </div>
  
  <div class="btns">
    <div role="button" tabindex="-1" class="number btn" aria-disabled="true">1</div>
    <div role="button" tabindex="-1" class="number btn" aria-disabled="true">2</div>
    <div role="button" tabindex="-1" class="number btn" aria-disabled="true">3</div> 
  </div>
  

Ответ №4:

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

  1. Закрытие требуется для кэширования значения функции и возврата позже, когда это когда-либо потребуется.

  2. при выполнении функции put_value отображается та же ссылка на объект события.

 <!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <style>
    div {
      cursor: pointer;
      display: inline-block;
      padding: 10px;
    }
  </style>
</head>

<body>
  <div class="item" id="su1" style="border: 1px solid powderblue;" onclick="change_id()"></div>
  <div class="item" id="su2" style="border: 1px solid powderblue;" onclick="change_id()"></div>
  <div class="item" id="su3" style="border: 1px solid powderblue;" onclick="change_id()"></div>

  <div class="number" id='num1' style="border: 1px solid powderblue;" onclick="put_value()">1</div>
  <div class="number" id='num2' style="border: 1px solid powderblue;" onclick="put_value()">2</div>
  <div class="number" id='num3' style="border: 1px solid powderblue;" onclick="put_value()">3</div>

  <script>
    function change_id() {
    var idname = event.target.getAttribute('id');
    if(idname.indexOf('su') == -1){
        return change_id['cache'];
    }else{
        change_id['cache'] = idname;
    }
    }

    function put_value() {
      var get_num_id = event.target.getAttribute('id');
      var num = document.querySelector('#'   get_num_id);
    var change_id_val = change_id()
    if(change_id_val ){
            document.querySelector('#'   change_id_val).textContent = num.textContent;
    }
    };
  </script>
</body>

</html>
  

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

1. Могу ли я спросить вас, что такое [‘cache’] в change_id[‘cache’]? или я могу получить ссылку?

2. Ну, функции также являются объектами, поэтому мы можем хранить информацию аналогично объектам, но к ней должен быть доступ, в квадратных скобках присваивается доступ к свойству: object[‘свойство’] Здесь кэш — это свойство в объекте функции (change_id) , вот как работает закрытие. Этот метод рассматривается как запоминание.