Який вірний спосіб включити зображення без src?


234

У мене є зображення, яке я динамічно заповнюватиму src пізніше за допомогою JavaScript, але для зручності я хочу, щоб тег зображення існував при завантаженні сторінки, але просто нічого не відображав. Я знаю, що <img src='' />він недійсний, і який найкращий спосіб зробити це?


4
Це відносно старе питання, але варто врахувати, що зображення без src по суті є безглуздим, і саме тому специфікація говорить, що зображення має мати src, що вказує в першу чергу на якийсь вбудований ресурс. Якщо ви думаєте про валідність та / або семантику, вам набагато краще, якщо повністю опустити зображення та додати його після факту, оскільки HTML не дає способу вказати зображення заповнювача, яке буде заповнено даними пізніше.
BoltClock

1
Використовуючи плагін jQuery для ледачого завантаження Mika Tuupola, він використовує розмітку '<img class = "lazy" data-original = "img / example.jpg" width = "640" height = "480">', тож у певному сенсі ви потрібно вказати на джерело, але це не обов'язково робити з атрибутом src.
iWillGetBetter

Ви можете використовувати Div елемент замість цього см це => stackoverflow.com/a/5513934/1395101
Амін Гадера

Відповіді:


237

Хоча немає правильного способу опустити джерело зображення, є джерела, які не спричинять звернення сервера. Нещодавно у мене була схожа проблема з iframes і визначила //:0себе найкращим варіантом. Насправді ні!

Починаючи з //(опускання протоколу) змушує використовувати протокол поточної сторінки, запобігаючи попередженням "небезпечного вмісту" на сторінках HTTPS. Пропускати ім'я хоста не потрібно, але він скорочує. Нарешті, порт :0гарантує, що запит сервера неможливо зробити (це недійсний порт відповідно до специфікації).

Це єдина URL-адреса, за якою я виявив, що в жодному браузері не було звернень або повідомлень про помилки. Звичайний вибір - javascript:void(0)- призведе до попередження "незахищеного вмісту" в IE7, якщо він використовується на сторінці, що обслуговується через HTTPS. Будь-який інший порт спричинив спробу підключення до сервера, навіть для недійсних адрес. (Деякі веб-переглядачі просто роблять недійсний запит і чекають, коли час вичерпається.)

Це було протестовано в Chrome, Safari 5, FF 3.6 та IE 6/7/8, але я б очікував, що він працюватиме в будь-якому браузері, оскільки він повинен бути мережевим шаром, який знищує будь-який спробу запиту.


16
Ця відповідь може змусити ваш брандмауер попереджати про доступ до порту 0, наприклад. Або це може спричинити журнал безпеки сервера. Надання відповіді about:blank, мабуть, краще рішення.
Флоріан Маргайн

10
Через це для мене відображається значок зламаного зображення. Хтось ще бачив це? Я використовую останній Firefox (27).
dmikester1

10
Це також не відповідає валідатору w3c: Неправильне значення //: 0 для атрибута src для елемента img: Недійсний хост: порожній хост.
ysrb

Це не працює: у мене є програма ASP.NET MVC 4, яка містить плагін галереї зображень під назвою очищення. Плагін створює зображення динамічно, і він ставить //: 0 o src, поки зображення фактично не буде отримано. Це змусило двічі викликати дію індексу мого контролера. Тож будьте обережні.
jpgrassi

2
У Firefox 38 такий підхід запускає onerrorобробник зображення .
Нейт Уіттакер

221

Ще один варіант - вставити порожнє зображення. Буде зроблено будь-яке зображення, яке відповідає вашому призначенню, але наступний приклад кодує GIF, що має лише 26 байт - від http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever

<img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" width="0" height="0" alt="" />

Редагувати на основі коментаря нижче:

Звичайно, ви повинні врахувати вимоги щодо підтримки свого браузера. Немає уваги підтримка IE7 або менше. http://caniuse.com/datauri


14
Чудова ідея! Однак для мене це вбиває елемент зображення - якщо комусь потрібні інші аспекти imgелемента, щоб показати, наприклад, фон та межу, спробуйте src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="взяти з прозорого gif розміром 1px x 1px, який я зробив I Photoshop, просунутий
user56reinstatemonica8

4
Можливо, ви захочете подумати над тим, як вкласти свої ресурси за допомогою URI даних: mobify.com/blog/data-uris-are-slow-on-mobile
shawnjan

1
Життєздатність цієї опції залежить від того, які браузери ви повинні підтримувати: caniuse.com/datauri
Jeff Clemens

6
Ось прозорий PNG з 1 пікселем:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgYAAAAAMAASsJTYQAAAAASUVORK5CYII=
Keavon

2
Прозорий URL-адреса зображення, яка працювала для мене,data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
Vikram Rao

34

Цього дня IMHO найкращий короткий, розумний та дійсний спосіб для порожнього src img:

<img src="data:," alt>
or
<img src="data:," alt="Alternative Text">

У другому прикладі відображається "Альтернативний текст" (плюс значок із розбитим зображенням у Chrome та IE).

"data:,"є дійсним URI. Порожні параметри мультимедійного типу до text/plain. Отже, він представляє порожній текстовий файл і еквівалентний"data:text/plain,"


ОТ: Усі браузери розуміють просто alt. Ви можете пропустити ="", це неявно за специфікацією HTML.


1
Немає помилки HTML під час перевірки валідатора W3C. Немає зайвого запиту. Ems Здається, це дійсний спосіб, як це зробити.
Кай Ноак

Найкраще! Ще одна річ, якщо ви хочете, щоб вона підтвердилась у srcset, використовуйтеsrcset="data:,x"
Lucian Davidescu

18

Я рекомендую динамічно додавати елементи, і якщо ви використовуєте jQuery або іншу бібліотеку JavaScript, це досить просто:

також дивись на prependі append. В іншому випадку, якщо у вас є такий тег зображень, і ви хочете зробити його валідаційним, ви можете розглянути можливість використання фіктивного зображення, наприклад, 1px прозорого gif або png.


7
+1 Це найкраща відповідь. Якщо джерело зображення все одно задається динамічно, весь елемент повинен бути доданий динамічно. Якщо ви не хочете, щоб його було видно до встановлення src, я не можу придумати жодної вагомої причини, чому елемент повинен бути там перед цим.
Ендрю Енслі

15

Я цього не робив давно, але мені довелося один раз пройти те саме.

<img src="about:blank" alt="" />

Моя улюблена - з //:0них випливає, що ви спробуєте встановити HTTP / HTTPS-з'єднання з початковим сервером на нульовому порті (порт tcpmux?) - це, мабуть, нешкідливо, але я б краще все одно не робив. Чортів, браузер може побачити порт нульовий і навіть не надсилати запит. Але я все-таки вважаю за краще це не вказано таким чином, коли це, мабуть, не те, що ви маєте на увазі.

У будь-якому випадку, рендерінг about:blankнасправді дуже швидкий у всіх браузерах, які я тестував. Я просто кинув його у валідатор W3C, і він не скаржився, тому він може бути дійсним.

Редагувати : не робити цього; він працює не у всіх браузерах (він покаже піктограму "зламане зображення", як зазначено в коментарях до цієї відповіді). Використовуйте <img src='data:...розчин нижче. Або якщо ви не переймаєтесь дійсністю, але все ж хочете уникати зайвих запитів на вашому сервері, ви можете зробити <img alt="" />атрибут no src. Але це ІНВАЛІД HTML, тому вибирайте це уважно.

Тестова сторінка, що показує цілу купу різних методів: http://desk.nu/blank_image.php - подається з усіма видами різних доктів та типів вмісту. - як зазначено в коментарях нижче, використовуйте нову тестову сторінку Марка Ормстона за адресою: http://memso.com/Test/BlankImage.html


