アドレスバーを介してリモートJavaScriptファイルをロードします
-
04-10-2019 - |
質問
アドレスバーからリモートJavaScriptファイルをロードすることは可能ですか?
私はこれをアドレスバーに入れようとしています:
javascript:src='http://depot.com/file.js';funcname();
私はこれを悪いことに使用していません。私は自分のサイトをテストしているだけです。あなたがあなたのサイトを保護したいなら、あなたはそれを最初に攻撃することを学ぶ必要がありますよね?
解決
私はあなたが次のことをすることができるはずだと思います:
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は他の答えに注目しています, 、リモートスクリプトで定義されている関数を呼び出すのはそれほど簡単ではありません。ベンはこの問題に対する1つの解決策を提案していますが、別の解決策もあります。これは、Cornifyが使用しているソリューションです。チェックアウトする場合 http://cornify.com/js/cornify_run.js
そのファイルには、1つの関数呼び出しがあることがわかります。あなたはあなたを置くことができます funcname()
Cornifyが行っているように、別のJavaScriptファイルを呼び出します。これは、スクリプトブロックが挿入された順序で実行されることが保証されているためです。次の例のように、両方のスクリプトを含める必要があります。
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()
.
他のヒント
直接答えではありませんが、それでも役に立ちます。
ブックマークで使用した場合、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);
これを行う直接的な方法はありませんが、一般的なハックは、現在のページにタグを挿入するJavaScriptの数行を実行し、実行するスクリプトのURLにSRC属性を設定することです。
javascript:var s=document.createElement("script");s.src="http://depot.com/file.js";s.type="text/javascript";document.getElementsByTagName("body")[0].appendChild(s);
リモートファイルで定義された関数を実行する場合(àla funcname()
あなたの質問で)、それはもう少し難しいです。これは、タグを介したスクリプトの読み込みが非同期に実行されているため、ファイルが要素をすぐに追加することがすぐに終了していない可能性が高いためです。これを回避することを考えることができる唯一の方法は、要素を挿入する前にいくつかの関数を定義することです。これを含むソースファイルの最後に呼び出します。
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);