Перетащите <span>в абзац, используя JQuery - PullRequest
1 голос
/ 03 октября 2019

Мне нужно перетащить <span> в <p>. Мой код работает, но у меня есть 3 проблемы,

  1. Когда я редактирую <p> контент, набирая что-то (предположим, три слова) и после перетаскивания <span> в <p> вновь набранные словадействуя как одно слово. Поэтому нельзя перетаскивать перетаскиваемые компоненты между вновь введенным содержимым.

  2. После закрытия добавленные перетаскиваемые компоненты (путем нажатия X) между двумя словами остаются два пробела.

  3. Невозможно удалить перетаскиваемый компонент как 1 слово абзаца.

Чтобы разобрать 3-й выпуск, я добавил &nbsp; к 1-му абзацу,и это отсортировано.

<p class="given" contenteditable="true">&nbsp; Lorem Ipsum is simply dummy</p>

Как я могу разобраться с двумя другими проблемами? Пожалуйста, помогите

$(function() {
  function textWrapper(str, sp) {
    if (sp == undefined) {
      sp = [0, 0];
    }
    var txt = "<span class='w'>" + str + "</span>";
    
    if (sp[0]) {
      txt = "&nbsp;" + txt;
    }
    
    if (sp[1]) {
      txt = txt + "&nbsp;";
    }
    
    return txt;
  }

  function chunkWords(p) {
    var words = p.split(" ");
    words[0] = textWrapper(words[0], [0, 1]);
    var i;
    for (i = 1; i < words.length; i++) {
      if (words[0].indexOf(".")) {
        words[i] = textWrapper(words[i], [1, 0]);
      } else {
        words[i] = textWrapper(words[i], [1, 1]);
      }
    }
    return words.join("");
  }

  function makeBtn(tObj) {
    var btn = $("<span>", {
      class: "ui-icon ui-icon-close"
    }).appendTo(tObj);
    btn.click(function(e) {
      $(this).parent().remove();
    });
  }

  function makeDropText(obj) {
    return obj.droppable({
      drop: function(e, ui) {
        var txt = ui.draggable.text();
        var newSpan = textWrapper(txt, [1, 0]);
        $(this).after(newSpan);
        makeBtn($(this).next("span.w"));
        makeDropText($(this).next("span.w"));
        $("span.w.ui-state-highlight").removeClass("ui-state-highlight");
      },
      over: function(e, ui) {
        $(this).add($(this).next("span.w")).addClass("ui-state-highlight");
      },
      out: function() {
        $(this).add($(this).next("span.w")).removeClass("ui-state-highlight");
      }
    });
  }

  $("p.given").html(chunkWords($("p.given").text()));

  $("span.given").draggable({
    helper: "clone",
    revert: "invalid"
  });

  makeDropText($("p.given span.w"));
});
p.given {
  display: flex;
  flex-wrap: wrap;
}

p.given span.w span.ui-icon {
  cursor: pointer;
}

div.blanks {
  display: inline-block;
  min-width: 50px;
  border-bottom: 2px solid #000000;
  color: #000000;
}

div.blanks.ui-droppable-active {
  min-height: 20px;
}

span.answers>b {
  border-bottom: 2px solid #000000;
}

