LINUX.ORG.RU

[javascript][DOM] Источник информации

 ,


0

0

Господа, подскажите пожалуйста, где можно почитать про использование DOM модели в javascript. Желательно что-то типа учебника, лучше справочника. Просто сейчас приходится читать про ф-ии DOM, реализованные в php, и потом, на этой основе, делать выводы. Не всегда удобно.

Заранее благодарен.

★★★★★

John.Wiley.JavaScript.Bible.5th.Edition.pdf ?

roy ★★★★★
()

По Java Script у O'Reilly была хорошая книжка, не помню точного названия, с носорогом на обложке.

ef37 ★★
()

>> Просто сейчас приходится читать про ф-ии DOM, реализованные в php, и потом, на этой основе, делать выводы. Не всегда удобно. <<

кроме вышецказанных ссылок на developer.mozilla.org , могу только добавить что в DOM-Level-2 заметил что
ТАМ-ГДЕ в Javascript
[как собственно и рекомундуется в W3C]
-- ставяться "" (пустая строка) , если аргумент КАКБЫ отсутствует
ТО в PHP в этом случае код корректно работает когда в качестве аргументов отправляются NULL-объекты а не пустые-строки (что конечноже нарушает W3C) ..

((например prefix в XML, или нежелание указывать пространство имени в XML))

ну это так... по собственным наблюдениям...

mkfifo
()
Ответ на: комментарий от Deleted

>>NULL namespace это не то же самое, что и "" namespace, если ты об этом. <<

в этомто и проблема... это не одно и тоже и Javascript в Мозиле это понимает,

а вот PHP требует указания NULL, если я хочу ""

mkfifo
()
Ответ на: комментарий от Deleted

> NULL namespace это не то же самое, что и "" namespace, если ты об этом.

м… правильно ли я понял, что в <element property1="1" :property2="2"/> property1 и property2 находятся в разный неймспейсах?

arsi ★★★★★
()
Ответ на: комментарий от arsi

> м… правильно ли я понял, что в <element property1="1" :property2="2"/> property1 и property2 находятся в разный неймспейсах?

чтото с префиксом не то....

тут случайно никто не путает понятия префиксов и неймспейсов... %) %) %)

mkfifo
()
Ответ на: комментарий от Deleted

может я чтото нетак понимаю...

просто чтобы не быть голословными.. возмём DOM-Level-2 и метод setAttributeNS

Javascript в Мозиле:
https://developer.mozilla.org/en/DOM/element.setAttributeNS

в PHP:
http://ru.php.net/manual/en/domdocument.createattributens.php

в спецификации DOM-Level-2:
http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-ElSetAttrNS

и вот как раз в спецификации НЕ сказано что [строковой!] аргумент 'namespaceURI' МОЖЕТ принимать null-объект

(а в W3C -- всё чотко. если не написанно "... or null if ...", значит и не может null)

---

задача -- добавить через DOM-Level-2 аттрибут test="test" (очевидно что без особого XML-пространства имени, да и без XML-префикса соответсвенно)

Javascript:
element.setAttributeNS("", "test", "test");

PHP:
$atr = $element.createAttributeNS(NULL, "test");
$atr.value = "test";

mkfifo
()
Ответ на: комментарий от mkfifo

> тут случайно никто не путает понятия префиксов и неймспейсов... %) %) %)

да, похоже на то %) имеется в виду разница в наличии xmlns="" или отсутствии этого атрибута вообще?

arsi ★★★★★
()
Ответ на: комментарий от mkfifo

> и вот как раз в спецификации НЕ сказано что [строковой!] аргумент 'namespaceURI' МОЖЕТ принимать null-объект

хотя кой чо сказанно (про null) в описании возмужных пораждаемых ошибок (исключений) :

>>>Exceptions:


...

