2015-04-16 18 views
5

Ich habe ein kleines Tool, mit Delphi erstellen, die URLs aus einer Datei oder aus der Zwischenablage baut test.htm, und als eine Datei mit einem Inhalt wie folgt aufgerufen sammelt:Javascript window.open ohne http: //

<!DOCTYPE html> 
<html> 
<body> 
    <p>Click the button retrieve the links....</p> 
    <button onclick="myFunction()">Click me</button> 
    <p id="demo"></p> 
    <script> 
     function myFunction() { 
      window.open('http://www.speedtest.net/', '_blank'); 
      window.open('www.speedtest.net/', '_blank'); 
      and so on... 
     } 
    </script> 
</body> 
</html> 

Die Idee ist, auf die Schaltfläche zu klicken, und dann wird eine neue Registerkarte (oder ein neues Fenster) für jede URL innerhalb von myFunction erstellt. Das funktioniert, aber mit einem kleinen Problem.

Im Codebeispiel gibt es 2 URLs, eine mit dem Präfix http: // und eine ohne. Die erste URL funktioniert wie erwartet und erstellt eine neue Registerkarte (oder Fenster) mit der folgenden URL:

http://www.speedtest.net 

Der zweite ‚window.open‘ funktioniert nicht wie ich erwartet hatte. Diese ‚window.open‘ wird die folgende URL in dem neuen Registerkarte (oder Fenster)

file:///c:/myApplicaton/www.speedtest.net 

erstellen Wie Sie bereits herausgefunden haben, die Anwendung ist eine ausführbare Datei in C: \ myApplication

Also meine Frage (s), gibt es eine Möglichkeit, 'window.open' zu verwenden, um eine neue Registerkarte (oder ein neues Fenster) zu erstellen, ohne den Pfad der Anwendung vor die URL zu setzen? Wenn dies mit 'window.open' nicht möglich ist, gibt es eine andere Möglichkeit, dies zu tun?

Oder ist der einzige Weg, dies zu tun, um die Anwendung die http: // vor jeder URL setzen, die es nicht schon hat?

+0

^^ war mein Grund. –

+0

Wenn du nur // anstelle von http verwendest: // Funktioniert es?Sie werden ein Problem mit den https: // Websites haben – romuleald

+0

Was bedeutet ^^? – GuidoG

Antwort

3

Wie Sie vorgeschlagen haben, ist der einzige Weg, das HTTP-Protokoll zu jeder URL hinzuzufügen, die es fehlt. Es ist eine ziemlich einfache und unkomplizierte Lösung mit anderen Vorteilen. dieses Stück Code

Bedenken Sie:

function windowOpen(url, name, specs) { 
    if (!url.match(/^https?:\/\//i)) { 
     url = 'http://' + url; 
    } 
    return window.open(url, name, specs); 
} 

Was ich tue, ist in der Regel auch die Funktionalität vorbei Spezifikationen als ein Objekt hinzufügen, die meiner Meinung nach viel besser handhabbar ist, als eine Zeichenfolge, auch Einstellung Spezifikationen können bei Bedarf automatisch angepasst werden, und Sie können die Erstellung des Namens automatisieren und das Argument optional machen, falls es für Ihre Zwecke überflüssig ist.

Hier ist ein Beispiel, wie die nächste Stufe dieser Funktion aussehen könnte.

+0

vorsichtig, dies kann dazu führen, http: // https: // + url – Hypaethral

+0

True, wird behoben. Danke – iMoses

+0

@Kevin B Danke, das passiert, wenn du deinen Code nicht testest;) – iMoses

5

Die einzige Möglichkeit, dies zu tun, ist die Anwendung die http:// vor jeder URL setzen, die es nicht bereits hat.

2

Für das Verhalten, das Sie beschreiben, müssen Sie Ihr Protokoll mit window.open einschließen. Sie könnten einen tertiären Operator enthalten, um einfach das Protokoll verwenden, wenn es nicht bereits vorhanden ist:

url = url.match(/^http[s]*:\/\//) ? url : 'http://' + url; 

Beachten Sie, dass Sie manchmal das SSL-Protokoll verwenden werden müssen, so ist dies keine vollständige Lösung.

+0

Wenn ich verstehe was du meinst, habe ich zur besseren Übersicht bearbeitet – Hypaethral

2

Ich denke, der beste Weg wäre, hinzuzufügen "//" + URL In diesem Fall - es ist nicht wichtig, welches Protokoll (http oder https) erwarten Sie als Ergebnis erhalten.

url = url.match(/^https?:/) ? url : '//' + url; 
window.open(url, '_blank');