簡體   English   中英

沒有http://的javascript window.open

[英]javascript window.open without http://

我有一個使用Delphi的小工具,它從文件或剪貼板中收集url,然后使用如下內容構建一個名為test.htm的文件:

<!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>

我們的想法是單擊按鈕,然后為myFunction中的每個url創建一個新選項卡(或窗口)。 這有效,但有一個小問題。

在代碼示例中,有2個url,一個帶有http://前綴,另一個帶有它。 第一個URL按預期工作,並使用以下URL創建一個新選項卡(或窗口):

http://www.speedtest.net

第二個'window.open'不能像我預期的那樣工作。 這個'window.open'將在新標簽(或窗口)中創建以下網址

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

正如您已經想到的那樣,該應用程序是c:\\ myApplication中的可執行文件

所以我的問題是,有沒有辦法使用'window.open'創建一個新的選項卡(或窗口)而不將應用程序的路徑放在網址前面? 如果使用'window.open'無法做到這一點,還有其他辦法嗎?

或者是唯一的方法來讓應用程序將http://放在每個沒有它的URL前面?

正如您所建議的那樣,唯一的方法是將http協議添加到缺少它的每個URL。 這是一個非常簡單直接的解決方案,並帶來其他好處。

考慮一下這段代碼:

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

我通常做的是添加將規范作為對象傳遞的功能,在我看來,這比字符串更易於管理,甚至在需要時設置規范默認值,並且您還可以自動創建名稱並進行參數化如果它對您的事業是多余的,則是可選的。

這是一個如何使用此函數的下一個階段的示例。

function windowOpen(url, name, specs) {
    if (!url.match(/^https?:\/\//i)) {
        url = 'http://' + url;
    }
    // name is optional
    if (typeof name === 'object') {
        specs = name;
        name = null;
    }
    if (!name) {
        name = 'window_' + Math.random();
    }
    if (typeof specs === 'object') {
        for (var specs_keys = Object.keys(specs), i = 0, specs_array = [];
                i < specs_keys.length; i++) {
            specs_array.push(specs_keys[i] + '=' + specs[specs_keys[i]]);
        }
        specs = specs_array.join(',');
    }
    return window.open(url, name, specs);
}

執行此操作的唯一方法是讓應用程序將http://放在每個沒有它的URL的前面。

我認為最好的方法是添加“//”+ url在這種情況下 - 它並不重要,你期望收到什么協議(http或https)。

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

對於您描述的行為,您必須在window.open中包含您的協議。 您可以使用第三個運算符來簡單地包含協議(如果它尚不存在):

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

請注意,有時您需要使用SSL協議,因此這不是一個完整的解決方案。

我做了一些小的改動功能形式,由iMoses回答,對我有用

檢查https或http協議

if (!url.match(/^http?:\/\//i) || !url.match(/^https?:\/\//i)) {
        url = 'http://' + url;
    }

希望它對其他情況更准確!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM