Динамический стол - авто-шоу

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

$('#table').editable({
        container: 'body',
        selector: 'td.task',
        title: 'task',
        type: "POST",
        showbuttons: false,
         type: 'text',
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        },  
        success: function(response) {
     //WITH THIS CODE I COULD JUMP BUT THE LIST GIVE A ERROR AND CREATE A NEW TR WITH TD
           $(this).parent().find(".Item").click();
        }
    });
    var ITEM = [];
    $.each({
        "Item1": "Item1",
        "Item2": "Item2",
        "Item3": "Item3",
        "Item4": "Item4"
    }, function(k, v) {
        ITEM.push({
            value: k,
            text: v
        });
    });
    
    $('#table').editable({
        container: 'body',
        selector: 'td.Item',
        title: 'Item',
        type: "POST",
        showbuttons: false,
        source: ITEM,
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        }
    });
<link href = "//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel = "stylesheet">
<script src = "http://code.jquery.com/jquery-2.1.1.min.js"></script> 
<script src = "//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>
<link href = "https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel = "stylesheet"/>

<table id = "table" class = "table table-bordered">
  <thead>
    <tr>
      <th>Id</th>
      <th>Task</th>
      <th>Item</th>
    </tr>
  </thead>
  <tbody>
  <tr>
  <td>1</td>
  <td data-name = "task" class = "task" data-type = "text">001</td>
  <td data-name = "Item" class = "Item" data-type = "select">Item2</td>
  </tr>
    <tr>
  <td>2</td>
  <td data-name = "task" class = "task" data-type = "text">002</td>
  <td data-name = "Item" class = "Item" data-type = "select">Item1</td>
  </tr>
  </tbody>
</table>

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

ОБНОВЛЕНИЕ: я добавляю строку кода в свою функцию успеха, но выбор дает ошибку Error when loading list, а в таблице создает новый <tr> with <td>

Когда я запускаю код, он работает нормально, нет? в чем проблема?

acmsohail 11.10.2018 14:16

@acmsohail Если я изменю задачу, я хочу перейти к выбранному элементу

MoteCL 11.10.2018 14:18

поменять задачу, вы имеете в виду, щелкнуть tab должен на поле item?

acmsohail 11.10.2018 14:32

в success: function(response) автоматически перейти к полю выбора

MoteCL 11.10.2018 14:39

Пожалуйста, проверьте мой ответ. Надеюсь, это вам поможет.

acmsohail 11.10.2018 15:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
5
268
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

$('#table').editable({
        container: 'body',
        selector: 'td.task',
        title: 'task',
        type: "POST",
        showbuttons: false,
         type: 'text',
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        },  
        success: function(response) {
          
           //CODE TO JUMP TO THE SELECT 
        }
    });
    var ITEM = [];
    $.each({
        "Item1": "Item1",
        "Item2": "Item2",
        "Item3": "Item3",
        "Item4": "Item4"
    }, function(k, v) {
        ITEM.push({
            value: k,
            text: v
        });
    });
    
    $('#table').editable({
        container: 'body',
        selector: 'td.Item',
        title: 'Item',
        type: "POST",
        showbuttons: false,
        source: ITEM,
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        }
    });

    $('#table .task').on('hidden', function(e, reason){
     
      if (reason === 'save' || reason === 'nochange') {
          var $next = $(this).closest('tr').next().find('.task');
        
        setTimeout(function() {
            $next.editable('show');
        }, 300);
      }
   });
   
   $('#table .Item').on('hidden', function(e, reason){
     
      if (reason === 'save' || reason === 'nochange') {
          var $next = $(this).closest('tr').next().find('.Item');
        
        setTimeout(function() {
            $next.editable('show');
        }, 300);
      }
   });
<link href = "//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel = "stylesheet">
<script src = "http://code.jquery.com/jquery-2.1.1.min.js"></script> 
<script src = "//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>
<link href = "https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel = "stylesheet"/>

