jquery переключает элементы append () друг к другу нажатием - PullRequest
1 голос
/ 25 февраля 2020

У меня есть некоторые слова, заключенные в <div id="xxx">. Если я нажму на каждое слово, оно будет добавлено к другому элементу (здесь это <div id="yyy">). моя проблема в обратном процессе. когда я нажимаю на каждое слово в последнем div, оно не возвращается к базовому div (ID = "xxx"). мой код:

var s = $("#main").text();
var s1 = s.trim();
var s2 = s1.split(" ");
$.each(s2, function(i, v) {
  $("<span/>").text(v).appendTo($("#xxx"))

})
var childrens = $("#xxx").children();
for (var i = 0; i < childrens.length; i++) {
  var j = Math.floor(Math.random() * childrens.length);
  childrens[i].before(childrens[j]);
}


var toggles = function(id1, id2) {
  $(id1).find("span").on('click', function(e) {
    $(this).appendTo($(id2));


  })
}
if ($("#yyy").children().length > 0) {
  toggles("#yyy", "#xxx");
}

if ($("#xxx").children().length > 0) {
  toggles("#xxx", "#yyy");
}
#yyy {
  background-color: bisque;
  height: 100px;
}

span {
  border width: 1px;
  color: white;
  background-color: darkgreen;
  border-radius: 5px;
  font-size: 16px;
  padding: 1px 5px;
  border-color: darkgreen;
  margin: 5px;
  display: inline-block;
  font-family: sans-serif;
  letter-spacing: 0.5px;
  cursor: pointer;
}

#xxx {
  display: block;
  width: 100%;
  position: relative;
}

#main {
  display: none;
}
<!DOCTYPE html>
<html lang="">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
  <title></title>
</head>

<body>
  <div id="yyy"></div>
  <hr>
  <p id="main">this is a test</p>
  <p id="xxx"></p>
</body>

</html>

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

Вы можете просто делегировать обработку кликов элементам #xxx и #yyy

var s = $("#main").text();
var s1 = s.trim();
var s2 = s1.split(" ");
$.each(s2, function(i, v) {
  $("<span/>").text(v).appendTo($("#xxx"))

})
var childrens = $("#xxx").children();
for (var i = 0; i < childrens.length; i++) {
  var j = Math.floor(Math.random() * childrens.length);
  childrens[i].before(childrens[j]);
}

$('#xxx').on('click', 'span', function() {
  $(this).appendTo($('#yyy'));
})

$('#yyy').on('click', 'span', function() {
  $(this).appendTo($('#xxx'));
})
#yyy {
  background-color: bisque;
  height: 100px;
}

span {
  border width: 1px;
  color: white;
  background-color: darkgreen;
  border-radius: 5px;
  font-size: 16px;
  padding: 1px 5px;
  border-color: darkgreen;
  margin: 5px;
  display: inline-block;
  font-family: sans-serif;
  letter-spacing: 0.5px;
  cursor: pointer;
}

#xxx {
  display: block;
  width: 100%;
  position: relative;
}

#main {
  display: none;
}
<!DOCTYPE html>
<html lang="">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
  <title></title>
</head>

<body>
  <div id="yyy"></div>
  <hr>
  <p id="main">this is a test</p>
  <p id="xxx"></p>
</body>

</html>
0 голосов
/ 25 февраля 2020
  • Сохранение ваших слов -текст в атрибуте data-* (нет необходимости в дополнительных скрытых DIV)
  • Создание массива слов first
  • Перемешать ваш массив слов
  • Создать интервалы , используя jQuery Конструктор элемента и назначить действие нажатия заранее
  • Определите нового родителя (по щелчку), используя $(this).parent().is($xxx) ? $yyy : $xxx
  • Добавьте промежутки к #xxx - все сразу

const shuffle = arr => arr.reduce((a, _, i, o, j) => (j = i + Math.floor(Math.random() * (o.length - i)), [a[j], a[i]] = [a[i], a[j]], a), [...arr]);

const $xxx = $("#xxx");
const $yyy = $("#yyy");
const str = $xxx.data("words").trim().replace(/\s{2,}/g, ' '); // Trim & remove spaces
const words = shuffle(str.split(' '));                         // Create & shuffle array

const $span = (word) => $("<span/>", {
  text: word,
  click() { // Determine where to move the span
    $(this).appendTo($(this).parent().is($xxx) ? $yyy : $xxx);
  }
});

const SPANS = words.map($span); // Convert words into an Array of SPANs
$xxx.append(SPANS);             // Append all at once!
#yyy {
  background-color: bisque;
  min-height: 100px;
}

#yyy span,
#xxx span{
  color: white;
  background-color: darkgreen;
  border-radius: 5px;
  padding: 1px 5px;
  margin: 5px;
  display: inline-block;
  font-family: sans-serif;
  cursor: pointer;
}
<div id="yyy"></div>
<div id="xxx" data-words="  this is   a test "></div>

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
0 голосов
/ 25 февраля 2020

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

var s = $("#main").text();
var s1 = s.trim();
var s2 = s1.split(" ");
$.each(s2, function(i, v) {
  $("<span/>").text(v).appendTo($("#xxx"))

})
var childrens = $("#xxx").children();
for (var i = 0; i < childrens.length; i++) {
  var j = Math.floor(Math.random() * childrens.length);
  childrens[i].before(childrens[j]);
}


$("#xxx span").click(function() {
  if ($("#yyy").find(this).length) {
    $(this).appendTo("#xxx");
  } else {
    $(this).appendTo("#yyy");
  }
});
#yyy {
  background-color: bisque;
  height: 100px;
}

span {
  border width: 1px;
  color: white;
  background-color: darkgreen;
  border-radius: 5px;
  font-size: 16px;
  padding: 1px 5px;
  border-color: darkgreen;
  margin: 5px;
  display: inline-block;
  font-family: sans-serif;
  letter-spacing: 0.5px;
  cursor: pointer;
}

#xxx {
  display: block;
  width: 100%;
  position: relative;
}

#main {
  display: none;
}
<!DOCTYPE html>
<html lang="">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
  <title></title>
</head>

<body>
  <div id="yyy"></div>
  <hr>
  <p id="main">this is a test</p>
  <p id="xxx"></p>
</body>

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