Skip to content

Commit 8979e9f

Browse files
committed
up
1 parent d4bdde5 commit 8979e9f

File tree

7 files changed

+725
-0
lines changed

7 files changed

+725
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
3+
```html run height=100
4+
<body>
5+
6+
<div id="widget" data-widget-name="menu">Выберите жанр</div>
7+
8+
<script>
9+
var div = document.getElementById('widget');
10+
11+
var widgetName = div.getAttribute('data-widget-name');
12+
// или так, кроме IE10-
13+
var widgetName = div.dataset.widgetName;
14+
15+
alert( widgetName ); // "menu"
16+
</script>
17+
</body>
18+
```
19+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!DOCTYLE HTML>
2+
<html>
3+
4+
<body>
5+
6+
<div id="widget" data-widget-name="menu">Выберите жанр</div>
7+
8+
<script>
9+
// ваш код
10+
</script>
11+
12+
</body>
13+
14+
</html>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
importance: 5
2+
3+
---
4+
5+
# Получите пользовательский атрибут
6+
7+
1. Получите `div` в переменную.
8+
2. Получите значение атрибута `"data-widget-name"` в переменную.
9+
3. Выведите его.
10+
11+
Документ:
12+
13+
```html
14+
<body>
15+
16+
<div id="widget" data-widget-name="menu">Выберите жанр</div>
17+
18+
<script>
19+
/* ... */
20+
</script>
21+
</body>
22+
```
23+
24+
[edit src="solution" task]
25+
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
2+
Сначала можно найти ссылки, например, при помощи `document.querySelectorAll('a')`, а затем выбрать из них нужные.
3+
4+
Затем определимся -- что использовать для проверки адреса ссылки: свойство `href` или атрибут `getAttribute('href')`?
5+
6+
Различие между ними заключается в том, что свойство будет содержать полный путь ссылки, а атрибут -- значение, указанное в HTML.
7+
8+
Если открыть страницу локально, на диске, то для `<a href="/tutorial">` значения будут такими:
9+
10+
- `a.getAttribute('href') == "/tutorial"`.
11+
- `a.href == "file:///tutorial"` (возможно, в пути будет также буква диска).
12+
13+
Здесь нужен именно атрибут, хотя бы потому, что в свойстве все ссылки уже с хостом и протоколом, а нам надо понять, был ли протокол в `href` или нет.
14+
15+
Правила определения:
16+
17+
- Ссылки без `href` и без протокола `://` являются заведомо внутренними.
18+
- Там, где протокол есть -- проверяем, начинается ли адрес с `http://internal.com`.
19+
20+
Итого, код может быть таким:
21+
```js
22+
var links = document.querySelectorAll('a');
23+
24+
for (var i = 0; i < links.length; i++) {
25+
26+
var a = links[i];
27+
28+
var href = a.getAttribute('href');
29+
30+
if (!href) continue; // нет атрибута
31+
32+
if (href.indexOf('://') == -1) continue; // без протокола
33+
34+
if (href.indexOf('http://internal.com') === 0) continue; // внутренняя
35+
36+
a.classList.add('external');
37+
}
38+
```
39+
40+
...Но, как это часто бывает, знание CSS может упростить задачу. Удобнее и эффективнее здесь -- указать проверки для `href` прямо в CSS-селекторе:
41+
42+
```js
43+
// ищем все ссылки, у которых в href есть протокол,
44+
// но адрес начинается не с http://internal.com
45+
var css = 'a[href*="://"]:not([href^="http://internal.com"])';
46+
var links = document.querySelectorAll(css);
47+
48+
for (var i = 0; i < links.length; i++) {
49+
links[i].classList.add('external');
50+
}
51+
```
52+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<!DOCTYPE HTML>
2+
<html>
3+
4+
<head>
5+
<meta charset="utf-8">
6+
<style>
7+
.external {
8+
background-color: yellow;
9+
}
10+
</style>
11+
</head>
12+
13+
<body>
14+
15+
16+
<a name="list">список</a>
17+
<ul>
18+
<li><a href="http://google.com">http://google.com</a></li>
19+
<li><a href="/tutorial">/tutorial.html</a></li>
20+
<li><a href="local/path">local/path</a></li>
21+
<li><a href="ftp://ftp.com/my.zip">ftp://ftp.com/my.zip</a></li>
22+
<li><a href="http://nodejs.org">http://nodejs.org</a></li>
23+
<li><a href="http://internal.com/test">http://internal.com/test</a></li>
24+
</ul>
25+
26+
27+
<script>
28+
var css = 'a[href*="://"]:not([href^="http://internal.com"])';
29+
var links = document.querySelectorAll(css);
30+
31+
for (var i = 0; i < links.length; i++) {
32+
links[i].classList.add('external');
33+
}
34+
</script>
35+
36+
</body>
37+
38+
</html>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
importance: 3
2+
3+
---
4+
5+
# Поставьте класс ссылкам
6+
7+
Сделайте желтыми внешние ссылки, добавив им класс `external`.
8+
9+
Все ссылки без `href`, без протокола и начинающиеся с `http://internal.com` считаются внутренними.
10+
11+
```html run
12+
<style>
13+
.external {
14+
background-color: yellow
15+
}
16+
</style>
17+
18+
<a name="list">список</a>
19+
<ul>
20+
<li><a href="http://google.com">http://google.com</a></li>
21+
<li><a href="/tutorial">/tutorial.html</a></li>
22+
<li><a href="local/path">local/path</a></li>
23+
<li><a href="ftp://ftp.com/my.zip">ftp://ftp.com/my.zip</a></li>
24+
<li><a href="http://nodejs.org">http://nodejs.org</a></li>
25+
<li><a href="http://internal.com/test">http://internal.com/test</a></li>
26+
</ul>
27+
```
28+
29+
Результат:
30+
31+
[iframe border=1 height=180 src="solution"]
32+

0 commit comments

Comments
 (0)