NAMESPACE_ERR: Raised if the qualifiedName is malformed, if the qualifiedName has a prefix and the namespaceURI is null, if the qualifiedName has a prefix that is "xml" and the namespaceURI is different from "http://www.w3.org/XML/1998/namespace", or if the qualifiedName is "xmlns" and the namespaceURI is different from "http://www.w3.org/2000/xmlns/".

...

<<<

тоесть -- "может порадить ошибку, если подано null, но при этом указан определённый префикс" (не наш случай). однако в описании параметра namespaceURI так и не написанно что оно может принимать null-аргумент вообще...

...тоесть тут какбы идёт перестраховка чтоле, что тип какойнить мудак да и написеш null не вовремя...



.. а типа что делать если он напишет null но НЕ-СОВСЕМ-не-вовремя (когда требовалось написать "", а не null) -- тут ничего не сказано :-)

mkfifo
()
Ответ на: комментарий от arsi

> да, похоже на то %) имеется в виду разница в наличии xmlns="" или отсутствии этого атрибута вообще?

мне вообще тоже интересно :-)

...но одно точно могу сказать что xmlns="блаблабла" не влияет на __аттрибуты__ ВООБЩЕ ... (для атрибутов нужен обязательно преффикс, либо подразумевается xmlns поумолчанию, какойбы он не стоял для __элемента__ . для атрибутов именно вот таквот)

mkfifo
()
Ответ на: комментарий от arsi

"":property2 тогда уж.

1.

<a xmlns="http://a">
<b/>
</a>

2.

<a xmlns="http://a">
<b xmlns=""/>
</a>

В 1ом случае b находится в xmlns="http://a", а во втором — в дефолтном для текущего документа. Вроде бы так, хотя сейчас на ночь глядя могу и наврать :) Тут надо спеку глядеть для верности.

Deleted
()
Ответ на: комментарий от Deleted

Что-то явно не так, но в спеке не найду :\ Вобщем, лучше просто не делать так :}

Deleted
()
Ответ на: комментарий от Deleted

> Атрибуты по умолчанию в NULL, насколько я помню, потому и.

нашол кой какой интересной инфы по ссылкам из W3C:

**** НАЧАЛО ЦЫТАТЫ ****

The default namespace can be set to the empty string. This has the same effect, within the scope of the declaration, of there being no default namespace.
<?xml version='1.0'?>
<Beers>
<!-- the default namespace is now that of HTML -->
<table xmlns='http://www.w3.org/TR/REC-html40'>
<th><td>Name</td><td>Origin</td><td>Description</td></th>
<tr>
<!-- no default namespace inside table cells -->
<td><brandName xmlns="">Huntsman</brandName></td>
<td><origin xmlns="">Bath, UK</origin></td>
<td>
<details xmlns=""><class>Bitter</class><hop>Fuggles</hop>
<pro>Wonderful hop, light alcohol, good summer beer</pro>
<con>Fragile; excessive variance pub to pub</con>
</details>
</td>
</tr>
</table>
</Beers>

**** КОНЕЦ ЦЫТАТЫ ****

тоесть элемент поумолчанию это "" (а не NULL)

а таком случае дествительно (с точки зрения W3C) -- логичнее использование

Javascript:
element.setAttributeNS("", "test", "test");

А НЕ

PHP:
$atr = $element.createAttributeNS(NULL, "test");
$atr.value = "test";



источник:

http://www.w3.org/TR/1999/REC-xml-names-19990114/#defaulting
ссылка на который из http://www.w3.org/2000/xmlns/
ссылка на который из http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-ElSetAttrNS

mkfifo
()
Ответ на: комментарий от mkfifo

> ...но одно точно могу сказать что xmlns="блаблабла" не влияет на __аттрибуты__ ВООБЩЕ ...

