Cách hợp lệ để bao gồm một hình ảnh không có src là gì?


234

Tôi có một hình ảnh mà tôi sẽ tự động điền vào một src sau bằng javascript nhưng để dễ dàng, tôi muốn thẻ hình ảnh tồn tại khi tải trang nhưng không hiển thị gì cả. Tôi biết <img src='' />là không hợp lệ, vậy cách tốt nhất để làm điều này là gì?


4
Đây là một câu hỏi tương đối cũ, nhưng đáng để xem xét rằng một hình ảnh không có src về cơ bản là vô nghĩa và đó là lý do tại sao thông số kỹ thuật nói rằng hình ảnh đó phải có một src trỏ đến một số tài nguyên được nhúng ở vị trí đầu tiên. Nếu bạn đang suy nghĩ về tính hợp lệ và / hoặc ngữ nghĩa, bạn sẽ được phục vụ tốt hơn bằng cách bỏ hoàn toàn hình ảnh và thêm nó vào thực tế, vì HTML không cung cấp cách chỉ định hình ảnh giữ chỗ sẽ được điền dữ liệu sau này.
BoltClock

1
Khi sử dụng plugin jQuery tải lười biếng của Mika Tuupola, nó sử dụng markup '<img class = "lazy" data-original = "img / example.jpg" width = "640" height = "480">', vì vậy, theo một nghĩa nào đó, bạn cần trỏ đến một nguồn, nhưng nó không phải được thực hiện với thuộc tính src.
iWillGetBetter

Bạn có thể sử dụng phần tử div thay vì nó, vui lòng xem phần này => stackoverflow.com/a/5513934/1395101
Amin Ghaderi

Câu trả lời:


237

Mặc dù không có cách nào hợp lệ để bỏ qua nguồn hình ảnh, nhưng có những nguồn không gây ra sự cố máy chủ. Gần đây tôi có một vấn đề tương tự với iframes và xác định //:0là lựa chọn tốt nhất. Không, thực sự!

Bắt đầu với //(bỏ giao thức) làm cho giao thức của trang hiện tại được sử dụng, ngăn cảnh báo "nội dung không an toàn" trong các trang HTTPS. Bỏ qua tên máy chủ là không cần thiết, nhưng làm cho nó ngắn hơn. Cuối cùng, một cổng :0đảm bảo rằng yêu cầu máy chủ không thể được thực hiện (đó không phải là một cổng hợp lệ, theo thông số kỹ thuật).

Đây là URL duy nhất mà tôi tìm thấy gây ra không có lần truy cập máy chủ hoặc thông báo lỗi trong bất kỳ trình duyệt nào. Lựa chọn thông thường - javascript:void(0)- sẽ gây ra cảnh báo "nội dung không an toàn" trong IE7 nếu được sử dụng trên một trang được phân phối qua HTTPS. Bất kỳ cổng nào khác gây ra kết nối máy chủ đã cố gắng, ngay cả đối với các địa chỉ không hợp lệ. (Một số trình duyệt chỉ đơn giản là thực hiện yêu cầu không hợp lệ và chờ chúng hết thời gian.)

Điều này đã được thử nghiệm trong Chrome, Safari 5, FF 3.6 và IE 6/7/8, nhưng tôi hy vọng nó sẽ hoạt động trong bất kỳ trình duyệt nào, vì nó sẽ là lớp mạng giết chết mọi yêu cầu đã thử.


16
Câu trả lời này có thể khiến tường lửa của bạn cảnh báo bạn về việc truy cập cổng 0 chẳng hạn. Hoặc nó có thể gây ra một bản ghi bảo mật máy chủ. Câu trả lời tư vấn about:blankcó lẽ là một giải pháp tốt hơn.
Florian Margaine

10
Điều này gây ra một biểu tượng hình ảnh bị hỏng để hiển thị cho tôi. Bất cứ ai khác nhìn thấy điều này? Tôi đang sử dụng Firefox mới nhất (27).
dmikester1

