2010-05-18 6 views
9

Ich habe eine Seite, die eine größere Version eines Bildes anzeigen soll, wenn es über einem Thumbnail angezeigt wird.CSS und JQuery: Leerzeichen innerhalb des Bildnamens break code von url()

Ich habe einen ‚div‘ mit einer ID und dem JQuery-Code ist wie folgt:

$(document).ready(function(){ 

    $('img').hover(function() { 

    var src = $("#im" + this.id).attr("src"); 
    $('#viewlarge').css('backgroundImage','url(' + src +')'); 
    return false; 
    }); 

}); 

Die Bilder, die ich verwende, werden durch eine Ruby-Skript erzeugt, dass „erzeugen“ ein Bild mit einem ähnlichen, noch andere ID. Manchmal werden jedoch Fotos hochgeladen, die "Leerzeichen" enthalten. Meine Entwicklerwerkzeuge sagen mir, dass das Hintergrundbild nicht korrekt eingestellt ist, der Bildpfad jedoch korrekt ist und der Browser keine Probleme hat, das Bild zu finden.

Meine Frage ist, kann ich irgendwie die URL 'src' bereinigen, so dass Leerzeichen kein Problem sein werden? Ich bin mir bewusst, dass ich diese Server-Seite mache, aber ich würde gerne wissen, wie man das auch mit JQuery/JS macht.

Danke!

Antwort

15

Leerzeichen sind in einem URI nicht gültig. Sie müssen in codiert werden.

Sie könnten src.replace(/ /g, '%20') oder allgemeiner encodeURI(src) bis % -encodieren Sie alle Zeichen, die in einem URI nicht gültig sind. encodeURIComponent(src) ist häufiger, aber es würde nur funktionieren, wenn der src nur ein einzelner relativer Dateiname wäre; Andernfalls würde es / codieren und Pfade funktionieren.

Allerdings ist das echte Problem ist, dass das Original img src ist bereits gebrochen und funktioniert nur dank Browser-Korrekturen beheben Ihren Fehler. Sie müssen das Ruby-Skript reparieren, das die Seite generiert. Sie sollten den Dateinamen vor der Aufnahme in den Pfad URL-codieren; Es gibt viel mehr Zeichen, die Ihnen Probleme als nur Platz verursachen können.

Wie Pekka sagte, sollten Sie auch Anführungszeichen um die URL im url(...) Wert verwenden. Während Sie ohne sie für viele URLs wegkommen können, müssten einige Zeichen \ -escaped sein. Mit doppelten Anführungszeichen können Sie das vermeiden (in einer URL selbst können keine doppelten Anführungszeichen vorkommen).

+0

+1, ich habe 'encodeURI' und' encodeURIComponent' in meine Antwort gemischt. –

+0

+1, Vielen Dank für Ihre klare Erklärung! Ich werde es versuchen. – Shyam

+0

Können Sie ein einfaches Javascript-Beispiel schreiben, um dies zu demonstrieren? – user3629945

0

Verwenden Javascript encode Funktion Ihre 'src'

Z. B. zu kodieren

$('#viewlarge').css('backgroundImage','url(' + encode(src) +')'); 

Ich glaube, Sie auch 'escape' Funktion Javascript verwenden können, als auch

$('#viewlarge').css('backgroundImage','url(' + escape(src) +')'); 
+0

Veraltet. Verwenden Sie encodeURIComponent – Quentin

+0

'encode' ist veraltet, wegen der fehlenden Unicode-Unterstützung. 'encodeURI' und' encodeURIComponent' sind empfohlene Ersetzungen. –

+0

encodeURI, wie kann ich das verwenden? Genauso wie die Methode encode()? – Shyam

8

Hinzufügen von Anführungszeichen um die URL helfen sollte:

$('#viewlarge').css('backgroundImage','url("' + src +'")'); 

jedoch nach dem W3C specs, weiß Leerzeichen müssen maskiert werden, daher ist die URL-Codierungslösung, die von @Andy Es Kopf @bobince bereitgestellt wird, die sicherste Lösung.

+0

Das würde nur helfen, wenn die Variable Klammern enthält. Die Frage zeigt an, dass Leerzeichen das Problem sind. – Quentin

+0

@David - Das ist falsch, +1 zu Offset. –

+0

+1 - Ich wollte diesen Vorschlag zu [meine Antwort] (http://stackoverflow.com/questions/2856294/css-and-jquery-spaces-inside-image-name-break-code-of-url) hinzufügen/2856309 # 2856309) bis ich sah, dass du es gepostet hast. –

4
  • Erstens, warum lassen Sie Kunden den Namen Ihrer Bilder bestimmen?
  • Zweitens, warum sterilisieren Sie sie nicht?
  • Drittens, ich vermute, dass Sie nicht sind urlencoding die Urls, wenn man sie auf den HTML-Code schreiben
+0

1. Weil sie eine gruselig große Datenbank mit Dateipfaden haben. Nennen wir das ein Migrationsproblem. 2. Ich werde, ich entwickle immer noch die Ersatz-App. 3. Ich bin ein n00b, was kann ich noch hinzufügen;) – Shyam

+0

cool, welche Seite ist das? Ich werde eine Datei mit einem falsch formatierten Namen hochladen und Javascript in Ihre Seite injizieren und Ihre Benutzer-Logins stehlen, eine Sitzung übernehmen und ein Konto entführen, einige Daten zerstören und Ihr Geschäft epische Schmerzen und Ausgaben verursachen. umwerben! –

+1

* ich werde nicht. aber jemand könnte! –

0

(die einen Raum in eine% 20 drehen würde) würde ich nicht Bilder mit Leerzeichen im Dateinamen erlauben, hochgeladen werden - scheint mir keine gute Übung zu sein.

+0

Ich zwinge das jetzt auch. – Shyam

0

Ich weiß, dass Sie bereits Ihre Antwort ausgewählt haben, aber ich möchte Pekkas Lösung verbessern und die praktikabelste Lösung anbieten, da ich ein anderes Problem hatte, während es einen Dateinamen mit Klammern behandelt.

$("#viewlarge").css("background",'url(' + "'" + url+ "'" + ')'); 

Ich hoffe, es hilft!