э… да ладно, очень даже влияет: если xmlns="…" был определён в некотором элементе, то чилдрены унаследуют этот неймспейс, причём как элементы, так и атрибуты этих элементов. если для элемента явно указан префикс, то, если я нигде не туплю, его атрибуты тоже попадают в неймспейс префикса. проще говоря, атрибуты попадают в тот же неймспейс, в котором находится сам элемент, если не указано обратное (отрыл в своём древнем коде): e.setAttributeNS(xlinkns, "href", attr[a]); (при const xlinkns = "http://www.w3.org/1999/xlink";) там у меня ещё было включение в хмл ххтмл, в который включался свж, в который включался ххтмл, в котором был хюи… (да, когда-то у меня было дофига свободного времени ^^'). как-то так %)

arsi ★★★★★
()
Ответ на: комментарий от arsi

фух, всё, вспомнил что к чему (полистал своё старое творчество). но разницы между нуллом и "" что-то не уловил. у меня нулл использовался везде, где необходимо было указать принадлежность атрибута к текущему неймспейсу (т.е. к неймспейсу, в котором находится элемент, которому я устанавливаю атрибут). setAttributeNS("", …, …) я вообще что-то не нахожу…

arsi ★★★★★
()
Ответ на: комментарий от arsi

> э… да ладно, очень даже влияет: если xmlns="…" был определён в некотором элементе, то чилдрены унаследуют этот неймспейс, причём как элементы, так и атрибуты этих элементов.

чилдены -- да, а вот атрибуты, если без префикса -- то как не крути всегда будут в ""-неймспейсе .

тоесть если я в XHTML-коде напишу:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<HTML:html xmlns="MAMA:MYLA:RAMU" xmlns:HTML="http://www.w3.org/1999/xhtml">
<HTML:head>
<HTML:meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<HTML:title></HTML:title>
</HTML:head>
<HTML:body>
<HTML:div>привет мир!</HTML:div>
<HTML:div><HTML:a href="http://www.w3c.org/">Перейти на сайт W3C!</HTML:a></HTML:div>
</HTML:body>
</HTML:html>


-- то это будет совершенно корректная XHTML-страничка (ну и понятное дело, работающщая в обычных браузерах. хотя это и не показатель)

и в ней в элементе
HTML:a href="http://www.w3c.org/">Перейти на сайт W3C!</HTML:a>
аргумент href относиться в пространству имени "" а не "MAMA:MYLA:RAMU"

---

на первый ввзгляд это (такое решение W3C) кажется не-логичным, однако логика насамом деле есть, так как атрибут это ВСЕГОЛИШЬ аттрибут
(по своей значимости он не сильно больше чем TextNode) .

mkfifo
()
Ответ на: комментарий от arsi

> setAttributeNS("", …, …) я вообще что-то не нахожу…

ну судя по спецификации писать setAttributeNS(null, …, …) вместо setAttributeNS("", …, …) -- не является ЯВНОЙ ошибкой.. но и несказано что такое можно..

..так как опятьжетаки:
http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-ElSetAttrNS
>>>qualifiedName of type DOMString

The qualified name of the attribute to create or alter.<<<

ну где тут про null %) %) %)

mkfifo
()
Ответ на: комментарий от arsi

> setAttributeNS("", …, …) я вообще что-то не нахожу…

вероятнее всего ты использовал:

setAttribute(…, …)

mkfifo
()
Ответ на: комментарий от mkfifo

Вообще говоря, насколько я помню (давно это было), DTD позволял указывать, как понимать атрибуты по дефолту без неймспейса. Для данного языка (HTML, например), это значение не меняется, естественно.

Deleted
()
Ответ на: комментарий от mkfifo

> и в ней в элементе
> HTML:a href="http://www.w3c.org/">Перейти на сайт W3C!</HTML:a>

> аргумент href относиться в пространству имени "" а не "MAMA:MYLA:RAMU"


он будет относиться к «HTML», т.к. в этом неймспейсе находится элемент «а», а для «href» не указано отдельного оверрайда. если бы он относился к корневому неймспейсу, то был бы так же успешно проигнорирован, как и в случае с «MAMA:MYLA:RAMU:href». вроде так.

