1

新しいウィンドウ内に html、xml、または txt ファイルのコンテンツを表示するコードがあります。getElementById が null を返すことがあるという問題があります。通常は Chrome で動作するようですが、IE8、特に Firefox は非常に不安定です。

具体的には、txt ファイルを表示しようとすると機能しません。

私はすでに (私の場合) newWindow.onload = function(){ ... と $(newWindow.document).ready(function() { ... を追加しようとしましたが、私は JavaScript が初めてなので、 php やり方が間違っていたのかもしれません。

以下は関連するコードです。

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 を含め、他に何も動作させることができなかったので (これらの 2 つは代わりに他のものを壊してしまいました)、私の問題に対して少し「醜い」修正を行うことにしました。

newWindow などのタグは、Javascript の前にロードする時間がないため、ID がまだ存在しないため、getElementById(""newWindow) は null を返します。

私がしたことは、新しいウィンドウに投稿する前に 0.5 秒待機するタイマーを追加して、ロードする時間があることを確認することでした。これは機能しますが、新しいウィンドウの読み込みが非常に遅い場合に失敗する可能性があるため、良い答えではありません (私は推測します)。しかし、それは機能し、より良いオプションがないため、これが私が行うことです.

タイマーを除いて、HTML ドキュメント内のタグの順序も変更し、変数名を変更して、同じ名前が 2 つないようにしました。これらは私の問題を解決しませんでしたが、良い実践です。

新しい 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 に答える