var oFra = document.createDocumentFragment();
// oFra.[add elements];
document.createElement("div").id="myId";
oFra.getElementById("myId"); //not in FF
Как я могу получить "myId" перед прикреплением фрагмента к документу?
var oFra = document.createDocumentFragment();
// oFra.[add elements];
document.createElement("div").id="myId";
oFra.getElementById("myId"); //not in FF
Как я могу получить "myId" перед прикреплением фрагмента к документу?
Как насчет:
var oFra = document.createDocumentFragment();
var myDiv = document.createElement("div");
myDiv.id="myId";
oFra.appendChild(myDiv);
oFra.getElementById("myId"); //not in FF
Если вы не добавили созданный div
к фрагменту документа, я не уверен, почему getElementById
найдет его?
- изменить
Если вы готовы перевернуть свою собственную функцию getElementById, вы должны получить эту ссылку, потому что этот код работает:
var oFra = document.createDocumentFragment();
var myDiv = document.createElement("div");
myDiv.id = "myId";
oFra.appendChild(myDiv);
if (oFra.hasChildNodes()) {
var i=0;
var myEl;
var children = oFra.childNodes;
for (var i = 0; i < children.length; i++) {
if (children[i].id == "myId") {
myEl = children[i];
}
}
}
window.alert(myEl.id);
Все эти ответы довольно старые, со спины, когда querySelectorAll
и querySelector
не были широко доступны. Следует отметить, что эти две функции, которые принимают селектор CSS как параметры, работают на DocumentFragment
в современных браузерах и должны быть предпочтительным способом решения ситуации в вопросе. Альтернативные решения, представленные в некоторых ответах, будут хорошим подходом для устаревших браузеров, которые не поддерживают querySelectorAll
или querySelector
.
Вот пример использования:
var df = document.createDocumentFragment();
var div = document.createElement('div');
div.id = 'foo';
df.appendChild(div);
var result = df.querySelector('#foo'); // result contains the div element
Хорошая реализация должна сначала использовать обнаружение объекта, чтобы узнать, поддерживает ли браузер. Например:
function getElementByIdInFragment(fragment, id) {
if (fragment.querySelector) {
return fragment.querySelector('#' + id);
} else {
// your custom implementation here
}
}
Нет. DocumentFragment
API минимален: он не определяет никаких свойств или методов, что означает, что он поддерживает только свойства и методы, определенные в Node
API. Поскольку методы getElementById
определены в Document
API, они не могут использоваться с DocumentFragment
.
NickFitz прав, DocumentFragment
не имеет API, который вы ожидаете от Document
или Element
, в стандарте или в браузерах (что является позором; было бы очень удобно иметь возможность устанавливать фрагмент innerHTML
.
Даже фреймворки не помогают вам здесь, поскольку они, как правило, требуют, чтобы узлы были в документе или иным образом использовали методы в контексте node, которые не существуют на фрагментах. Вам, вероятно, придется написать свой собственный, например:
function Node_getElementById(node, id) {
for (var i= 0; i<node.childNodes.length; i++) {
var child= node.childNodes[i];
if (child.nodeType!==1) // ELEMENT_NODE
continue;
if (child.id===id)
return child;
child= Node_getElementById(child, id);
if (child!==null)
return child;
}
return null;
}
Было бы почти наверняка лучше отслеживать ссылки, когда вы идете вперед, чем полагаться на наивную, плохо выполняющую функцию, такую как выше.
var frag= document.createDocumentFragment();
var mydiv= document.createElement("div");
mydiv.id= 'myId';
frag.appendChild(mydiv);
// keep reference to mydiv
Использование jQuery:
// Create DocumentFragment
var fragment = document.createDocumentFragment(),
container = document.createElement('div');
container.textContent = 'A div full of text!';
container.setAttribute('id', 'my-div-1');
container.setAttribute('class', 'a-div-class');
fragment.appendChild(container);
// Query container class when given ID
var div = $('<div></div>').html(fragment);
console.log(div.find('#my-div-1').attr('class'));
jsFiddle: http://jsfiddle.net/CCkFs/
У вас есть накладные расходы на создание div с jQuery. Немного взломанный, но он работает.
Внешний источник, указанный ниже, показал следующий фрагмент кода:
var textblock=document.createElement("p")
textblock.setAttribute("id", "george")
textblock.setAttribute("align", "center")
Отображает другой способ установки параметра ID объекта.
У моего DOM есть фрагмент документа # под тегом элемента.
Это то, что я использую (используя jQuery). Также у меня есть вариант использования, где у меня есть HTML DOM в строке -
var texttemplate = $(filecontents).find('template').html();
$(texttemplate).children()
<p>Super produced One</p>,
<appler-one></appler-one>,
<p>Super produced Two</p>,
<appler-two>…</appler-two>]
$(texttemplate).html()
"<p>Super produced One</p>
<appler-one></appler-one>
<p>Super produced Two</p>
<appler-two>
<p>Super produced Three</p>
<appler-three></appler-three>
</appler-two>"
$(texttemplate).find("appler-one")
[<appler-one></appler-one>]
Самый лучший способ узнать, что вы можете и чего не можете сделать с DocumentFragment
, - это проверить его прототип:
const newFrag = document.createDocumentFragment();
const protNewFrag = Object.getPrototypeOf( newFrag );
console.log( '£ protNewFrag:' );
console.log( protNewFrag );
Я получаю
DocumentFragmentPrototype {getElementById: getElementById(), querySelector: querySelector(), querySelectorAll: querySelectorAll(), prepend: prepend(), append: append(), children: Getter, firstElementChild: Getter, lastElementChild: Getter, childElementCount: Getter, еще 1...}
... который говорит мне, что я могу делать такие вещи, как:
const firstChild = newFrag.children[ 0 ];
PS это не сработает:
const firstChild = Object.getPrototypeOf( newFrag ).children[ 0 ];
... вам будет сказано, что "объект не реализует интерфейс DocumentFragment"