arsi ★★★★★
()
Ответ на: комментарий от mkfifo

> ну судя по спецификации писать setAttributeNS(null, …, …) вместо setAttributeNS("", …, …) -- не является ЯВНОЙ ошибкой.. но и несказано что такое можно..

м… где-то на просторах интернетов (может на той же мозилле) читал о том, что setAttribute то ли на пути к деприкейту, то ли какие-то спорные моменты в её спецификации/реализации, поэтому настоятельно рекомендуется использовать вместо setAttribute(name,value) конструкцию setAttributeNS(null,name,value) (аналогично createElement/createElementNS). как-то так, точно не помню, но в примере был именно null, поэтому и я его использовал.

arsi ★★★★★
()
Ответ на: комментарий от arsi
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8"/>
    <title>test</title>
    <link type="text/css" rel="stylesheet" href="index.css"/>
</head>
<body>
    <div id="d1">Moo!</div>
    <script type="text/javascript">document.getElementById("d1").setAttributeNS(null,"class","works");</script>
    <div id="d2">Wark!</div>
    <script type="text/javascript">document.getElementById("d2").setAttributeNS("","class","works");</script>
</body>
</html>

base.css:

@namespace "http://www.w3.org/1999/xhtml";

.works { color: green; }

В конке 1ый вариант не работает :) В Опере и Fx работают оба.

Deleted
()
Ответ на: комментарий от arsi

arsi> ... поэтому настоятельно рекомендуется использовать вместо setAttribute(...) конструкцию setAttributeNS

согласен!

arsi> но в примере был именно null, поэтому и я его использовал.
Mystra_x64> В конке 1ый вариант не работает :) В Опере и Fx работают оба.

arsi, вот и читайте потом такие примеры, которые операцются на непонятные (несуществующие) спецификации...

хотя чо тут сказать... сам видил немало кривых Example`ов :-)

mkfifo
()
Ответ на: комментарий от arsi

>> он будет относиться к «HTML», т.к. в этом неймспейсе находится элемент «а», а для «href» не указано отдельного оверрайда. если бы он относился к корневому неймспейсу, то был бы так же успешно проигнорирован, как и в случае с «MAMA:MYLA:RAMU:href». вроде так. <<

а вот это как раз легко определяется :-) :-)

простой пример показывающий к чему оно относиться....
несмотря ни на xmlns="MAMA:MYLA:RAMU" ....
на на xmlns:HTML="http://www.w3.org/1999/xhtml" ....

http://img14.imageshack.us/img14/7130/screenshot1pr.png

^--- такой результат мы увидим если добавим Javascript который читает аттрибуты "href" из различных namespace`ов того самого <HTML:a ... />



код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<HTML:html xmlns="MAMA:MYLA:RAMU" xmlns:HTML="http://www.w3.org/1999/xhtml">
<HTML:head>
<HTML:meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<HTML:title></HTML:title>
<HTML:script type="application/x-javascript"><![CDATA[
var Main = function(event) {
var Experiment = function(event) {
var W3C_ancor = document.getElementById("W3C_ancor");

var MAMA_MYLA_RAMU_namespaceURI = "MAMA:MYLA:RAMU";
var xhtml_bla_bla_namespaceURI = "http://www.w3.org/1999/xhtml";
var BLANK_namespaceURI = "";

var message =
"при \"Мама Мыла Раму\"-namespace: href=" +
W3C_ancor.getAttributeNS(MAMA_MYLA_RAMU_namespaceURI, "href") +
"\n\n" +
"при \"www.w3.org 1999 xhtml\"-namespace: href=" +
W3C_ancor.getAttributeNS(xhtml_bla_bla_namespaceURI, "href") +
"\n\n" +
"при ПУСТОМ-namespace: href=" +
W3C_ancor.getAttributeNS(BLANK_namespaceURI, "href") +
"\n\n" +
"так-то! ~__^";

window.alert(message);
};

var ExperimentButton = document.getElementById("ExperimentButton");
if(ExperimentButton!=null){ExperimentButton.addEventListener("click", Experiment, false); }
};
window.addEventListener("load", Main, false);
]]></HTML:script>
</HTML:head>
<HTML:body>
<HTML:div>привет мир!</HTML:div>
<HTML:div><HTML:a id="W3C_ancor" href="http://www.w3c.org/">Перейти на сайт W3C!</HTML:a></HTML:div>
<HTML:div><HTML:input type="button" id="ExperimentButton" value="Эксперимент! #1" /></HTML:div>
<HTML:div style="margin-top: 50px; ">ЭКСПЕРИМЕНТ #2: метод от противного:</HTML:div>
<HTML:div><HTML:input type="text" EXPERIMENTALNYJ:value="Эксперимент #2" xmlns:EXPERIMENTALNYJ="http://www.w3.org/1999/xhtml" /></HTML:div>
</HTML:body>
</HTML:html>