10
Điều này cũng không thành công trình xác nhận w3c: Giá trị xấu //: 0 cho thuộc tính src trên phần tử img: Máy chủ không hợp lệ: máy chủ trống.
ysrb

Điều này không hoạt động: Tôi có một ứng dụng ASP.NET MVC 4 có chứa một plugin bộ sưu tập hình ảnh được gọi là xóa. Plugin tạo các hình ảnh một cách linh hoạt và nó đặt //: 0 o src cho đến khi hình ảnh thực sự được tìm nạp. Điều này đã làm cho hành động chỉ mục của trình điều khiển đồng bộ của tôi được gọi hai lần. Cẩn thận.
jpgrassi

2
Trong Firefox 38, cách tiếp cận này kích hoạt trình onerrorxử lý ảnh .
Nate Whittaker

221

Một lựa chọn khác là nhúng một hình ảnh trống. Bất kỳ hình ảnh nào phù hợp với mục đích của bạn sẽ làm, nhưng ví dụ sau đây mã hóa một GIF chỉ có 26 byte - từ http://probossibleprogramming.com/2009/03/15/the-tiniest-gif-ever

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

Chỉnh sửa dựa trên nhận xét bên dưới:

Tất nhiên, bạn phải xem xét các yêu cầu hỗ trợ trình duyệt của bạn. Không có hỗ trợ cho IE7 hoặc ít hơn là đáng chú ý. http://caniuse.com/datauri


14
Ý tưởng tuyệt vời! Tuy nhiên, đối với tôi, điều này sẽ giết chết thành phần hình ảnh - nếu bất kỳ ai cần các khía cạnh khác của imgyếu tố này để hiển thị, ví dụ như nền và đường viền, hãy thử src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="lấy từ gif trong suốt 1px x 1px Tôi đã tạo ra Photoshop qua cơ sở 64-image.de
user56reinstHRonica8

4
Bạn có thể muốn suy nghĩ hai lần về việc sắp xếp các tài nguyên của mình bằng URI dữ liệu: mobify.com/blog/data-uris-are-slow-on-mobile
shawnjan

1
Khả năng tồn tại của tùy chọn này tùy thuộc vào trình duyệt nào bạn phải hỗ trợ: caniuse.com/datauri
Jeff Clemens

6
Đây là một pixel 1 pixel trong suốt:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgYAAAAAMAASsJTYQAAAAASUVORK5CYII=
Keavon

2
Url hình ảnh trong suốt làm việc cho tôi -data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
Vikram Rao

33

Ngày nay, IMHO cách ngắn gọn, lành mạnh và hợp lệ nhất cho một img src trống là như thế này:

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

Ví dụ thứ hai hiển thị "Văn bản thay thế" (cộng với biểu tượng hình ảnh bị hỏng trong Chrome và IE).

"data:,"là một URI hợp lệ. Một loại phương tiện truyền thông trống mặc định text/plain. Vì vậy, nó đại diện cho một tệp văn bản trống và tương đương với"data:text/plain,"


OT: Tất cả các trình duyệt đều hiểu rõ alt. Bạn có thể bỏ qua ="", nó ẩn theo thông số HTML.


1
Không có lỗi HTML với kiểm tra trình xác nhận W3C. Không có yêu cầu không cần thiết. Có vẻ là cách hợp lệ để làm điều đó.
Kai Noack

Tốt! Một điều nữa, nếu bạn muốn nó xác nhận trong một srcset, hãy sử dụngsrcset="data:,x"
Lucian Davidescu

18

Tôi khuyên bạn nên tự động thêm các phần tử và nếu sử dụng jQuery hoặc thư viện JavaScript khác, điều này khá đơn giản:

cũng nhìn vào prependappend. Mặt khác, nếu bạn có một thẻ hình ảnh như thế và bạn muốn xác thực nó, thì bạn có thể cân nhắc sử dụng một hình ảnh giả, chẳng hạn như gif trong suốt 1px hoặc png.


