是否可以从地址栏加载远程JavaScript文件?
我一直试图把它放到地址栏中:
javascript:src='http://depot.com/file.js';funcname();
我不是用它来做坏事。我只是测试我的网站,就是这样。如果你想保护你的网站,你必须先学会攻击它,对吗?
答案 0 :(得分:9)
我想你应该能够做到以下几点:
javascript:(function () {
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = 'http://depot.com/file.js';
document.getElementsByTagName('body')[0].appendChild(newScript);
})();
这是一个非常有用的示例(将其粘贴到您的地址栏中):
javascript:(function () {
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = 'http://cornify.com/js/cornify.js';
document.getElementsByTagName('body')[0].appendChild(newScript);
for (var i = 0; i < 5; i++) {
newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = 'http://cornify.com/js/cornify_run.js';
document.getElementsByTagName('body')[0].appendChild(newScript);
}
})();
瞧:
实际上,这就是cornify.com在其书签中包含远程脚本的方式。
<强>更新强>
作为@Ben noted in the other answer,调用远程脚本中定义的函数并不是那么简单。 Ben提出了解决这个问题的方法,但还有另一个解决方案,即cornify正在使用的解决方案。如果你查看http://cornify.com/js/cornify_run.js
,你会发现该文件中只有一个函数调用。您可以将funcname()
调用放在单独的JavaScript文件中,就像cornify正在执行的那样,因为脚本块保证按插入顺序执行。然后,您必须包含这两个脚本,如以下示例所示:
javascript:(function () {
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = 'http://depot.com/file.js';
document.getElementsByTagName('body')[0].appendChild(newScript);
newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = 'http://depot.com/file_run.js';
document.getElementsByTagName('body')[0].appendChild(newScript);
})();
file_run.js
仅包含对funcname()
的调用。
答案 1 :(得分:2)
没有直接的方法可以做到这一点,但常见的黑客是运行几行JavaScript,将标记插入当前页面,将其src属性设置为您要运行的脚本的URL: / p>
javascript:var s=document.createElement("script");s.src="http://depot.com/file.js";s.type="text/javascript";document.getElementsByTagName("body")[0].appendChild(s);
如果你想运行远程文件中定义的函数(问题中的àlafuncname()
),那就有点棘手了。这是因为通过标记加载脚本是异步运行的,所以文件很可能还没有完成加载,立即将元素添加到DOM。我能想到解决这个问题的唯一方法是在插入元素之前定义一些函数,然后在包含的源文件的末尾调用它:
function doStuff() {
// run code that depends on the included JS file
};
// include the external script, as per the snippet above
然后,您可以在包含文件的末尾添加对doStuff
的调用:
if(doStuff) doStuff();
最终结果如下:
javascript:function doStuff(){funcname()};var s=document.createElement("script");s.src="http://depot.com/file.js";s.type="text/javascript";document.getElementsByTagName("body")[0].appendChild(s);
答案 2 :(得分:2)
不是直接答案,但仍然有用。
以下是在书签中使用时加载javascript文件的脚本:
javascript:var%20e=document.createElement('script');e.setAttribute('language','javascript');e.setAttribute('src','http://github.com/balupton/ajaxy-bookmark/raw/master/script.js');document.body.appendChild(e);void(0);