Nun, zuerst ist Ihr HTML-Code ungültig, weil Sie x
und w
Deskriptoren für srcset
nicht mischen können. Wähle einen, aber nicht beides.
1) Sie können nicht wissen, welches Bild größer ist, wenn man sie alle, natürlich herunterladen Sie können - wenn Serverseite unterstützt - führen eine HEAD
Anfrage für jedes Bild und überprüfen Content-Length
Header-Eigenschaft. Es ist nicht einfach und was Sie bekommen, ist nur Bildgröße in Bytes, nicht seine Dimensionen, aber es ist eine gute Annäherung. Etwa so etwas wie dieses:
var sizes = [];
// Peform this for each UR...
$.ajax({
type: "HEAD",
url: imageUrl,
success: function(data, textStatus, request) {
sizes.push({
url: imageUrl,
size: parseInt(request.getResponseHeader("Content-Length"));
});
}
});
Sie einfach srcset
Attribut URLs Aufspalten und ignorieren Größe Teil erhalten kann (ich bin sicher, dass jemand mit einer besseren Wissen über regex kann besser etwas tun):
var urls = srcset.replace(/\s+[0-9]+(\.[0-9]+)?[wx]/g, "").split(/,/);
Anrufe können parallel oder - einfacher IMO - sequentiell mit Warteschlangen und $(document).queue()
jQuery-Methode durchgeführt werden.
Dies kann nicht immer getan werden (vielleicht, weil Server akzeptiert keine HEAD
oder Bildgrößen sind zu ähnlich, weil die Kompression und/oder Seitenverhältnisse), dann Sie Parsensrcset
Attribut haben.
2) Lassen Sie uns zunächst einen Proof of Concept sehen (lesen als: es ist nicht vollständig noch effizient ist) von dem, was Sie für Pixeldichte Descriptor tun kann x
: split mit über Leerraum .split(/ /)
und dann größte Auswahl.
// Read value from tag...this is just for testing
var srcset = "small.jpg 0.8x, large.jpg 1.5x, medium.jpg 1.3x";
var biggestImage = "";
var highestPixelDensity = 1;
for (var descriptor of srcset.split(/,/)) {
var parts = descriptor.trim().split(/ /);
// Here we check only for pixel density, see later for
// width descriptor but code is straightforward
var pixelDensity = parseFloat(parts[1].substring(-1));
if (pixelDensity > highestPixelDensity) {
biggestImage = parts[0];
highestPixelDensity = pixelDensity;
}
}
Anders sieht es für die Breite Descriptor w
weil es sizes
bezieht müssen Sie dann zuerst bestimmen, welche angewendet wird.Es ist etwas mehr gewunden, aber es ist einfach, mit window.matchMedia()
zu tun (auch hier ist es nicht vollständiger Code, sondern ein illustrativer proof of concept):
// Read this from tag...
var sizes = "(min-width: 800px) 700px, (min-width: 700px) 300px";
for (var descriptor of sizes.split(/,/)) {
// Love this from https://stackoverflow.com/a/651646/1207195
var imageSize = descriptor.split(/[, ]+/).pop();
// You still need to handle last item special case (where there is not media query).
var mediaQuery = descriptor.substring(-imageSize.length);
// You can stop with first matched media query, you have your required imageSize
var isMatch = window.matchMedia(mediaQuery).matches;
}
Jetzt haben Sie erforderliche Größe (seine Einheit überprüfen und entsprechend konvertieren, zum Beispiel this post) und Sie sind fertig, es mit der Breite des Deskriptors zu verwenden, die von srcset
extrahiert wird.
Beachten Sie, dass Sie nicht wissen, welches Bild größer ist, wenn Sie es nicht herunterladen. Was Sie annehmen können, ist, dass höhere Pixeldichte x
oder höhere Breite w
(aber müssen in Bezug auf sizes
Attribut Inhalt berechnet werden, größere Bildschirm verwendet größeres Bild) gibt Ihnen die größere. Natürlich ist es eine Annahme, dann kann es in einigen Fällen fehlschlagen. Um festzustellen, welche verwendet werden müssen, ist einfach:
var isPixelDensity = srcset.trim().substr(-1) === "x";
nur ... diese Proben zusammengestellt, behandeln Ecken Fällen grundlegende Fehlerbehandlung und Browser-spezifische Themen fehlt und fertig ...
Dies scheint wie ein XY-Problem. Warum brauchst du das? –
Und warum können Sie nicht davon ausgehen, dass es das erste Element in der Liste ist? –
@ JanDvorak XY Problem? Ich muss ein Skript auf der Benutzerseite einfügen und ihm dann die auf der Seite verfügbaren Bilder separat in einem Popup anzeigen. Jetzt kann ich SRC einfach benutzen, aber es würde mir das Standardbild geben, aber ich möchte das beste verfügbare Bild bekommen. –