Разве этот цвет не должен быть зеленым?
Если цвет пролета не должен быть зеленым, то в Chrome он красный.
Спецификация HTML говорит, что он должен быть зеленым, он зеленый в Firefox.
Спецификация HTML использует fetch для получения ресурсов, на которые ссылаются элементы (см. Это, и fetch всегда является асинхронной операцией. Таким образом, вычисленный стиль получается до загрузки новой таблицы стилей, и, следовательно, цвет должен быть зеленым.
var div = document.createElement("div");
document.body.appendChild(div);
var link = document.createElement("link");
link.href = "data:text/css,div { color: red }";
link.rel = "stylesheet";
var div = document.createElement("div");
document.body.appendChild(div);
var link = document.createElement("link");
link.href = "data:text/css,div { color: red }";
link.rel = "stylesheet";
document.head.appendChild(link);
document.querySelector("span").style.color = getComputedStyle(div).color;
link.remove();
div.remove();
div { color: green }
<span>This should be green</span>
2 ответа
Чтобы упростить анализ, я сократил ваш образец, чтобы удалить повторяющиеся и нерелевантные строки; для воспроизведения проблемы достаточно:
var div = document.createElement("div");
document.body.appendChild(div);
var link = document.createElement("link");
link.href = "data:text/css,div { color: red }";
link.rel = "stylesheet";
document.head.appendChild(link);
document.querySelector("span").style.color = getComputedStyle(div).color;
div {color:green}
<span>This is a span</span>
<div>this is a div</div>
Так что здесь происходит встроенный CSS, который говорит, что div должен быть зеленым; вы генерируете текстовую / CSS-ссылку, которая устанавливает divs в красный цвет, и добавляете ее к заголовку документа. Тогда вы используете getComputedStyle
скопировать цвет из div на span.
В Safari, Chrome и Edge обе строки заканчиваются красным; в Firefox диапазон - зеленый, а div - красный.
НО! при первой загрузке, или если вы загрузите эту страницу в Safari или Chrome с чистым, пустым кешем *, вы увидите то же поведение, что и в Firefox: зеленый промежуток и красный div. Edge никогда не ведет себя как FF, он всегда красный для обоих даже при первой загрузке.
* (В Safari вы можете просто использовать личное окно просмотра. Могу поклясться, что однажды видел то же самое в Chrome, но больше не могу воспроизвести; возможно, я ошибся.)
Поэтому вот моя гипотеза о том, что происходит:
- В Safari, когда созданная ссылка на таблицу стилей никогда не использовалась ранее, она асинхронная, поэтому
getComputedStyle
подбирает цвет из встроенного стиля. При последующих загрузках сгенерированная таблица стилей уже находится в кеше, когдаgetComputedStyle
работает, поэтому его правило вступает во владение. - В Firefox ссылки на таблицы стилей всегда обрабатываются как асинхронные, поэтому getComputedStyle всегда выбирает встроенное правило.
- В других браузерах ссылка на таблицу стилей интерпретируется синхронно (возможно, потому что браузер может сказать, что
data
URI не требует сетевого времени?), Поэтому обрабатывается раньшеgetComputedStyle
пробеги.
Это достаточно странный крайний случай, и я не уверен, какое поведение можно описать как "согласно спецификации".
Попробуйте HTML или HTML5 (это Chrome):
<span type="color:green">shouldn't this be green</span>