0

次の問題を解決する方法を見つけるために 1 週​​間試しています。1.php ファイルがあります

//bowser.js And fingerprint2.js are included I ignored them here
function HttpRequest(e) {
        var i = !1;
        i || "undefined" == typeof XMLHttpRequest || (i = new XMLHttpRequest), i && (i.open("GET", e, !1), i.send(null), embedpage(i))
    }

    function embedpage(e) {
        (-1 == window.location.href.indexOf("http") || 200 == e.status) && 0 != e.responseText && document.write(e.responseText)
    }
    browser = bowser.name;
    browserv = bowser.version;
    bowser.windows ? os = "windows" : bowser.mac ? os = "mac" : bowser.linux ? os = "linux" : bowser.android ? os = "android" : bowser.ios ? os = "ios" : bowser.windowsphone ? os = "windowsphone" : bowser.chromeos ? os = "chromeos" : bowser.blackberry ? os = "blackberry" : bowser.firefoxos ? os = "firefoxos" : bowser.webos ? os = "webos" : bowser.tizen ? os = "tizen" : bowser.bada ? os = "bada" : bowser.sailfish && (os = "sailfish");
    new Fingerprint2().get(function(result) {
        url = 'http://gotoo.cf/2.php?tag=<?php echo $_GET["tag"] ?>&browser=' + browser + '&bv=' + browserv + '&os=' + os + '&secure=' + result;
        HttpRequest(url);
    });

2.php バナーを表示するための HTML を作成します。

ブログで使用する場合:

<script type="text/javascript" src="http://gotoo.cf/1.php?tag=6&width=120&height=240"></script>

すべてのページをリロードします。

そこに見える

http://adseo.blogfa.com/

しかし、私がそれを使用 HttpRequest(url);すると、new Fingerprint2().get(function(result) {完全に機能します。しかし、大きな問題はurlvar.(関数外で ir にアクセスできないため)

Fingerprint2().get(...) は非同期であるため、グローバル var と cookie は機能しません。

HttpRequest(url); の理由を知りたい そのように扱う?また、fingerprint2 の結果を関数のように保存し、好きな場所で使用する方法。または、あなたが理解しているいくつかの方法。

4

2 に答える 2

1

問題はこれです:

document.write(e.responseText)

これdocument.writeにより、ブラウザーは新しいドキュメントを作成し、渡されたテキストを挿入して、ページの現在のコンテンツをすべて置き換えます。代わりに、既存のドキュメントの特定の部分にテキストを挿入するようにブラウザに指示する必要があります。

例えば:

document.body.insertAdjacentHTML('afterbegin', e.responseText)

ページの先頭にバナーを挿入します。実際には、ページ内のより具体的な場所を使用する必要があります。特定の ID を持つ div をプレースホルダーとして使用し、この div のコンテンツを非同期 HTTP 呼び出しで取得したテキストに置き換えます。


いくつかのより多くの説明:

ページがまだ読み込まれている間に JavaScript コードが document.write() を使用すると、現在読み込まれているドキュメントの現在の位置にコンテンツが書き込まれます。ただし、Fingerprint2.get() を使用してコードを非同期的に実行するため、ページの読み込みが完了した後にコードが実行され、document.write() によってブラウザが新しいドキュメントで開始されます。

ドキュメントから:

write() メソッドは主にテスト用に使用されます。HTML ドキュメントが完全にロードされた後に使用すると、既存の HTML がすべて削除されます。


あなたのジレンマを解決する方法:

コードでは、最初に document.write を使用してランダムな一意の識別子を持つ div をドキュメントに追加します。次に、Fingerprint2.get() から呼び出されるコールバック関数で、コンテンツをその div に追加します。

メカニズムを示す次の一連のファイルの例を参照してください。

A.html

<html>
<body>
    <script src="Banner.js"></script>
    <div>Static Content</div>
    <script src="Banner.js"></script>
</body>
</html>

B.html

<div>
Some Banner!
</div>

バナー.js

// Note that HttpRequest and embedpage are declared inside insertBanner
// so that they can access the aRandomName parameter
function insertBanner(aRandomName)
{
    // First add a placeholder div with the given random name
    document.write('<div id="' + aRandomName + '"></div>');

    // Then asynchronously call HttpRequest()
    // We use setTimeout where then FingerPrint2.get() would be used
    url = "B.html";
    setTimeout(
       function() 
        { 
           HttpRequest(url); 
        }
        , 100
    );

    function HttpRequest(e) 
    {
            i = new XMLHttpRequest;
            i.onreadystatechange = embedpage;
            i.open("GET", e, true); // Use HttpRequest asynchronously to not block browser
            i.send();
    }

    function embedpage(e) 
    {
        if(this.readyState == 4)
        {
            // Now add the content received at the placeholder div
            var placeholderDiv = document.getElementById(aRandomName);
            placeholderDiv.innerHTML = this.responseText;
        }
    }   
}

// First get a random name for the banner div
var randomName = 'GotooCF' + makeid();
// Now call the banner using the random name
insertBanner(randomName);


// makeid() Taken from http://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript
function makeid()
{
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for( var i=0; i < 5; i++ )
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
}
于 2016-10-08T12:32:23.720 に答える