7
+1 Đây là câu trả lời tốt nhất. Nếu nguồn hình ảnh đang được thiết lập động bằng mọi cách, toàn bộ thành phần sẽ được thêm động. Nếu bạn không muốn nó hiển thị cho đến khi src được đặt, tôi không thể nghĩ ra bất kỳ lý do chính đáng nào tại sao phần tử phải ở đó trước đó.
Andrew Oblley

15

Tôi đã không làm điều này trong một thời gian, nhưng tôi đã phải trải qua điều tương tự một lần.

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

Là sở thích của tôi - điều này //:0ngụ ý rằng bạn sẽ cố gắng tạo kết nối HTTP / HTTPS đến máy chủ gốc trên cổng số 0 (cổng tcpmux?) - có thể vô hại, nhưng tôi không muốn làm gì cả. Heck, trình duyệt có thể thấy cổng số 0 và thậm chí không gửi yêu cầu. Nhưng tôi vẫn muốn nói rằng nó không được chỉ định theo cách đó khi đó có lẽ không phải là ý bạn.

Dù sao, việc kết xuất about:blankthực sự rất nhanh trong tất cả các trình duyệt mà tôi đã thử nghiệm. Tôi vừa ném nó vào trình xác nhận W3C và nó không phàn nàn, vì vậy nó thậm chí có thể hợp lệ.

Chỉnh sửa : Đừng làm điều đó; nó không hoạt động trên tất cả các trình duyệt (nó sẽ hiển thị biểu tượng 'hình ảnh bị hỏng' như được chỉ ra trong các nhận xét cho câu trả lời này). Sử dụng <img src='data:...giải pháp dưới đây. Hoặc nếu bạn không quan tâm đến tính hợp lệ, nhưng vẫn muốn tránh các yêu cầu không cần thiết đến máy chủ của mình, bạn có thể thực hiện <img alt="" />mà không có thuộc tính src. Nhưng đó là HÓA ĐƠN HTML vì vậy hãy chọn nó một cách cẩn thận.

Trang thử nghiệm hiển thị một loạt các phương thức khác nhau: http://desk.nu/blank_image.php - được phục vụ với tất cả các loại tài liệu và loại nội dung khác nhau. - như được đề cập trong các bình luận bên dưới, hãy sử dụng trang thử nghiệm mới của Mark Ormston tại: http://memso.com/Test/BlankImage.html


Điều đó có vẻ sạch hơn là để cho lớp mạng gặp lỗi.
Denys Séguret

Ít nhất bạn chắc chắn một tường lửa ngu ngốc sẽ không xin phép gọi cổng 0 ...
Denys Séguret

1
Điều đáng nói là điều này sẽ hiển thị biểu tượng 'hình ảnh bị hỏng' trên Chrome (và có thể cả các trình duyệt khác nữa)
user56reinstatemonica8

1
Điều đó tệ hơn tôi nghĩ - ngay cả với loại tài liệu html5, nó dường như không hoạt động trong Safari hoặc Chrome. Tôi có một trang thử nghiệm sẽ quay vòng loại Nội dung và Loại tài liệu của một trang và cho đến nay, mục ưa thích của tôi là: <img />- thẻ hình ảnh không có thuộc tính src. Điều này không hợp lệ (vì vậy cũng không có điểm nào đặt thẻ alt trống ở đó). Tôi đang tiếp tục chơi với nó và sẽ cập nhật câu trả lời của tôi (hoặc thông qua nó) cho phù hợp.
Uberbrady

2
Tôi lấy trang thử nghiệm của bạn và cập nhật nó để rõ ràng hơn khi hình ảnh không hoạt động đúng. Hình ảnh trống cũ được đưa vào làm ví dụ "Luôn hoạt động", cũng như mô tả ngắn gọn về những gì bạn đang thấy: memso.com/Test/BlankImage.html Điều này khiến tôi nhận ra rằng gif dữ liệu trống hợp lệ là chỉ có thể sử dụng lại tùy chọn cho các trình duyệt hiện đại, ngoài hình ảnh gif trống cũ (vẫn cần cho IE7 cũ trở xuống)
Đánh dấu Ormston

12

Như đã viết trong bình luận, phương pháp này là sai.