span.given {
  margin: 5px;
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="row">
  <p class="given" contenteditable="true">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p>
</div>

<div class="divider"></div>
<div class="section">
  <section>
    <div class="card blue-grey ">
      <div class="card-content white-text">
        <div class="row">
          <div id="walkinDiv" class="col s12">
            <span class="given btn-flat white-text red lighten-1" rel="1">the Santee, thDakota</span>
            <span class="given btn-flat white-text red lighten-1" rel="2">America</span>
            <span class="given btn-flat white-text red lighten-1" rel="3">Qatar</span>
            <span class="given btn-flat white-text red lighten-1" rel="4">Philippines</span>
          </div>
        </div>
      </div>
    </div>
  </section>
</div>

Обновлено: 2019-10-22

Я обновил вопрос, потому что столкнулся с проблемой, когдаЯ генерирую перетаскиваемые компоненты <span> из кода. Я сгенерировал перетаскиваемые компоненты следующим образом. Его можно создавать и перетаскивать до <p>. но когда я щелкаю по <p> и щелкаю снаружи из выпадающего компонента <p> (что означает в событии размытия) не отображается кнопка закрытия. это показывает как [Ameriaca] , [Qatatr] Почему это так происходит? как я могу избежать этого. Я назвал это GetAllParameters() внутри $(function() {});

function GetAllParameters() {
    $.ajax({
        type: "POST",
        url: SERVER_PATH + '/service/TestService.asmx/GetAllParameters',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: GetAllNotificationParametersComplete,
        error: GetAllNotificationParameterFailed
    });
}

function GetAllNotificationParametersComplete(result, status) {
    NotificationParameters = JSON.parse(result.d);
    getTemplateparameters(NotificationParameters,'ShowIn');
}

function GetAllNotificationParameterFailed(result) {
    //console.log(result);
}


function getTemplateparameters(data,field) {

    var filtered = data.filter(function(item) {
         return item[field] == true;
    });
 populateTemplateParameters(filtered);
}

function populateTemplateParameters(data) {  
     var obj = data;
     var stringlist = "";
     $.each(obj, function (index, item) {
         stringlist = stringlist + ' <span class="given btn-flat white-text red lighten-1 parameter-wrapper">' +item.ParameterName+ '</span>';
     });
    $("#walkinDiv").html(stringlist);

    $("span.given").draggable({
      helper: "clone",
      revert: "invalid"
    });

  makeDropText($("p.given span.w"));
}

Обновлено: 2019-10-23

Ранее упомянутая проблема возникает, когда перетаскиваемый компонент имеет два словатакие как "Hello World" И одна вещь, которую я опознал. Когда я что-то набираю внутри редактируемого <p> и нажимаю снаружи набранные слова <p>, удаляя, это большая проблема. пожалуйста, помогите мне решить эту проблему

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

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

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

$(function() {
  function textWrapper(str, sp, btn) {
    if (sp == undefined) {
      sp = [0, 0];
    }
    var txt = "";
    if (btn) {
      txt = "<span class='w b'>" + str + "</span>";
    } else {
      txt = "<span class='w'>" + str + "</span>";
    }

    if (sp[0]) {
      txt = "&nbsp;" + txt;
    }

    if (sp[1]) {
      txt = txt + "&nbsp;";
    }

    return txt;
  }

  function chunkWords(p) {
    var words = p.split(" ");
    words[0] = textWrapper(words[0], [0, 1]);
    var i;
    for (i = 1; i < words.length; i++) {
      var re = /\[.+\]/;
      if (re.test(words[i])) {
        var b = makeTextBox(words[i].slice(1, -1));
        words[i] = "&nbsp;" + b.prop("outerHTML") + "&nbsp;";
      } else {
        if (words[0].indexOf(".")) {
          words[i] = textWrapper(words[i], [1, 0]);
        } else {
          words[i] = textWrapper(words[i], [1, 1]);
        }
      }
    }
    return words.join("");
  }

  function unChunkWords(tObj) {
    var words = [];
    $(".w", tObj).each(function(i, el) {
      console.log($(el).text(), $(el).attr("class"));
      if ($(el).hasClass("b")) {
        words.push("[" + $(el).text().trim() + "]");
      } else {
        words.push($(el).text().trim());
      }
    });
    return words.join(" ");
  }

  function makeBtn(tObj) {
    var btn = $("<span>", {
      class: "ui-icon ui-icon-close"
    }).appendTo(tObj);
  }

  function makeTextBox(txt) {
    var sp = $("<span>", {
      class: "w b"
    }).html(txt);
    makeBtn(sp);
    return sp;
  }

  function makeDropText(obj) {
    return obj.droppable({
      drop: function(e, ui) {
        var txt = ui.draggable.text();
        var newSpan = textWrapper(txt, [1, 0], 1);
        $(this).after(newSpan);
        makeBtn($(this).next("span.w"));
        makeDropText($(this).next("span.w"));
        $("span.w.ui-state-highlight").removeClass("ui-state-highlight");
      },
      over: function(e, ui) {
        $(this).add($(this).next("span.w")).addClass("ui-state-highlight");
      },
      out: function() {
        $(this).add($(this).next("span.w")).removeClass("ui-state-highlight");
      }
    });
  }

  $("p.given").html(chunkWords($("p.given").text()));

  $("p.given").on("click", ".b > .ui-icon", function() {
    $(this).parent().remove();
  });

  $("p.given").blur(function() {
    var w = unChunkWords($(this));
    console.log(w);
    $(this).html(chunkWords(w));
    makeDropText($("p.given span.w"));
  });

  $("span.given").draggable({
    helper: "clone",
    revert: "invalid"
  });

  makeDropText($("p.given span.w"));
});
p.given {
  display: flex;
  flex-wrap: wrap;
}

p.given span.w span.ui-icon {
  cursor: pointer;
}

div.blanks {
  display: inline-block;
  min-width: 50px;
  border-bottom: 2px solid #000000;
  color: #000000;
}

div.blanks.ui-droppable-active {
  min-height: 20px;
}

span.answers>b {
  border-bottom: 2px solid #000000;
}

span.given {
  margin: 5px;
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="row">
  <p class="given" contenteditable="true">Lorem Ipsum is simply dummy text of the printing and typesetting industry. [Lorem] Ipsum has been the industry's standard dummy text ever since the 1500s, Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p>
</div>

<div class="divider"></div>
<div class="section">
  <section>
    <div class="card blue-grey ">
      <div class="card-content white-text">
        <div class="row">
          <div class="col s12">
            <span class="given btn-flat white-text red lighten-1" rel="1">the Santee, thDakota</span>
            <span class="given btn-flat white-text red lighten-1" rel="2">America</span>
            <span class="given btn-flat white-text red lighten-1" rel="3">Qatar</span>
            <span class="given btn-flat white-text red lighten-1" rel="4">Philippines</span>
          </div>
        </div>
      </div>
    </div>
  </section>
</div>

Используя событие blur, мы можем вернуть обернутые элементы обратно в текст, а затем снова скопировать их обратно с новым содержимым. Чтобы сохранить кнопки, я использовал [ и ].

Я использовал .on() и .blur() по определенным причинам.

Метод .on() присоединяет событиеобработчики текущего выбранного набора элементов в объекте jQuery. Начиная с jQuery 1.7, метод .on() обеспечивает все функциональные возможности, необходимые для присоединения обработчиков событий.

Преимущество делегированных обработчиков событий заключается в том, что они могут обрабатывать события от элементов-потомков, которые добавляются в документ позднее. Выбрав элемент, который гарантированно будет присутствовать во время присоединения делегированного обработчика событий, вы можете использовать делегированные обработчики событий, чтобы избежать необходимости часто подключать и удалять обработчики событий. Этот элемент может быть контейнерным элементом представления в дизайне Model-View-Controller, например, или document, если обработчик событий хочет отслеживать все всплывающие события в document. Элемент document доступен в head документа перед загрузкой любого другого HTML-кода, поэтому можно прикреплять туда события, не дожидаясь готовности документа.

См. Подробнее: .on ()

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

Этот метод является ярлыком для .on( "blur", handler )

Событие размытия отправляется элементу, когда он теряет фокус. Первоначально это событие было применимо только к элементам формы, таким как <input>. В последних браузерах домен события был расширен, чтобы включить все типы элементов. Элемент может потерять фокус с помощью команд клавиатуры, таких как клавиша Tab, или щелчком мыши в другом месте страницы.

См. Подробнее: .blur ()

0 голосов
/ 03 октября 2019

Чтобы решить первую проблему, вы можете «пересчитывать» слова каждый раз, когда пользователь вводит текст или расфокусирует его в текстовой области. Я бы порекомендовал вам перераспределять / сокращать ваши слова каждый раз, когда пользователь прекращает редактировать текстовую область или каждый раз, когда пользователь вводит пробел (хотя это будет выполняться намного чаще).

Вторая проблема может быть исправлена ​​с помощьюпросто цикл по тексту и удаление, если вы обнаружили, что есть несколько в строке (например, с регулярным выражением).

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