сборщик мусора javascript во всплывающем окне при закрытии - PullRequest
0 голосов
/ 01 мая 2019

Случай:

Хорошо, у меня есть всплывающее окно, которое загружает представление с сервера через ajax, иногда это представление может иметь JavaScript, и я назначаю это представление всплывающему окнус помощью jquery .html(page)

Проблема

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

Возможное решение

Если я использую iframe во всплывающем окне, я думаю, что JavaScript должен быть очищен, потому что он имитируетобновление страницы, но есть ли другой способ? И прав ли я по поводу iframe?

Код:

Ничего особенного, только функция ajax, которая загружает представление:

function ajaxLoad(url1, async, method1, data1, placeOrCallback, loader = false, loadFromParent = false) {
  var placeContent = null;

  $.ajax({
    url: url1,
    headers: {
      'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
    },
    async: async,
    cache: false,
    method: method1,
    data: data1,
    beforeSend: function() {
      if (loader) {
        placeContent = $(placeOrCallback).html();
        $(placeOrCallback).html(spinnerLoader);
      }
    },
    error: function(xhr) {
      console.log("An error occured: " + xhr.status + " " + xhr.statusText + " " + url1);
      console.log(xhr.responseJSON);
      for (key in xhr.responseJSON.errors) {
        snackbar(xhr.responseJSON.errors[key]);
      }
      if (loader === true) {
        $(placeOrCallback).html(placeContent);
      }

    },
    success: function(result) {
      if (typeof placeOrCallback === 'function') {
        placeOrCallback(result);
      } else {
        if (loadFromParent === false)
          $(placeOrCallback).html(result);
        else
          $(placeOrCallback, window.parent.document).html(result);
      }
    }
  });
}

И пример возвращаемого представления:

<script>
    let variables = "something";
    function finishTrain(e) {
        e.parent().remove();
        let amountDom = $("#armyTrain .card[data-type=infantry] .grid .amount");
        let currentAvailable = amountDom.html();
        amountDom.html(Number(currentAvailable) + 1);

    }

    $("#armyTrain .card:not(.locked) > img").on('click', function (e) {
        let armyInProgress = $("#armyInProgress");
        let type = $(this).parent().attr('data-type');
        let trainTime = $(this).parent().attr('data-trainTime');
        // let trainTime = 5;
        ajaxUpload('{{route('train')}}', true, {'unit': type});
        let card = '<div class="col-1">\n' +
            '            <div class="card">\n' +
            '\n' +
            '                <img src="/images/close.svg" alt="close" class="close-btn w-xm">\n' +
            '                <img src="/images/' + type + '.svg" alt="' + type + '">\n' +
            '\n' +
            '                <div class="in-progress" style="width: 50%;">\n' +
            '\n' +
            '                </div>\n' +
            '            </div>\n' +
            '        </div>';


        armyInProgress.append(card);

        runInProgress(armyInProgress.find(".card").last(), trainTime,0,finishTrain)
    })


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