<table id = "table" class = "table table-bordered">
  <thead>
    <tr>
      <th>Id</th>
      <th>Task</th>
      <th>Item</th>
    </tr>
  </thead>
  <tbody>
  <tr>
  <td>1</td>
  <td data-name = "task" class = "task" data-type = "text">001</td>
  <td data-name = "Item" class = "Item" data-type = "select">Item2</td>
  </tr>
    <tr>
  <td>2</td>
  <td data-name = "task" class = "task" data-type = "text">002</td>
  <td data-name = "Item" class = "Item" data-type = "select">Item1</td>
  </tr>
  </tbody>
</table>

не переходит в поле выбора, переходит к tr идентификатора

MoteCL 11.10.2018 14:40

Что вы имеете в виду под выбранным полем?

Nisfan 11.10.2018 15:14

$ (это) .parent (). find ('. Item'). editable ('show'); попробуйте это и проверьте

acmsohail 11.10.2018 15:16

К счастью, поскольку вы связались с рабочим примером, я смог изучить код. Кстати, вы можете сделать это, просто открыв инструменты разработчика в своем браузере. Я использую Chrome, поэтому для меня это просто F12. В исходном коде я обнаружил следующее:

   $('#user .editable').on('hidden', function(e, reason){
        if (reason === 'save' || reason === 'nochange') {
            var $next = $(this).closest('tr').next().find('.editable');
            if ($('#autoopen').is(':checked')) {
                setTimeout(function() {
                    $next.editable('show');
                }, 300); 
            } else {
                $next.focus();
            } 
        }
   });

Код читается почти как английский, поэтому я думаю, что за ним довольно легко следить. Когда редактор закрыт, мы сначала проверяем причину его закрытия. Затем код находит следующее поле и открывает редактор, если установлен флажок «Автоматически открывать следующее текстовое поле». Интересно видеть, что это делается с таймаутом, а не просто с вызовом $next.editable('show');. Это может быть важно или просто для галочки.

В своем коде вы захотите найти какой-нибудь объединяющий селектор для ваших элементов. Я думаю, что самый простой способ сделать это - просто добавить .editable к исходному источнику и называть его, как в демонстрации.

Итак, для вашего HTML:

<table id = "table" class = "table table-bordered">
  <thead>
    <tr>
      <th>Id</th>
      <th>Task</th>
      <th>Item</th>
    </tr>
  </thead>
  <tbody>
  <tr>
  <td>1</td>
  <td data-name = "task" class = "editable task" data-type = "text">001</td>
  <td data-name = "Item" class = "editable Item" data-type = "select">Item2</td>
  </tr>
    <tr>
  <td>2</td>
  <td data-name = "task" class = "editable task" data-type = "text">002</td>
  <td data-name = "Item" class = "editable Item" data-type = "select">Item1</td>
  </tr>
  </tbody>
</table>

Обратите внимание на добавленный класс в тегах td. (Обновлено: сумасшедший, не заметил, что уже есть атрибут класса)

Затем вы можете эмулировать демонстрационный код js, но будьте осторожны, потому что переменную $next нельзя выбрать таким же образом. Ваш макет DOM отличается, поскольку у вас есть более одной редактируемой ячейки в строке:

   $('#table .editable').on('hidden', function(e, reason){
        if (reason === 'save' || reason === 'nochange') {
            var $next = $(this).nextAll().find('.editable');
            if ($next.length > 0) {
                $next = $next[0];
            } else {
                $next = $(this).closest('tr').next().find('.editable');
                if ($next.length > 0) {
                    $next = $next[0];
                } else {
                    return; // No editable fields remaining.
                }
            }
            setTimeout(function() { $next.editable('show'); }, 300); 
        }
   });

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

РЕДАКТИРОВАТЬ: Я заметил, что, возможно, вы хотите перейти только к полю выбора, но не обязательно от выбора к элементу в следующей строке. В этом случае код немного проще.

Во-первых, нет необходимости в классе editable, поэтому вы можете просто использовать уже имеющийся html-код, но в js вам нужно правильно адресовать селекторы:

   $('#table .task').on('hidden', function(e, reason){
        if (reason === 'save' || reason === 'nochange') {
            var $next = $(this).nextAll().find('.Item');
            setTimeout(function() { $next.editable('show'); }, 300); 
        }
   });

Так и должно быть. Когда редактор в выбранном закрывается, следующее поле не будет выбрано автоматически.

