我有一个使用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://放在每个没有它的网址前面的方法吗?
答案 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;
}
希望它对其他情况更准确!