Tiện ích mở rộng của Google Chrome - Không thể tải hình ảnh cục bộ bằng CSS


98

Tôi có một tiện ích mở rộng Chrome đơn giản sử dụng tính năng tập lệnh nội dung để sửa đổi trang web. Cụ thể hơn, background-imagetrang web nói trên.

Vì một số lý do, tôi dường như không thể sử dụng hình ảnh cục bộ, mặc dù chúng được đóng gói trong tiện ích mở rộng.

body {
    background: #000 url('image.jpg') !important;
    background-repeat: repeat !important;
}

Vậy đó, CSS đơn giản nhất ... nhưng nó sẽ không hoạt động. Trình duyệt không tải hình ảnh.


2
Tại sao tiện ích mở rộng sẽ nghĩ rằng url ('image.jpg') là cục bộ? Bạn sẽ không cần một con đường đầy đủ?
Traingamer

Câu trả lời:


70

URL hình ảnh của bạn sẽ giống như chrome-extension://<EXTENSION_ID>/image.jpg

Bạn sẽ tốt hơn nếu thay thế css thông qua javascript. Từ tài liệu :

//Code for displaying <extensionDir>/images/myimage.png:
var imgURL = chrome.extension.getURL("images/myimage.png");
document.getElementById("someImage").src = imgURL;

7
@Salem Bởi vì nếu không, bạn sẽ cần mã hóa id tiện ích mở rộng của mình trong css.
serg

Không phải là ngu ngốc, nhưng tại sao đó là một vấn đề?
Salem

4
@Salem Sẽ rất bất tiện nếu phát triển dưới dạng id tiện ích mở rộng được giải nén và tải lên thư viện một id khác. Đó không phải là ngày tận thế, chỉ là sự bất tiện và kiểu thực hành không tốt, giống như việc mã hóa tệp tin tuyệt đối mã hóa chẳng hạn.
serg

À, có lý. Tôi rât cảm kich.
Salem

Vì đây là câu trả lời được chấp nhận, bạn sẽ thấy nhận xét về câu trả lời khác mà ariera đã đề cập về việc bao gồm web_accessible_resources trong tệp kê khai của bạn để truy cập phông chữ và hình ảnh cục bộ.
Aryan Firouzian

254

Chrome có hỗ trợ i18n cung cấp khả năng tham chiếu đến tiện ích mở rộng trong CSS của bạn. Tôi giữ hình ảnh của mình trong thư mục hình ảnh trong tiện ích mở rộng, vì vậy, hãy tham chiếu các nội dung trong CSS như sau:

background-image:url('chrome-extension://__MSG_@@extension_id__/images/main.png');

4
Tuyệt vời. Đây là một giải pháp tuyệt vời và thực sự hoạt động cho cả tiện ích mở rộng không đóng gói và đóng gói - cảm ơn bạn đã chia sẻ một mẹo thực sự tuyệt vời.
Richard Hollis

40
Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm. Chỉ cần chú thích cuối trang: hãy nhớ rằng bạn cần khai báo nội dung của mình dưới dạng web_accessible_resources trong tệp kê khai của mình (như được giải thích ở đây: code.google.com/chrome/extensions/… ). Nếu không họ sẽ không được nạp
ariera

2
Một điều tôi nhận ra! Đừng bao giờ nghĩ rằng câu trả lời được chấp nhận là giải pháp chính xác duy nhất cho câu hỏi đó! Tôi đã sợ mình phải làm hardcode khi tôi thấy câu trả lời được chấp nhận nhưng sau khi thấy bạn trả lời, tôi đã tự nhủ anh chàng này đã cứu tôi một ngày !! ;-)
Rafique Mohammed

Đây hầu như luôn luôn là cách tốt hơn để làm điều đó. CSS thuần túy so với ghép Javascirpt và CSS với nhau trong câu trả lời @serg. Đây nên là câu trả lời được chấp nhận theo ý kiến ​​của tôi.
Jeremy Zerr

Liên kết của @ ariera hiện ở đây: developer.chrome.com/extensions/manifest/…
Ben

41

Có rất nhiều câu trả lời cũ và giải pháp cho câu hỏi này.

Kể từ tháng 8 năm 2015 (sử dụng Chrome 45 và Manifest phiên bản 2), "phương pháp hay nhất" hiện tại để liên kết với hình ảnh cục bộ trong Tiện ích mở rộng của Chrome là phương pháp sau.

1) Liên kết đến nội dung trong CSS của bạn bằng cách sử dụng một đường dẫn tương đối đến thư mục hình ảnh của tiện ích mở rộng:

.selector {
    background: url('chrome-extension://__MSG_@@extension_id__/images/file.png');
}