...
...ну и ещё сразу-уже добавил "Эксперимент #2", показывающий что будет если добавить атрибут с явно заданным namsapace "http://www.w3.org/1999/xhtml"

(Эксперимент#2 показывает что аттрибуты из Специфического пространства имени -- попросту игнорируются )

mkfifo
()
Ответ на: комментарий от mkfifo

...

для большей ясности что в XML — XML-namespace Аттрибута НЕ имеет никакого отношения к XML-namespace Элемента (в том числе того элемента чьим аттрибутом оно является) — надабыло написать не:

<HTML:div><HTML:input type="text" EXPERIMENTALNYJ:value="Эксперимент #2" xmlns:EXPERIMENTALNYJ="http://www.w3.org/1999/xhtml" /></HTML:div>

а вот так:

<HTML:div><HTML:input type="text" HTML:value="Эксперимент #2" /></HTML:div>

...

ну да ладно... кому интересно — сами уже наверно попробовали :-) :-)

mkfifo
()
Ответ на: комментарий от mkfifo

а вот что показала Опера:

http://img193.imageshack.us/img193/2200/screenshot21t.png

с разниццой в коде что «Эксперимент #2» изменил на:

<HTML:div style="margin-top: 50px; ">ЭКСПЕРИМЕНТ #2: метод от противного:</HTML:div>
<HTML:div><HTML:input type="text" EXPERIMENTALNYJ:value="Эксперимент #2.0" xmlns:EXPERIMENTALNYJ="http://www.w3.org/1999/xhtml" /></HTML:div>
<HTML:div><HTML:input type="text" HTML:value="Эксперимент #2.1" /></HTML:div>
<HTML:div><HTML:input type="text" EXPERIMENTALNYJ:value="Эксперимент #2.2" xmlns:EXPERIMENTALNYJ="fignya:fihnya:fignya" /></HTML:div>

хм... теперь тогда понятно откуда берётся это недопонимание тематики нэймспейсов и аттрибутов....

...при том что в первом эксперимента Опера вывела инфомацию о том что поумолчанию namespaceURI=«» для атрибутов, ... , таки сёрвавно в «Эксперименте 2» в разработчики Оперы решили-таки ещё и поощьрить «запутавшихся» разработчиков :-)

хитрый ход однако :-)

mkfifo
()

вообще — всю эту тему про NULL и «» я развёл потомучто в PHP программисты провыкли что

"" == NULL
однако...
"" !== NULL
[[...но уж незнаю :-) кто будет назло-сам-себе пользовать === %) %) ]]

---

а вот в Javascript «» и null совсем разные вещщи (такчто тут отболды, как кажется-или-работается — поступать думаю нестоит. а обложиться и перестраховаться спецификациями!!) ...

всё... /me ущёл спать :-) . небуду флудить :-D

mkfifo
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.