Уф, я как-то упустил тот факт, что у вас нет флажка, который был в демо. Вот что происходит, когда у вас нет тестовой среды. В любом случае, я думаю, что все должно работать.

Kamil Jarosz 11.10.2018 14:58

Я добавляю эту строку кода в свою функцию успеха $(this).parent().find(".Item").editable('toggle');, но список дает ошибку в списке отображения

MoteCL 11.10.2018 15:14

проверьте мой фрагмент Error when loading list

MoteCL 11.10.2018 15:17
Ответ принят как подходящий

Я только что поменял $(this).parent().find(".Item").editable('toggle'); на $(this).parent().find(".Item").click();

$('#table').editable({
        container: 'body',
        selector: 'td.task',
        title: 'task',
        type: "POST",
        showbuttons: false,
         type: 'text',
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        },  
        success: function(response) {
     //WITH THIS CODE I COULD JUMP BUT THE LIST GIVE A ERROR AND CREATE A NEW TR WITH TD
           $(this).parent().find(".Item").click();
        }
    });
    var ITEM = [];
    $.each({
        "Item1": "Item1",
        "Item2": "Item2",
        "Item3": "Item3",
        "Item4": "Item4"
    }, function(k, v) {
        ITEM.push({
            value: k,
            text: v
        });
    });
    
    $('#table').editable({
        container: 'body',
        selector: 'td.Item',
        title: 'Item',
        type: "POST",
        showbuttons: false,
        source: ITEM,
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        }
    });
<link href = "//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel = "stylesheet">
<script src = "http://code.jquery.com/jquery-2.1.1.min.js"></script> 
<script src = "//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>
<link href = "https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel = "stylesheet"/>

<table id = "table" class = "table table-bordered">
  <thead>
    <tr>
      <th>Id</th>
      <th>Task</th>
      <th>Item</th>
    </tr>
  </thead>
  <tbody>
  <tr>
  <td>1</td>
  <td data-name = "task" class = "task" data-type = "text">001</td>
  <td data-name = "Item" class = "Item" data-type = "select">Item2</td>
  </tr>
    <tr>
  <td>2</td>
  <td data-name = "task" class = "task" data-type = "text">002</td>
  <td data-name = "Item" class = "Item" data-type = "select">Item1</td>
  </tr>
  </tbody>
</table>

Я думаю, что ваша ошибка появляется, потому что нет значения по умолчанию, сначала попробуйте изменить элемент, а затем измените текст в своем фрагменте

Пожалуйста, попробуйте еще раз. Это вам поможет :)

$('#table').editable({
  container: 'body',
  selector: 'td.task',
  title: 'task',
  type: "POST",
  showbuttons: false,
  type: 'text',
  validate: function(value) {
    if ($.trim(value) == '') {
      return 'Empty!';
    }
  },
  success: function(response) {

    //CODE TO JUMP TO THE SELECT 
  }
});
var ITEM = [];
$.each({
  "Item1": "Item1",
  "Item2": "Item2",
  "Item3": "Item3",
  "Item4": "Item4"
}, function(k, v) {
  ITEM.push({
    value: k,
    text: v
  });
});

$('#table').editable({
  container: 'body',
  selector: 'td.Item',
  title: 'Item',
  type: "POST",
  showbuttons: false,
  source: ITEM,
  validate: function(value) {
    if ($.trim(value) == '') {
      return 'Empty!';
    }
  }
});

$('#table .task').on('hidden', function(e, reason) {

  if (reason === 'save' || reason === 'nochange') {
    $(this).parent().find(".Item").click();
  }
});
<link href = "//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel = "stylesheet">
<script src = "http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src = "//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>
<link href = "https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel = "stylesheet" />

<table id = "table" class = "table table-bordered">
  <thead>
    <tr>
      <th>Id</th>
      <th>Task</th>
      <th>Item</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td data-name = "task" class = "task" data-type = "text">001</td>
      <td data-name = "Item" class = "Item" data-type = "select">Item2</td>
    </tr>
    <tr>
      <td>2</td>
      <td data-name = "task" class = "task" data-type = "text">002</td>
      <td data-name = "Item" class = "Item" data-type = "select">Item1</td>
    </tr>
  </tbody>
</table>

Другие вопросы по теме