IE не отправляет динамично добавленные элементы формы

std::string - это класс менеджера ресурсов. Он владеет базовым char*. Выделенная память получает delete d, как только вызывается деструктор объекта std::string, т.е. когда сам объект выходит из области видимости.

То же самое происходит, когда std::string переназначается. Старая память будет освобождена, если она будет маленькой для новой строки и потенциально будет заменена новой памятью кучи. Классы Ressource Management, такие как std::string, имеют сильную гарантию никогда не пропускать память (при условии реализации в соответствии со стандартами).

Поскольку вы назначаете временную копию, копирование (и, следовательно, перераспределение) не требуется. Вместо этого содержимое временного b + b + b будет перемещено в строку. Это означает копирование основного указателя временного объекта в существующий строковый объект и удаление временного владельца этого указателя. Это означает, что временное устройство больше не владеет памятью и, следовательно, не будет delete ее, когда ее деструктор вызывается непосредственно после назначения. Это имеет огромное преимущество: необходимо скопировать только указатель вместо memcpy полной строки.

Другие классы управления ресурсами с такой гарантией включают умные указатели (std::unique_pointer, std::shared_pointer) и коллекции (например, std::vector, std::list, std::map ...).

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

9
задан isherwood 18 April 2019 в 15:02
поделиться

3 ответа

Действительно ли это - ошибка IE?

Кажется так. При создании <вход> элемента через методы DOM IE не вполне берет атрибут 'имени'. Это - sort-there, в котором элемент действительно отправляет, но при попытке получить ‘innerHTML’ представление элемента, это загадочно исчезает. Этого не происходит при создании элемента путем записи непосредственно в innerHTML.

Также при использовании методов навигации формы Уровня 0 DOM, как ‘myform.elements.x.value’, доступ через массив 'элементов' не может работать (так же прямой ‘myform.x’ доступ, который некоторые люди ошибочно используют). В любом случае в эти дни Вы могли бы предпочесть getElementById ().

Так или используйте innerHTML или используйте методы DOM; лучше всего не смешать их при создании полей формы.

Это документируется (см. 'Комментарии'), и наконец зафиксированный в IE8.

В любом случае никогда не делайте:

div.innerHTML + = '...';

Это - только синтаксический сахар для:

div.innerHTML = div.innerHTML + '...';

Другими словами, это должно сериализировать все дочернее содержимое HTML элемента, затем сделать конкатенацию строк, затем повторно проанализировать новую строку назад в элемент, выбросив все исходное содержание. Это означает потерю чего-либо, что не может быть сериализировано: а также поддельные полусозданные атрибуты 'имени' IE, который также означает любые обработчики событий JavaScript, Слушателей DOM или другие пользовательские свойства, которые Вы присоединили к каждому дочернему элементу. Кроме того, ненужные сериализируют/анализируют цикл, является медленным.

7
ответ дан 4 December 2019 в 15:26
поделиться

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

Две вещи я попробовал бы на вашем месте:

  1. Вместо использования setAttribute(), попытайтесь установить name, type и value свойства явно:

    e.name = "text";

  2. Если это не работает, Вам, вероятно, придется включать все эти атрибуты в document.createElement() вызов:

    var e = document.createElement("<input type='text' name='field'>");

    это может на самом деле выдать исключение в некоторых браузерах. Так лучший перекрестный браузер способ пойти был бы:

.

var e;
  try {
    e = document.createElement("<input type='text' name='field'>");
  } catch (ex) {
    e = document.createElement("input");
    e.type = 'text';
    e.name = 'field';
  }
  e.value = 'value';
3
ответ дан 4 December 2019 в 15:26
поделиться

Спасибо bobince и levik для Ваших ответов. Используя тех и еще некоторое экспериментирование, вот мои заключения:

  1. Да это - ошибка IE.

  2. IE 8 исправляет ошибку по данным Microsoft: "Internet Explorer 8 и позже может установить атрибут ИМЕНИ во время выполнения на элементах, динамично созданных с createElement методом".

  3. Ошибка - это: Вызов e.setAttribute("name", "field3") только отчасти определяет имя. Это будет работать, если ничего иного не произойдет с элементом, но, если требуется сериализировать, имя не сериализируется. Таким образом, когда я сказал innerHTML += " " это вызвало сериализацию, которая потеряла имя, таким образом, оно не было восстановлено после десериализации. Никакое имя, никакое включение в представление формы.

  4. Обходное решение № 1: e = document.createElement("<input name='field3' />") работал бы, даже когда сталкивающийся с сериализацией.

  5. Обходное решение № 2: вместо того, чтобы добавлять текст с помощью innerHTML + =, я могу добавить текстовый элемент как это: div.appendChild(document.createTextNode(" "));. Я полагал, что должен быть лучший способ добавить текст, и теперь я знаю это :-).

Удачи,
- jsf

3
ответ дан 4 December 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: