当我在函数中使用新的XMLHttpRequest时,所有页面都会重新加载



我尝试了一个星期来找到解决以下问题的方法。我有一个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) {完美的工作。但最大的问题是url var(因为它不能访问的功能)

全局变量和cookie不能工作,因为Fingerprint2().get(…)是异步的。

我想知道为什么http请求(url);这样对待?以及如何像函数一样存储指纹结果并在任何我想要的地方使用它。或者一些你理解的方法

问题是这样的:

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>

Banner.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;
}

正如NineyBerry所说,主要问题是document.write()所以我使用:

document.write=function(s){
    var scripts = document.getElementsByTagName('script');
    var lastScript = scripts[scripts.length-1];
    lastScript.insertAdjacentHTML("beforebegin", s);
}

在所有浏览器中,除了Firefox。但仍需修改,我想我们应该做一个新的文件。为这些情况编写函数。由于

相关内容

  • 没有找到相关文章

最新更新