7

<head>タグで外部ファイルを参照せずに、別の「.js」ファイルから外部「.js」ファイルの関数を呼び出す必要があります。

そのファイルへのアクセスを許可する外部「.js」ファイルを動的に追加できることを知っています。そのようにすることができます...

var AppFile = "test/testApp_1.js"; 
var NewScript=document.createElement('script');
var headID = document.getElementsByTagName("head")[0]; 
NewScript.src = AppFile;
headID.appendChild(NewScript);

でも...

外部ファイルは、起動手順を実行するスタンドアロンファイルである必要があるため、これは私には役に立ちません...

$(document).ready(function()
{...}

したがって、完全なファイルを動的に追加すると、望ましくない影響があります。<head>また、動的である必要があるため、タグ内の外部ファイルを事前参照することはできません。したがって、この外部ファイル"test/testApp_1.js"には、文字列変数を返す関数が含まれています...

function setAppLogo(){

 var LogoFile = "test/TestApp_1_Logo.png";

 return LogoFile;
}       

この関数にアクセスする必要があるか、文字列をグローバル変数として外部ファイルに保存できます...どちらの方法でも問題ありませんLogoFile。外部ファイル全体をロードせずに値にアクセスする必要があるだけです。

これは私を数時間困惑させたので、どんなアイデアでも大歓迎です.

4

6 に答える 6

1

app.js多くの場所から使用したいグローバル変数/値を含むある種のファイルを用意することでメリットが得られる場合があります。この.jsファイルをすべてのページに含める必要があります (賢くしてパフォーマンスを向上させたい場合は、ファイルを縮小/他の js と連結することもできます)。一般に、これらのグローバルはvar APPNAME = { }; 、多くの場所から使用される変数/関数など、作成したオブジェクトにアタッチする必要があります。

これを取得すると、ロードする外部 '.js' ファイルと現在使用中のファイルの両方が、グローバル APPNAME 変数とそのすべての属性/関数にアクセスし、それらを必要に応じて使用できます。これは、JavaScript をよりモジュール化して分離可能にするためのより良いアプローチかもしれません。お役に立てれば。

于 2012-07-25T20:47:54.667 に答える
0

XHR (例: jQuery の $.get )を介してスクリプト全体をロードし、必要な部分を抽出するために正規表現を使用して解析することができます。

$.get('pathtoscript.js', function(scriptBody) {
    var regex = /function\s+setUpLogo\(\)\s*\{[^}]+}/g;
    alert(scriptBody.match(regex)[0]); // supposed to output a function called
                                       // 'setUpLogo' from the script, if the 
                                       // function does not have {} blocks inside
});

とはいえ、このようなアプローチは保守障害を引き起こす可能性が高いことに注意する必要があります。正規表現は、JavaScript コードを解析するための最良のツールではありません。たとえば、上記の例では、ネストされた {} ブロックを含む関数は解析されません。これは問題のコードに存在する可能性があります。

ページがブラウザに送信される前に、必要なスクリプト パスまたはその一部を追加するなど、問題に対するサーバー側の解決策を見つけることをお勧めします。

于 2012-07-04T06:01:23.650 に答える
0

わかりました、すべての入力に感謝しますが、私がやろうとしていたことは現在不可能だと思います。つまり、そのファイルをロードせずに別のファイルから関数にアクセスします。しかし、私は私の問題の解決策を見つけました。使用可能なアプリのリストをサーバーに照会し、このリストを使用して UI でアプリを動的に構築します。アプリが選択されると、そのファイルとその中の関数を呼び出すことができます。もう少し複雑ですが、ダイナミックで、優れたパフォーマンスを発揮し、機能します。ブレーンストーミングをありがとうございました。;)

于 2012-07-26T07:38:32.343 に答える
0

I'm not sure this is a good idea but you can create an iframe and eval the file inside its 'window' object to avoid most of the undesired side effects (assuming it does not try to access its parent). Then you can access whatever function/variable you want via the iframe's window object.

Example:

function loadSomeJsInAFrame(url,cb) {
        jQuery.get(url,function(res) {
            iframe = jQuery('<iframe></iframe>').hide().appendTo(document.body);
            iframe[0].contentWindow.eval(res);
        if(cb) cb(iframe[0].contentWindow);
    },'text');
}

loadSomeJsInAFrame('test/testApp_1.js',function(frameWindow) {
    console.log(frameWindow.setAppLogo());
    jQuery(frameWindow.frameElement).remove();
});

This will not guarantee that the sript in the file can not mess with your document, but not likely if it comes from a trusted source.

Also, don't forget to remove your iframe after you get what you need from it.

于 2012-07-20T21:20:54.870 に答える
0

jQuery が ajax を使用してロードされたらファイルをロードし、成功した ajax 関数で関連するスクリプトを実行します。

jQuery の getScript 関数を参照してください: http://api.jquery.com/jQuery.getScript/

$(document).ready(function(){
 $.getScript("http://domain.com/ajax/test.js", function(data, textStatus, jqxhr) {
    console.log(data); //data returned
    console.log(textStatus); //success
    console.log(jqxhr.status); //200
    console.log('Load was performed.');
    //run your second script executable code here
 });
});
于 2012-07-03T14:07:21.040 に答える