Tôi đã không tìm thấy câu trả lời này trước đây, nhưng theo thẻ trống hợp lệ của Thông số W3src sẽ là một liên kết neo #.

Ví dụ: src="#",src="#empty"

Trang xác nhận thành công và không có yêu cầu thêm được thực hiện.


1
Có bất kỳ lập luận chống lại phương pháp này? Làm thế nào là nó trên các trình duyệt?
run

18
Tôi đã thấy cả Firefox và Chrome đưa ra yêu cầu thứ hai khi sử dụng phương pháp này, vì vậy tôi không khuyến nghị.
Marius

5
Firefox, Chrome đưa ra yêu cầu thứ hai, thậm chí JMeter phân tích cú pháp img src, dẫn đến tải trang đệ quy (cho đến khi đạt được độ sâu tối đa)
burna

1
Trong FF, bạn phải nhấn nút quay lại Trình duyệt hai lần nếu bạn muốn rời trang vì url thay đổi một cách bí ẩn ..
Kalaschni

3
Điều này hoàn toàn sai. Bất kỳ ai tình cờ đọc bình luận - KHÔNG SỬ DỤNG NÀY
Thuật sĩ bóng tối là tai cho bạn

11

Tôi thấy rằng chỉ cần đặt src thành một chuỗi trống và thêm quy tắc vào CSS của bạn để ẩn biểu tượng hình ảnh bị hỏng hoạt động tốt.

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

[ng-src = ''] {mức độ hiển thị: ẩn; } nếu bạn đang sử dụng chỉ thị ng-src trong angularjs
Ivan Paredes

1
Lưu ý, src phải được đặt thành '', nó không được xác định.
Vincent Hoch-Drei

Nếu tôi không nhầm, một yêu cầu vẫn sẽ được thực hiện
Nico

9

Nếu bạn giữ thuộc tính src, trình duyệt trống sẽ gửi yêu cầu tới url trang hiện tại, luôn thêm img 1 * 1 trong suốt thuộc tính src nếu không muốn bất kỳ url nào

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

1
Điều này sẽ được hiển thị dưới dạng một chấm đen trong một số trình duyệt.
tomasz86

Chắc chắn IE8 và các phiên bản Firefox cũ hơn theo stackoverflow.com/questions/9126105/ trên
tomasz86

1
src này data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==đã hoạt động mặc dù
Max Yari

9

Tôi đã thấy rằng sử dụng:

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

sẽ không đưa ra yêu cầu và xác nhận chính xác.

Các trình duyệt sẽ chỉ chặn quyền truy cập vào hệ thống tệp cục bộ.

Nhưng có thể có lỗi hiển thị trong nhật ký bảng điều khiển trong Chrome chẳng hạn:

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

2
Quan tâm để giải thích các downvote? Lưu ý rằng tôi không khuyên bạn nên sử dụng phương pháp này chỉ cung cấp một trường hợp để thảo luận. Và nó đáp ứng các yêu cầu từ câu hỏi để xác nhận chính xác và không đưa ra yêu cầu bổ sung.
tenkod

8

Sử dụng một SVG thực sự trống, hợp lệ và tương thích cao, dựa trên bài viết này :

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

Nó sẽ mặc định có kích thước tới 300x150px như bất kỳ SVG nào, nhưng bạn có thể làm việc với nó theo imgkiểu mặc định phần tử của mình , như bạn có thể cần trong mọi trường hợp trong triển khai thực tế.


Cảm ơn bạn đã cập nhật câu trả lời của bạn, nhưng tôi nghi ngờ khả năng tương thích thậm chí còn tệ hơn cho điều này, so với giải pháp dữ liệu uri khác, cho rằng bạn sử dụng svg không tương thích cho đến IE9. May mắn thay, đã được một thời gian kể từ khi tôi phải hỗ trợ IE kế thừa nhưng nó vẫn phù hợp với một số người.
funkylaundry

