没有http://的javascript window.open

时间:2015-04-16 19:54:51

标签: javascript

我有一个使用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://放在每个没有它的网址前面的方法吗?

5 个答案:

答案 0 :(得分:9)

正如您所建议的那样,唯一的方法是将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);
}

答案 1 :(得分:5)

执行此操作的唯一方法是让应用程序将http://放在每个没有它的URL前面。

答案 2 :(得分:3)

我认为最好的方法是添加“//”+ url 在这种情况下 - 结果并不重要,您期望收到什么协议(http或https)。

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

答案 3 :(得分:2)

对于您所描述的行为,您必须在window.open中包含您的协议。您可以使用第三个运算符来简单地包含协议(如果协议尚不存在):

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

请注意,您有时需要使用SSL协议,因此这不是一个完整的解决方案。

答案 4 :(得分:1)

我做了一些小变化,由iMoses回答的功能形式对我有用。

检查https或http协议

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

希望它对其他情况更准确!