Метод createFragment
DocumentFragment createFragment(Создать DocumentFragment из фрагмента HTML и убедиться, что он соответствует правилам проверки, указанным в валидаторе или treeSanitizer.
Если поведение по умолчанию для проверки слишком строго, следует создать новый NodeValidator, либо расширив, либо обернув валидатор по умолчанию и переопределив API проверки.
treeSanitizer используется для обхода сгенерированного дерева узлов и его очистки. Также можно предоставить пользовательский treeSanitizer для выполнения специальных правил проверки, но поскольку API сложнее реализовать, от этого следует отказаться.
Возвращаемое дерево гарантированно будет содержать только узлы и атрибуты, разрешённые предоставленным валидатором.
См. также:
Исходный код
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