Nhưng điều này không phải chịu những vấn đề tương tự như trong bài viết này? dev.mobify.com/blog/data-uris-are-slow-on-mobile . Tôi đang nghĩ tùy chọn <img src = "about: blank"> với giải pháp css img [src = "about: blank"] {opacity: 0} là tốt nhất. Hoặc, nếu mức độ của bộ chọn CSS đó không được hỗ trợ trong các trình duyệt cũ hơn, chỉ cần cung cấp cho thẻ img một lớp như "nạp vào" hoặc một cái gì đó. Tốt hơn nữa, cung cấp cho nó lớp, sử dụng JavaScript để trao đổi dữ liệu-src và sau đó đặt hàm tải cho hình ảnh để làm cho nó mờ dần khi tải. Bạn cũng có thể đặt một vòng quay được hiển thị trong khi đang tải. Trông thật chuyên nghiệp.
Jordan Carter

@JordanCarter Chắc chắn, nếu hiệu suất chi tiết là một mối quan tâm. Là một sidenote, tôi muốn nói visibility: hiddenlà phù hợp hơn một chút so opacity: 0với các công cụ chọn thuộc tính mà bạn đề xuất.
mystrdat

6

Dựa trên câu trả lời của Ben Blank, cách duy nhất mà tôi có được điều này để xác thực trong trình xác nhận w3 là như vậy:

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

Nó xác nhận, nhưng nó dẫn đến hình ảnh bị hỏng trong Firefox, ngay cả với một altthuộc tính trống .
James Wright

4

Cá nhân tôi sử dụng about:blank srcvà xử lý biểu tượng hình ảnh bị hỏng bằng cách đặt độ mờ của imgphần tử thành 0.


7
Bây giờ thì bẩn rồi!
mystrdat

@mystrdat: Quan tâm đến việc giải thích tại sao nó bẩn? Câu trả lời được chấp nhận, sử dụng "//: 0" vẫn cho tôi biểu tượng hình ảnh bị hỏng cộng với yêu cầu kỳ lạ không bao giờ kết thúc trên Firefox. Sự thay thế pixel6464 đơn, với rất nhiều phiếu bầu, đã gây rắc rối cho tôi khi sử dụng <img> làm trình giữ chỗ, cả có và không chỉ định chiều cao và chiều rộng. Đây là cách sạch nhất mà tôi tìm thấy để đạt được mục tiêu của mình mà không có bất kỳ yêu cầu không cần thiết nào và vượt qua tất cả các linters và xác nhận.
Miguel

Tất cả các giải pháp trên đều rất ngớ ngẩn mà một giải pháp được chấp nhận bao gồm, tôi sẽ trả lời mới sau khi tôi có thêm thời gian.
mystrdat 12/2/2015

@mystrdat: Tôi sẽ vẫn vui khi biết bạn nói gì về điều này?
funkylaundry

1
@funkylaundry Tôi xin lỗi vì đã đưa ra yêu sách lớn và biến mất, đăng câu trả lời của tôi ngay bây giờ. Tôi cũng thừa nhận rằng tôi chưa nhận thấy các giải pháp URI dữ liệu khác trước đây, điều mà tôi đồng ý, nhưng tôi tin rằng dù sao thì tôi cũng vượt trội về cú pháp.
mystrdat

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

Trong đó invis.gif là một gif trong suốt pixel. Điều này sẽ không phá vỡ trong các phiên bản trình duyệt trong tương lai và đã hoạt động trong các trình duyệt cũ từ những năm 90.

png cũng hoạt động nhưng trong các thử nghiệm của tôi, gif là 43 byte và png là 167 byte nên gif đã thắng.

ps đừng quên thẻ alt, trình xác nhận cũng giống như chúng.


-1

Đơn giản, như thế này:

<img id="give_me_src"/>

4
Không phải là một ý tưởng hay theo thông số kỹ thuật : Thuộc tính src phải có mặt và phải chứa URL hợp lệ ...
Michael Litvin

1
Có thể nó hoạt động tốt trong chrome, nhưng nó sẽ ném lỗi khi xác thực html và nó không phải là html hợp lệ W3 ...
EhsanT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.