Це здається чистішим, ніж дозволяти мережевому шару видавати помилку.
Denys Séguret

Принаймні ви впевнені, що дурний брандмауер не запитає дозволу на дзвінок до порту 0 ...
Denys Séguret

1
Варто згадати, що на екрані Chrome (а також, ймовірно, також у інших браузерах) відображається значок "зламаного зображення"
user56reinstatemonica8

1
Це гірше, ніж я думав - навіть із доктрипом html5, схоже, він не працює в Safari чи Chrome. У мене є тестова сторінка вгору, яка буде вивертати тип вмісту та доктіп сторінки, і поки що моїм улюбленим є: <img />- тег зображення без атрибуту src. Це не вірно (тому немає сенсу вставляти порожній тег alt туди). Я продовжую грати з нею і відповідно оновлюю свою відповідь (або закреслюю її).
Uberbrady

2
Я взяв вашу тестову сторінку та оновив її, так що набагато очевидніше, коли зображення не працюють належним чином. Старе порожнє зображення включене як приклад "Завжди працює", а також короткий опис того, що ви бачите: memso.com/Test/BlankImage.html Це призвело до того, що я зрозумів, що дійсний gif- файл порожніх даних є єдиним для багаторазового використання варіант для сучасних веб-переглядачів, окрім старого пустого gif-зображення (який ще потрібен для старого IE7 та нижче)
Марк Ормстон,

12

Як написано в коментарях, цей метод неправильний.

Я раніше не знайшов цієї відповіді, але згідно з дійсним порожнім тегом W3 Specs специфікаціяsrc буде прив’язною ланкою #.

Приклад: src="#",src="#empty"

Сторінка успішно перевірена і додаткові запити не надсилаються.


1
Чи є якісь аргументи проти такого підходу? Як це у веб-переглядачах?
тремтіння

18
Я бачив, як Firefox та Chrome роблять другий запит під час використання цього підходу, тому я не рекомендував би його.
Маріус

5
Firefox, Chrome роблять другий запит, навіть JMeter розбирає img src, що призводить до рекурсивного завантаження сторінки (до досягнення максимальної глибини)
burna

1
У FF ви повинні натиснути кнопку "Назад" браузера двічі, якщо ви хочете залишити сторінку, тому що URL-адреса змінюється загадково ..
Kalaschni

3
Це явно неправильно. Усі, кому трапляється читати коментарі - НЕ ВИКОРИСТОВУЮТЕ ЦЕ
Майстер тіней

11

Я виявив, що просто встановити src на порожню рядок і додати правило до CSS, щоб приховати піктограму зламаного зображення, працює чудово.

[src=''] {
    visibility: hidden;
}

[ng-src = ''] {видимість: приховано; } якщо ви використовуєте директиву ng-src в angularjs
Іван Паредес,

1
Зауважте, що src повинен бути встановлений '', він не повинен бути визначеним.
Вінсент Хох-Дрей

Якщо я не помиляюся, запит все одно буде виконаний
Ніко

9

якщо ви зберігаєте атрибут src порожнім браузером, він надішле запит до URL-адреси поточної сторінки, завжди додайте 1 * 1 прозорий img у атрибут src, якщо не хочете будь-якого URL

src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA="

1
Це відображатиметься як чорна точка в деяких браузерах.
tomasz86

IE8 напевно, і старіші версії Firefox в відповідно до stackoverflow.com/questions/9126105 / ...
tomasz86

1
цей src data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==працював, хоча
Макс Ярі

9

Я виявив, що використовуючи:

<img src="file://null">

не зробить запит і перевірить правильно.

Браузери просто заблокують доступ до локальної файлової системи.

Але, наприклад, у журналі консолі в Chrome може відображатися помилка:

Not allowed to load local resource: file://null/

2
Хочете пояснити голосування? Зауважте, що я не рекомендую використовувати цей метод, просто надаючи справу для обговорення. І це задоволення вимог з питання, щоб правильно перевірити та не робити додаткових запитів.
тенкод

