Создание объекта в javascript, который можно настроить на сброс из jQuery UI - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь перетащить элементы в Dropbox, который создается с помощью JavaScript. Я хочу отображать сообщение всякий раз, когда я помещаю его в один из синих выпадающих списков. К сожалению, это не работает на новом объекте. Если я создаю холст в html-коде, он работает. Спасибо за вашу помощь!

JS Fiddle: https://jsfiddle.net/tk8sLn9e/

HTML

<html>
<head>
    <link rel="stylesheet" href="StyleSheet.css" />

    <meta charset="utf-8" />
    <title></title>

    <script src="Scripts/jquery-3.3.1.js" type="text/javascript"></script>
    <script src="Scripts/jquery-ui-1.12.1.js" type="text/javascript"></script>
    <script src="JavaScript.js"></script>
</head>
<body>

    <div class="outerContainer">
        <div class="tile">Price</div>
        <div class="tile">Shares Outstanding</div>
        <div class="tile">Market Cap</div>
    </div>

</body>
</html>

JS

$(document).ready(function () {
    $('.tile').draggable({
        helper: 'clone',
        stack: ".tile",
        start: function (event, ui) { createDropBox() },
        stop: function (event, ui) { deleteDropBox() }
    });

    $('.dropContainer').droppable({
        drop: function (event, ui) {alert("alarm")}
    });
})

var dropBoxWidth = 200;
var dropBox1Height = 75;
var dropBoxHeight = 150;

var dropBox1X = 240;
var dropBox1Y = 10;
var dropBox2X = dropBox1X;
var dropBox2Y = dropBox1Y + dropBox1Height + 50;
var dropBox3X = dropBox1X + dropBoxWidth + 100;
var dropBox3Y = dropBox1Y;

function createDropBox() {
    drawRectangle(dropBox1X, dropBox1Y, dropBoxWidth, dropBox1Height, "dropBox1");
    drawRectangle(dropBox2X, dropBox2Y, dropBoxWidth, dropBoxHeight, "dropBox2");
    drawRectangle(dropBox3X, dropBox3Y, dropBoxWidth, dropBoxHeight, "dropBox3");
}

function drawRectangle(left, top, width, height, id) {
    var dropBox = document.createElement("canvas");
    dropBox.style.position = "absolute";
    dropBox.style.left = left + "px";
    dropBox.style.top = top + "px";
    dropBox.style.width = width + "px";
    dropBox.style.height = height + "px";
    dropBox.style.backgroundColor = "#d8ecf3";
    dropBox.style.border = "solid lightblue";
    dropBox.style.borderRadius = "10px";
    dropBox.id = id;
    dropBox.className = "dropContainer";
    document.body.appendChild(dropBox);
}

function deleteDropBox() {
    var element1 = document.getElementById("dropBox1");
    var element2 = document.getElementById("dropBox2");
    var element3 = document.getElementById("dropBox3");
    element1.parentNode.removeChild(element1);
    element2.parentNode.removeChild(element2);
    element3.parentNode.removeChild(element3);
}

1 Ответ

0 голосов
/ 11 ноября 2018

Взгляните на следующий код:

JavaScript

$(function() {
  var boxes = [{
      id: "dropBox1",
      class: "dropContainer",
      props: {
        top: 10,
        left: 240,
        width: 200,
        height: 75
      }
    },
    {
      id: "dropBox2",
      class: "dropContainer",
      props: {
        top: 225,
        left: 240,
        width: 200,
        height: 150
      }
    }, {
      id: "dropBox3",
      class: "dropContainer",
      props: {
        top: 10,
        left: 440,
        width: 200,
        height: 150
      }
    }
  ];

  function drawRectangle(l, t, w, h, id, cn) {
    $("<div>", {
        id: id,
        class: cn
      })
      .css({
        position: "absolute",
        top: t + "px",
        left: l + "px",
        width: w + "px",
        height: h + "px",
        "background-color": "#D8ECF3",
        border: "10px solid lightblue"
      })
      .appendTo("body");
  }

  function makeDropTarget($t) {
    $t.droppable({
      drop: function(event, ui) {
        console.log("DROP:", ui.draggable.text(), "ON:", $(this).attr("id"));
      }
    });
  }

  function createDropBoxes(d) {
    $.each(d, function(k, box) {
      console.log("Create Rect:", box);
      drawRectangle(box.props.left, box.props.top, box.props.width, box.props.height, box.id, box.class);
      makeDropTarget($("#" + box.id));
    });
  }

  function deleteDropBoxes(d) {
    $.each(d, function(k, box) {
      $("#" + box.id).remove();
    });
  }

  $('.tile').draggable({
    helper: 'clone',
    stack: ".tile",
    start: function(event, ui) {
      createDropBoxes(boxes);
    },
    stop: function(event, ui) {
      deleteDropBoxes(boxes);
    }
  });
});

Рабочий пример: https://jsfiddle.net/Twisty/wLrj3k08/

Я бы посоветовал остаться либо со всем собственным JavaScript, либо со всеми jQuery. Это становится проще, когда вы не смешиваете два в своем коде.

Я бы также посоветовал поместить все данные вашего ящика в массив объектов. Упрощает итерацию, хранение и т. Д. Он не должен быть таким сложным, но, на мой взгляд, с ним немного проще работать.

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

  • drawRectangle(l, t, w, h, id, cn) - создает и добавляет <div> с заданными свойствами
  • makeDropTarget($t) - используя объект jQuery в качестве цели, сделайте цель сбрасываемой
  • createDropBoxes(d) - создать в массовом порядке несколько выпадающих блоков на основе конкретных данных блоков (массив объектов)
  • deleteDropBoxes(d) - массовое удаление нескольких выпадающих списков на основе определенных данных (массив объектов)

Возможно, вы захотите сделать функцию создания и удаления для одной цели, но вы можете использовать это и для этого:

deleteDropBoxes([{id: "dropBox1"}]);

Это сработает для удаления одной из целей перетаскивания по идентификатору.

Надеюсь, это поможет.

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