1

私は単純なカウンターを書いていますが、このカウンターのインストールをユーザーにとって非常に簡単にしたいと考えています。私が今までに見た最も単純なカウンター コード (インストールするユーザー向け) の 1 つは、Google アナリティクス コードでした。

したがって、メインコードをファイルに保存したいと思います。カウンターをインストールするユーザーは、websiteID を次のように設定するだけで済みます。

<html><head><title></title></head><body>
<script type="text/javascript" src="http://counterhost.lan/tm.js">
var websiteId = 'XXXXX';
</script>
</body></html>

これが私のコードです:

<script type="text/javascript" src="http://counterhost.lan/tm.js">
var page = _gat.init('new');
</script>

これは私のJSファイルです:

(function() {
    var z = '_gat';
    var aa = function init(data) { alert(data); alert(z);};

    function na() {
        return new z.aa();
    }
    na();
})();

Google アナリティクスの JavaScript コードを理解しようとしましたが、理解できませんでした。タグ間に変数を指定してから、JavaScriptファイルにある匿名関数でそれを読み取る方法を提案できますか? ありがとう。

4

6 に答える 6

2

タグ間に変数を指定してそれを読み取る方法を誰か提案できますか [...]

タグに SRC 属性と JS コンテンツの両方がある場合はそうではありません。

<script type="text/javascript" src="http:/x.com/x.js"></script>

.. とは異なります。

<script type="text/javascript">
    var x = 1;
</script>

オプションで JS 変数を SCRIPT タグに追加するフレームワークの 1 つに Dojo があります。したがって、Dojo を使用している場合は、次のように記述してグローバルdjConfigハッシュに変数を追加できます。

<script type="text/javascript" src="mxclientsystem/dojo/dojo.js"
    djConfig="
    usePlainJson: true,
    parseOnLoad: true
">
</script>

Dojo は、SCRIPT タグを実行し、カスタムdjConfig属性を評価することによってこれを行います。

ただし、これで問題が解決するわけではありません。

本当に 2 つの SCRIPT タグが必要です。ある言葉、

<script type="text/javascript">
    var websiteId = '123456';
</script>

グローバル変数websiteIdと 2 番目の変数を設定します。

<script type="text/javascript" src="http:/x.com/myreporter.js"></script>

これはどこからでもロードでき、websiteId変数を読み取り、それを報告すると思います。

于 2009-12-16T01:23:56.220 に答える
2

次のように変数を無名関数に渡すことができます。

(function(arg1, arg2, arg3) {
    alert(arg1);
    alert(arg2);
    alert(arg3);
})("let's", "go", "redsox");

// will alert "let's", then "go", then "redsox" :)
于 2009-12-16T02:38:44.383 に答える
2

あなたの例でwebsiteIdは、グローバル変数です。したがって、同じ名前のローカル変数がない限り、匿名関数を含むどこからでもアクセスできます

<script> var websiteId = "something"; </script>

ページの後半または含まれているjsファイル...

(function() {
    alert(websiteId); //this should work
})();
于 2009-12-16T00:45:09.837 に答える
0

src要素の一部として属性を指定するとscript、要素タグ自体のコードはscript実行されません。ただし、次のコードを使用してこの機能を追加できます。私はCrockford(私はそれが彼だったと思います)からこのテクニックを入手しました。そこで彼は、パフォーマンスのレンダリングとその目的のためのページへのスクリプトの非同期ロードという無関係なトピックに関する講演でそれを使用しています。

JavaScript:

(function() {
    // Using inner class example from bobince's answer
 var _gat = (function() {
     var data= null;

     return {
         init: function(d) {
          console.info("Configuration data: ", d);
             data = d;
         }
     }
 })();

 // Method 1: Extract configuration by ID (SEE FOOT NOTE)
 var config = document.getElementById("my-counter-apps-unique-and-long-to-avoid-collision-id").innerHTML;

 // Method 2: search all script tags for the script with the expected name
 var scripts = document.getElementsByTagName("script");

 for ( var i=0, l=scripts.length; i<l; ++i ) {
  if ( scripts[i].src = "some-script.js" ) {
   config = scripts[i].innerHTML;
   break;
  }
 }

 _gat.init( eval("(" +config+ ")") );
})();

HTML:

<script type="text/javascript" src="some-script.js" id="my-counter-apps-unique-and-long-to-avoid-collision-id">
 {some: "foo", config: "bar", settings: 123}
</script>

どちらの方法にも欠点があります。

  1. 一意で衝突しないIDを使用すると、適切なスクリプト要素をより正確かつ迅速に決定できます。ただし、これは有効なHTML4/XHTMLマークアップではありません。HTML5では、任意の属性を定義できるため、その時点では問題になりません。

  2. このメソッドは有効なHTMLマークアップです。ただし、URLが変更される可能性がある場合(例:httpとhttps)、私が示した単純な比較は簡単に破られる可能性があり、より堅牢な比較方法が必要になる場合があります

に関する注記eval

どちらの方法もを利用しevalます。この機能に関する典型的なマントラは、「評価は悪である」というものです。しかし、それはeval 、の危険性を知らずevalに使用することは悪であるということにもなります。

この場合、AFAIK、scriptタグ内に含まれるデータは、HTMLをDOMに解析するときにその要素に到達するとすぐに評価スクリプト(示されているコード)が実行されるため、インジェクト攻撃の対象にはなりません。以前に定義された可能性のあるスクリプトは、実行された時点で scriptそのノードがツリーに存在しないため、カウンターのタグに含まれるデータにアクセスできません。DOM

以前にインクルードされたスクリプトから適切なタイミングでsetTimeout実行された場合、カウンターがインクルードされてから評価が行われるまでの間に実行できる場合がありscriptます。ただし、これが当てはまる場合とそうでない場合があり、可能であれば、CPU負荷などによってはそれほど一貫性がない場合があります。

話の教訓は、あなたがそれについて心配しているなら、非eval'ing JSONパーサーを含めて、代わりにそれを使用してください。

于 2009-12-16T04:14:58.613 に答える
0

JS オブジェクトの呼び出し方法について少し混乱していると思います。

zは文字列です'_gat'aa()String には というメンバーがないため、それを呼び出すことはできませんaaaaローカル変数に格納されるスタンドアロン関数です。を呼び出しaa()ても何も返さないため、newその結果に対して演算子を使用しても意味がありません。newコンストラクター関数でのみ呼び出すことができます。

次のような意味だと思います:

var _gat= function() {

    // Private variable
    //
    var data= null;

    // Object to put in window._gat
    //
    return {

        // Set the private variable 
        //
        init: function(d) {
            data= d;
        }
    };
}();

次に、2 番目の例のように呼び出す_gat.init('foo')と、変数が website ID に設定されます'foo'。これが機能するのは、オブジェクトが無名関数内で定義され_gatた戻りオブジェクトであり、非表示変数の参照 (「クロージャー」) を保持しているためです。{init: function() {...}}data

于 2009-12-16T01:18:46.890 に答える
0

あなたが何を求めているのか完全に明確ではありませんが...

任意の HTML 要素にid属性をタグ付けし
document.getEntityById()てから、その特定の要素を取得するために使用できます。

任意の名前を持つ HTML 要素のユーザー定義属性を指定し、Javascript 内でその要素を取得して設定することもできます。

于 2009-12-16T00:40:45.687 に答える