Spec-Zone.ru › Dart 1

dart:html

Метод createFragment

DocumentFragment createFragment(String html, { NodeValidator validator, NodeTreeSanitizer treeSanitizer })

Создать DocumentFragment из фрагмента HTML и убедиться, что он соответствует правилам проверки, указанным в валидаторе или treeSanitizer.

Если поведение по умолчанию для проверки слишком строго, следует создать новый NodeValidator, либо расширив, либо обернув валидатор по умолчанию и переопределив API проверки.

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

Возвращаемое дерево гарантированно будет содержать только узлы и атрибуты, разрешённые предоставленным валидатором.

См. также:

  • NodeValidator
  • NodeTreeSanitizer

Исходный код

DocumentFragment createFragment(String html,
    {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
  if (treeSanitizer == null) {
    if (validator == null) {
      if (_defaultValidator == null) {
        _defaultValidator = new NodeValidatorBuilder.common();
      }
      validator = _defaultValidator;
    }
    if (_defaultSanitizer == null) {
      _defaultSanitizer = new _ValidatingTreeSanitizer(validator);
    } else {
      _defaultSanitizer.validator = validator;
    }
    treeSanitizer = _defaultSanitizer;
  } else if (validator != null) {
    throw new ArgumentError(
        'validator can only be passed if treeSanitizer is null');
  }

  if (_parseDocument == null) {
    _parseDocument = document.implementation.createHtmlDocument('');
    _parseRange = _parseDocument.createRange();

    // Workaround for Safari bug. Was also previously Chrome bug 229142
    // - URIs are not resolved in new doc.
    BaseElement base = _parseDocument.createElement('base');
    base.href = document.baseUri;
    _parseDocument.head.append(base);
  }

  // TODO(terry): Fixes Chromium 50 change no body after createHtmlDocument()
  if (_parseDocument.body == null) {
    _parseDocument.body = _parseDocument.createElement("body");
  }

  var contextElement;
  if (this is BodyElement) {
    contextElement = _parseDocument.body;
  } else {
    contextElement = _parseDocument.createElement(tagName);
    _parseDocument.body.append(contextElement);
  }
  var fragment;
  if (Range.supportsCreateContextualFragment &&
      _canBeUsedToCreateContextualFragment) {
    _parseRange.selectNodeContents(contextElement);
    fragment = _parseRange.createContextualFragment(html);
  } else {
    contextElement._innerHtml = html;

    fragment = _parseDocument.createDocumentFragment();
    while (contextElement.firstChild != null) {
      fragment.append(contextElement.firstChild);
    }
  }
  if (contextElement != _parseDocument.body) {
    contextElement.remove();
  }

  treeSanitizer.sanitizeTree(fragment);
  // Copy the fragment over to the main document (fix for 14184)
  document.adoptNode(fragment);

  return fragment;
}

© 2012 the Dart project authors
Licensed under the Creative Commons Attribution-ShareAlike License v4.0.
https://api.dartlang.org/stable/1.24.3/dart-html/Element/createFragment.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API