2) Thêm nội dung riêng lẻ vào phần web_accessible_resources của tệp manifest.json của tiện ích mở rộng của bạn :

"web_accessible_resources": [
  "images/file.png"
]

Lưu ý: Phương pháp này phù hợp với một số tệp, nhưng không mở rộng quy mô tốt với nhiều tệp.

Thay vào đó, một phương pháp tốt hơn là tận dụng hỗ trợ của Chrome cho các mẫu đối sánh để đưa tất cả các tệp vào danh sách trắng trong một thư mục nhất định:

{
    "name": "Example Chrome Extension",
    "version": "0.1",
    "manifest_version": 2,
    ...    
    "web_accessible_resources": [
      "images/*"
    ]
}

Sử dụng phương pháp này sẽ cho phép bạn sử dụng nhanh chóng và dễ dàng hình ảnh trong tệp CSS của Tiện ích mở rộng Chrome bằng các phương pháp được hỗ trợ nguyên bản.


22

Một tùy chọn sẽ là chuyển đổi hình ảnh của bạn thành base64:

và sau đó đưa dữ liệu vào ngay css của bạn như:

body { background-image: url(data:image/png;base64,iVB...); }

Mặc dù đây có thể không phải là cách bạn muốn sử dụng khi thường xuyên phát triển trang web , nhưng đây là một lựa chọn tuyệt vời do một số hạn chế của việc xây dựng Tiện ích mở rộng Chrome.


1
Tôi thích tùy chọn này hơn. Tôi không đồng ý rằng Google là chính xác khi đề xuất chèn tất cả các hình ảnh thông qua cách tiếp cận được đề cập ở trên. Cách tiếp cận base64 cũng nhanh hơn. +1 !!!
Skone

20

Giải pháp của tôi.

Với Menifest v2, bạn cần thêm web_accessible_resourcesvào tệp và sau đó sử dụng chrome-extension://__MSG_@@extension_id__/images/pattern.pnglàm url trong tệp css của mình.

CSS:

 #selector {
      background: #fff url('chrome-extension://__MSG_@@extension_id__/images/pattern.png'); 
 }

Manifest.json

{
  "manifest_version": 2,

  "name": "My Extension Name",
  "description": "My Description",
  "version": "1.0",

  "content_scripts": [
      {
        "matches": ["https://mydomain.com/*"],
        "css": ["style.css"]
      }
    ],

  "permissions": [
    "https://mydomain.com/"
  ],
  "browser_action": {
      "default_icon": {                    
            "19": "images/icon19.png",           
            "38": "images/icon38.png"          
       },
       "default_title": "My Extension Name"  
   },
   "web_accessible_resources": [
       "images/pattern.png"
     ]
}

ps Tệp kê khai.json của bạn có thể trông khác với tệp này.


8

Phiên bản CSS này chỉ hoạt động trong môi trường tiện ích mở rộng (trang ứng dụng, trang bật lên, trang nền, trang tùy chọn) cũng như tệp CSS content_scripts.

Trong tệp .less, tôi luôn đặt một biến ở đầu:

@extensionId : ~"__MSG_@@extension_id__";

Sau đó, nếu bạn muốn tham chiếu đến phần mở rộng-tài nguyên cục bộ như hình ảnh, hãy sử dụng:

.close{
    background-image: url("chrome-extension://@{extensionId}/images/close.png");
}

7

Một điều cần đề cập là trong web_accessible_resources, bạn có thể sử dụng các ký tự đại diện. Vì vậy, thay vì

"images / pattern.png"

Bạn có thể dùng

"hình ảnh / *"


4

Chỉ cần làm rõ, theo tài liệu , mọi tệp trong phần mở rộng cũng có thể truy cập được bằng một URL tuyệt đối như sau:

chrome-extension: // <extensionID>/<pathToFile>

Lưu ý rằng đây <extensionID>là một số nhận dạng duy nhất mà hệ thống tiện ích mở rộng tạo ra cho mỗi tiện ích mở rộng. Bạn có thể xem ID cho tất cả các tiện ích mở rộng đã tải của mình bằng cách truy cập URL chrome: // extensions . Đây <pathToFile>là vị trí của tệp trong thư mục trên cùng của tiện ích mở rộng; nó giống như URL tương đối.

...

Thay đổi hình nền trong CSS:

#id{background-image: url (" chrome-extension://<extensionID>/<pathToFile>"); }


Thay đổi hình nền trong CSS thông qua JavaScript:

document.getElementById (' id') .style.backgroundImage = "url ('chrome-extension: // <extensionID>/ <pathToFile>')");


Thay đổi hình nền trong CSS thông qua jQuery:

$ (" #id") .css ("background-image", "url ('chrome-extension: // <extensionID>/ <pathToFile>')");

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.