8

Використовуйте справді порожній, дійсний і дуже сумісний SVG на основі цієї статті :

src="data:image/svg+xml;charset=utf8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%3E%3C/svg%3E"

Він за замовчуванням розміром до 300x150px, як це робить будь-який SVG, але ви можете працювати з цим у своїх imgстилях за замовчуванням елементів, як це, можливо, знадобиться в будь-якому випадку в практичній реалізації.


Дякую за оновлення вашої відповіді, але я підозрюю, що сумісність для цього ще гірша, ніж інші рішення урі даних, враховуючи, що ви використовуєте svg, який не був сумісний до IE9. На щастя, минуло певний час, коли мені довелося підтримувати спадщину IE, але вона все ще стосується деяких людей.
funkylaundry

Але це не страждає від тих же питань, що в цій статті? dev.mobify.com/blog/data-uris-are-slow-on-mobile . Я думаю, що варіант <img src = "about: blank"> з рішенням css img [src = "about: blank"] {opacity: 0} найкращим є рішення. Або якщо цей рівень CSS-селектора не підтримується у старих браузерах, просто наведіть тег img клас типу "завантаження" чи щось. А ще краще - присвойте йому клас, використовуйте JavaScript для обміну даними-src, а потім встановіть функцію завантаження зображення, щоб зникнути при завантаженні. Ви також можете встановити спінер, який відображатиметься під час завантаження. Виглядає справді професійно.
Джордан Картер

@JordanCarter Звичайно, якщо детальна робота викликає занепокоєння. Як сторона, я б сказав visibility: hidden, що це трохи більше, ніж opacity: 0для селекторів атрибутів, які ви пропонуєте.
mystrdat

6

Будуючи відповідь Бен Бланка, єдиний спосіб, який я отримав для перевірки валідатора w3, виглядав так:

<img src="/./.:0" alt="">`

Це підтверджує, але це призводить до розбитого зображення в Firefox, навіть із порожнім altатрибутом.
Джеймс Райт

4

Я особисто використовую about:blank srcі маю справу зі значком зламаного зображення, встановлюючи непрозорість imgелемента 0.


7
Тепер це брудно!
mystrdat

@mystrdat: Потрібно уточнити, чому це брудно? Прийнята відповідь із використанням "//: 0" все ще дала мені значок зламаного зображення плюс дивний ніколи не закінчуваний запит на Firefox. Альтернатива одиночного пікселя base64 png, також з великою кількістю голосів, створила мені проблеми при використанні <img> як заповнювача, як із зазначенням висоти та ширини, так і без неї. Це найчистіший спосіб, який я знайшов досягти своєї мети без зайвих запитів і проходження всіх лінерів та перевірок.
Мігель

Всі вищевикладені рішення дуже нерозумні, прийняте включене, я зроблю нову відповідь, як тільки отримаю ще трохи часу.
mystrdat

@mystrdat: Я б із задоволенням дізнався, що ти маєш сказати з цього приводу?
funkylaundry

1
@funkylaundry Вибачаюсь за великі претензії та зникнення, опублікувавши свою відповідь зараз. Я також визнаю, що раніше не помічав інших рішень URI даних, з якими я згоден, але я все-таки вважаю, що мій перевершує синтаксис.
mystrdat

4
<img src="invis.gif" />

Де invis.gif - прозорий gif в один піксель. Це не порушить майбутні версії браузера і працює у застарілих браузерах з 90-х.

png також повинен працювати, але в моїх тестах, gif склав 43 байти, а png - 167 байт, тому gif виграв.

ps не забудьте тег alt, валідатори також їм подобаються.


-1

Просто так:

<img id="give_me_src"/>

4
Недобра ідея відповідно до специфікації : атрибут src повинен бути присутнім і повинен містити дійсну URL-адресу ...
Michael Litvin

1
Можливо, він добре працює в хромі, але він видасть помилки у валідації html, і це не HTML-
код
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.