Pergunta

Eu tenho envolvido em uma discussão sobre DOM implementação peculiaridades de ontem, com deu origem a uma interessante pergunta sobre o Texto.splitText e Elemento.normalizar comportamentos, e como eles devem se comportar.

No DOM Nível 1 Núcleo, Texto.splitText é definido como...

Quebras este Texto nó em dois nós de Texto no deslocamento especificado, mantendo tanto na árvore como irmãos.Este nó, em seguida, apenas contém todo o conteúdo até o deslocamento de ponto.E um novo nó de Texto, que é inserido como o próximo irmão deste nó, contém todo o conteúdo e depois o deslocamento de ponto.

Normalizar é...

Coloca todos os nós de Texto em toda a profundidade da sub-árvore sob esse Elemento em um "normal" formulário onde apenas de marcação (por exemplo, tags, comentários, instruções de processamento, seções CDATA, e referências de entidade) separa de nós de Texto, por exemplo, não há nenhum Texto adjacente nós.Isso pode ser usado para garantir que o DOM de exibição de um documento é o mesmo como se ele foram salvos e re-carregada, e é útil quando as operações (tais como o XPointer pesquisas) que dependem de um determinado documento estrutura de árvore são para ser usados.

Então, se eu tomar um nó de texto contendo "Hello World", referenciada no textNode, e fazer

textNode.splitText(3)

textNode agora tem conteúdo "Olá", e um novo irmão contendo "Mundo"

Se eu, então,

textNode.parent.normalize()

o que é textNode?A especificação de não deixar claro que textNode tem de ser ainda uma criança de seu pai anterior, apenas atualizado para conter todo o texto adjacente nós (o que, em seguida, são removidas).Parece ser um conforment comportamento para remover todos os adjacentes nós de texto e, em seguida, recriar um novo nó com a concatenação dos valores, deixando textNode apontando para algo que não é mais parte da árvore.Ou, nós podemos atualizar textNode da mesma forma como no splitText, por isso mantém é árvore de posição, e obtém um novo valor.

A escolha de comportamento é realmente muito diferentes, e eu não consigo encontrar um esclarecimento sobre o que é correto, ou se foi apenas um descuido na especificação (não parece ser esclarecida nos níveis 2 ou 3).Pode qualquer DOM/XML gurus lá fora, lançar alguma luz?

Foi útil?

Solução

Eu estava no DOM do Grupo de Trabalho nos primeiros dias;Eu tenho certeza que nós significava para textNode para conter o novo valor associado, mas se nós não dizer é na especificação, é possível que alguns implementação pode criar um novo nó em vez de reutilizar textNode, embora necessite de mais trabalho para os implementadores.

Quando em dúvida, programa defensivamente.

Outras dicas

Apesar de parecer uma suposição razoável, eu concordo que ele não é explicityly claro na especificação.Tudo o que posso acrescentar é que a maneira como eu lê-lo, um dos dois textNode ou é novo irmão (i.e.o valor de retorno do splitText) deverá conter o novo valor associado - a instrução especifica que todos os nós na sub-árvore coloque na forma normal, não que a sub-árvore é normalizada para uma nova estrutura.Eu acho que a única coisa segura é manter uma referência para o pai antes de normalização.

Eu acho que todas as apostas estão fora aqui;Eu certamente não iria depender de um dado comportamento.A única coisa segura a fazer é obter o nó de seu pai novamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top