5


自分のサイトhttp://jsbookmarklets.com/のブックマークレット用にクロスドメインJavaScriptファイルを動的にロードする必要があります


ソリューションは次の条件を満たす必要があります。

  • 現在のファイルのパスを取得します
  • 現在実行中のWebページとJSファイルのドメインが異なります
  • 解決策はクロスブラウザである必要があります
  • 複数のスクリプトが非同期で一度にロードされる場合があります(そのため、以下で説明する関連する質問は適切ではありません)


JavaScriptと同じ/相対フォルダーに保存されているいくつかのリソース(カスタムコードやjQuery、jQuery UI、Ext JSライブラリなどのCSSファイルやJSファイル)を動的にロードするために、現在実行中のJavaScriptコードのファイルパスを取得したいブックマークレット。


次のアプローチは私の問題に適合しません。

var scripts = document.getElementsByTagName("script");
var src = scripts[scripts.length-1].src;
alert("THIS IS: "+src);


私の問題に合わない関連する質問:

4

3 に答える 3

4

私が使用している現在のソリューションは機能しますが、非常に長くなります:

var fnFullFilePathToFileParentPath = function(JSFullFilePath){
    var JSFileParentPath = '';
    if(JSFullFilePath) {
        JSFileParentPath = JSFullFilePath.substring(0,JSFullFilePath.lastIndexOf('/')+1);
    } else {
        JSFileParentPath = null;
    }
    return JSFileParentPath;
};

var fnExceptionToFullFilePath = function(e){
    var JSFullFilePath = '';

    if(e.fileName) {    // firefox
        JSFullFilePath = e.fileName;
    } else if (e.stacktrace) {  // opera
        var tempStackTrace = e.stacktrace;
        tempStackTrace = tempStackTrace.substr(tempStackTrace.indexOf('http'));
        tempStackTrace = tempStackTrace.substr(0,tempStackTrace.indexOf('Dummy Exception'));
        tempStackTrace = tempStackTrace.substr(0,tempStackTrace.lastIndexOf(':'));
        JSFullFilePath = tempStackTrace;
    } else if (e.stack) {   // firefox, opera, chrome
        (function(){
            var str = e.stack;
            var tempStr = str;

            var strProtocolSeparator = '://';
            var idxProtocolSeparator = tempStr.indexOf(strProtocolSeparator)+strProtocolSeparator.length;

            var tempStr = tempStr.substr(idxProtocolSeparator);
            if(tempStr.charAt(0)=='/') {
                tempStr = tempStr.substr(1);
                idxProtocolSeparator++;
            }

            var idxHostSeparator = tempStr.indexOf('/');
            tempStr = tempStr.substr(tempStr.indexOf('/'));

            var idxFileNameEndSeparator = tempStr.indexOf(':');
            var finalStr = (str.substr(0,idxProtocolSeparator + idxHostSeparator + idxFileNameEndSeparator));
            finalStr = finalStr.substr(finalStr.indexOf('http'));
            JSFullFilePath = finalStr;
        }());
    } else {    // internet explorer
        JSFullFilePath = null;
    }

    return JSFullFilePath;
};

var fnExceptionToFileParentPath = function(e){
    return fnFullFilePathToFileParentPath(fnExceptionToFullFilePath(e));
};

var fnGetJSFileParentPath = function() {
    try {
        throw new Error('Dummy Exception');
    } catch (e) {
        return fnExceptionToFileParentPath(e);
    }
};

var JSFileParentPath = fnGetJSFileParentPath();
alert('File parent path: ' + JSFileParentPath);
于 2013-01-06T21:19:42.973 に答える
1
var s = document.createElement('script'); 
s.setAttribute('src', 'code.js'); 
document.body.appendChild(s);

これだけはできませんか?

var myScriptDir = 'http://somesite.tld/path-to-stuff/';
var s = document.createElement('script'); 
s.setAttribute('src', myScriptDir + 'code.js'); 
document.body.appendChild(s); 
// code inside http://somesite.tld/path-to-stuff/code.js will use myScriptDir to load futher resources from the same directory.

スクリプト内に追加のリソースをロードするコードを持たせたくない場合は、スクリプト タグの onload 属性を使用できますs.onload=function(){...}。ブラウザー間の互換性のために、最初に jQuery をロードしてから getScript 関数を使用できます。関連するリンクはhttp://www.learningjquery.com/2009/04/better-stronger-safer-jquerify-bookmarkletおよびhttp://api.jquery.com/jQuery.getScript/です。

于 2013-01-07T08:38:07.097 に答える
0

いくつかのコメントはすでにこれに言及していますが、もう少し詳しく説明します。

現在のスクリプトのパスを把握する最も簡単で、最もクロス ブラウザ、クロス ドメインの方法は、スクリプトのパスをスクリプト自体にハードコードすることです。

一般に、サードパーティのスクリプト ファイルをロードしている可能性があるため、これは不可能です。しかし、あなたの場合、すべてのスクリプト ファイルはあなたの管理下にあります。リソース (CSS、JS など) をロードするコードを既に追加しているため、スクリプト パスも含めることができます。

于 2013-01-12T08:27:56.867 に答える