1

我有一些代码在新窗口中显示来自 html、xml 或 txt 文件的内容。我遇到了 getElementById 有时返回 null 的问题。它通常似乎在 Chrome 中工作,但 IE8 尤其是 Firefox 非常不稳定。

更具体地说,一旦我尝试显示 txt 文件,它将无法工作。

我已经尝试添加(在我的情况下) newWindow.onload = function(){ ... 和 $(newWindow.document).ready(function() { ... 虽然,因为我是 javascript 和我可能做错了。

下面是相关代码:

Javascript:

function newWindow(pathname, type){

    var newWindow = window.open("newWindow.php");

    $.ajax({
            type: "post",
            url: "windowHelper.php",
            data: {pathname: pathname, type: type},
            dataType: "json"
    })
    .done(function(data, textStatus, jqXHR){  //tried to add the .onload and .ready here

            newWindow.document.getElementById("newWindow").innerHTML = data.data1;

     })
    .fail(function(jqXHR, textStatus, errorThrown){

            newWindow.document.getElementById("newWindow").innerHTML = textStatus + errorThrown;
    });
}

php:

        if(isset($_POST["pathname"]) && !empty($_POST["pathname"]) && isset($_POST["type"]) && !empty($_POST["type"])){

            $pathname = $_POST["pathname"];
            $type = $_POST["type"];
            $filename = str_replace("/var/tmp/ciscat/", "", $pathname);

                    if($type == 'html'){
                            $contentString = str_replace("<html>", "", file_get_contents($pathname));
                            $contentString = str_replace("</html>", "", file_get_contents($pathname));
                            $contentString = str_replace("<body>", "", file_get_contents($pathname));
                            $contentString = str_replace("</body>", "", file_get_contents($pathname));
                            }
                    else if($type == 'xml'){

                            $contentString = htmlspecialchars(file_get_contents($pathname), ENT_QUOTES);
                    }
                    else if($type == 'txt'){
                            $contentString = str_replace("\n", "<br/ >", file_get_contents($pathname));
                    }
                    else{
                            $contentString = "Blir feeeeel!!";
                    }

            $reportContent = "<p class = 'normalText'>Content of the file: $filename. Download the file in order to utilise the full content. </p> $contentString";
            print json_encode(array( "data1" => $reportContent));
    }

HTML:

<!DOCTYPE html>

<html>
<head>

<SCRIPT type="javascript/text" src="functions.js"></SCRIPT>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>

<link rel="stylesheet" type="text/css" href="style.css">

</head>
<body>

<div id = "newWindow">
</div>

</body>
</html>

有没有人有任何我可以尝试的其他想法?任何帮助将非常感激!:)

我怀疑这里可能有一些“坏”代码,对此的一些评论也会很好,但我的主要问题是 evul getElementById。

先感谢您

4

3 回答 3

1

[编辑]

我想您可以尝试$.ajax()像这样包装(尽管 ^_^ 仍应首先添加 jQuery):

$.ajax({
    type: "post",
    url: "windowHelper.php",
    data: {pathname: pathname, type: type},
    dataType: "json",
    success: function(data, textStatus, jqXHR) {
        newWindow.document.getElementById("newWindow").innerHTML = data.data1;
    },
    error: function(data, textStatus, errorThrown) {
        newWindow.document.getElementById("newWindow").innerHTML = textStatus + errorThrown;
    }
})
于 2013-07-17T09:14:37.637 回答
0

好吧,因为我无法让其他任何东西工作,包括 .onload 和 .ready (这两个反而破坏了其他东西)我决定为我的问题做一些“丑陋”的修复。

诸如 newWindow 之类的标签在我的 Javascript 之前没有时间加载,因此 getElementById(""newWindow) 返回 null,因为 ID 尚不存在。

我所做的是添加一个计时器,该计时器在发布到新窗口之前等待 0.5 秒,确保它有时间加载。这可行,但这不是一个好的答案,因为它有时可能会在新窗口加载非常缓慢时失败(我怀疑)。但是,它确实有效,并且在没有更好的选择的情况下,这就是我要做的。

除了计时器之外,我还更改了 HTML 文档中标签的顺序并更改了变量名称,以确保没有两个东西的名称相同。这些并没有解决我的问题,但这是很好的实践。

新的 JS 代码:

function openNewWindow(pathname, type){
    /*newWindow has to be defined here*/
    var popWindow = window.open("newWindow.php");


    $.ajax({
            type: "post",
            url: "windowHelper.php",
            data: {pathname: pathname, type: type},
            dataType: "json"
    })
    .done(function(data, textStatus, jqXHR){

            setTimeout(function() {

            popWindow.document.getElementById("newWindowDiv").innerHTML = data.data1;

            }, 500);
     })
    .fail(function(jqXHR, textStatus, errorThrown){

            setTimeout(function() {

            popWindow.document.getElementById("newWindowDiv").innerHTML = textStatus + errorThrown;

            }, 500);

});
}
于 2013-07-19T06:49:29.777 回答
0

首先添加jQuery,

而不是这个

 newWindow.document.getElementById("newWindow").innerHTML = data.data1;

你能用这个吗

 $("#newWindow").html(data.data1);

希望这可以帮助。

于 2013-07-17T09:19:03.633 回答