javascript window.open不带http://

javascript window.open不带http://,javascript,Javascript,我有一个用Delphi构建的小工具,它从文件或剪贴板收集url,然后构建一个名为test.htm的文件,其内容如下: <!DOCTYPE html> <html> <body> <p>Click the button retrieve the links....</p> <button onclick="myFunction()">Click me</button> <p

我有一个用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>
第二个“window.open”没有像我预期的那样工作。此“window.open”将在新选项卡(或窗口)中创建以下url

正如您已经了解到的,该应用程序是c:\myApplication中的一个可执行文件

所以我的问题是,有没有一种方法可以使用“window.open”来创建一个新的选项卡(或窗口),而不必将应用程序的路径放在url前面? 如果“window.open”无法执行此操作,是否有其他方法可以执行此操作


或者,唯一的方法是让应用程序将http://放在每个还没有它的url前面吗?

唯一的方法是让应用程序将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);
}
功能窗口打开(url、名称、规格){
如果(!url.match(//^https?:\//\//i)){
url='http://'+url;
}
//名称是可选的
if(typeof name==“object”){
规格=名称;
name=null;
}
如果(!name){
name='window_u2;'+Math.random();
}
如果(规格类型===‘对象’){
对于(var specs_keys=Object.keys(specs),i=0,specs_array=[];
i
对于您正在描述的行为,您必须在window.open中包含您的协议。如果协议不存在,您可以使用第三方操作符简单地包括该协议:

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

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

我认为最好的方法是添加“/”url 在这种情况下,您希望接收的协议(http或https)并不重要

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

我对函数表做了一些小的修改,这些修改对我很有用

检查https或http协议

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

希望它对其他情况更准确

如果只使用//而不使用http://它是否工作?您将对https://websiteswhat does^^的意思是什么?@GuidoG有问题该问题现在属于社区,因此其他开发人员可以从答案中受益。别孩子气,这些只是一些虚拟系统中的要点。有时卑鄙的人投卑鄙的票,那又怎样?不要把它看得太重,没有人会这么做。@romuleald
/
仍然是一个相对url,意思是“使用与主请求相同的协议”,因此对于
https
页面中的图像,使用“https”。在这种情况下,主页面是一个文件,使用文件协议。如果您在url的开头使用
/
,弹出窗口可能会使用
文件://
,鉴于此应用程序的性质,这是不需要的。如果我理解您的意思,我已经为清晰性进行了编辑如果您使用“*”,它也将匹配多个“s”。如果只匹配一个,则更好:url=url.match(/^http[s]?:\/\//)?url:'http://'+url;是的,会修好的。Thanks@KevinB谢谢,这就是不测试代码时发生的情况;)如果http已经存在,那么url将变为。所以我们需要同时检查http和https。我建议使用函数prependProtocol(url){if(!url.match(//^https?:\//\//I)| url.match(//^http?:\//\//\//I)){url='http://'+url;}return url;}@bhuvanarrora,这是不正确的。正则表达式“https?”捕获“http”和“https”,因为问号表示“s”字符是可选的。在您的示例中,“htt://”将是合法的URL前缀,这是一个bug。这里的代码工作得很好。请在跳枪之前试一试。注意:在最初的示例中,如果URL以“http://”或“https://”开头,则不会在前面加前缀。
url = url.match(/^https?:/) ? url : '//' + url;
window.open(url, '_blank');
if (!url.match(/^http?:\/\//i) || !url.match(/^https?:\/\//i)) {
        url = 'http://' + url;
    }