0

いくつかのiframeを動的に作成し、srcとonloadを設定した後、コンテンツを配列に配置して配列をソートするために利用できると思います。次に、iframe (興味深いコンテンツは既に配列に配置されています) を削除し、HTML ページにテーブルを作成します。並べ替えの前にアラートが設定されていない場合、スクリプトが終了する直前に onload が起動するため、配列は空になります。並べ替えの前にアラートが発生すると、onload プロシージャが起動し、配列が作成され、すべて正常に動作することがわかりました。しかし、私は警告を出したくありません。誰かが私が間違ったことを説明できますか? これは私の最初のスクリプトですので、理解を助けてください。

function LoadFile( ) {
var FName, PName, myID, myFrame;
var myBody  = document.getElementById("StartList");
for ( var i = 0; i < FileList.length; i++ ) {
    // Read input file into frame
    FName   = FileList[i].FName;
    PName   = FName + ".html";
    myID    = "iframe" + i;
    // Create frame.
    myFrame = document.createElement("iframe");
    myFrame.setAttribute("id", myID);
    myFrame.setAttribute("width","0");
    myFrame.setAttribute("height","0");
    myFrame.setAttribute('src', PName);
    //Attach onload-event to frame, triggering ReadTableInfo.
    if (myFrame.attachEvent){
        myFrame.attachEvent("onload", function(){
            ReadTableInfo();
        });
    } else {
        myFrame.onload = function(){
            ReadTableInfo();
        };
    }
    myBody.appendChild(myFrame);
}
}

function ReadTableInfo() {
var a = document.getElementsByTagName("iframe")[idx];
var p = FileList[idx].FName;
var b = (a.contentWindow || a.contentDocument);
var td;
if ( b.document) {
    b = b.document;
    // Get and process table with functions and procedures.
    var myTable = b.getElementsByTagName("Table")[5];
    var myList  = myTable.getElementsByTagName("TR");
    var Name = "";
    var Desc = "";
    for ( var j = 0; j < myList.length; j++) {
        Name = myTable.getElementsByTagName("TR") [j].getElementsByTagName("A")[0].innerHTML;
        if ( myTable.getElementsByTagName("TR")[j].getElementsByTagName("TD")[1] != null) {
            td = myTable.getElementsByTagName("TR")[j].getElementsByTagName("TD")[1];
            Desc = td.textContent || td.innerText || "";
        }
        if ( searchval == "" || ( TestVal.test(Name) && searchkey == 1 ) || ( TestVal.test(Desc) && searchkey == 2 ) ) {
            ProcList[ProcList.length++] = new  AddProcList(Name.toLowerCase(), p.toLowerCase(), Desc);
        }
        Name = "";
        Desc = "";
    }
    idx++;
}
}

function UpdateList( opt ) {
searchval = document.getElementById("edtSearchVal").value;
TestVal = new RegExp(".", "i");
if ( searchval !== "" ) {
    if ( opt == 2 ) {
        TestVal = new RegExp(searchval, "i"); // searchpattern for RegExp descriptions
    } else {
        TestVal = new RegExp(searchval.replace(" ","_"), "i"); // searchpattern for RegExp.
    }
}
switch ( opt ) {
    case 1: searchkey = 1;
            break;
    case 2: searchkey = 2;
            break;
    default: 
            searchkey = 3;
}
Init();
// Get package names from index.
SetFileList();  // Determines which external files to examine.
LoadFile();     // Loads the external files into iframes to be used later.

alert("Start generating list, this may take a while."); // Necessary to read frames! Don't know why???

var sortkeys = {FName:"a",PName:"a"}; // Sorting order of ProcList, which will be the listorder.
ProcList.keySort(sortkeys);           // Sort ProcList.
TableCreate();     // Make new table with all entries in ProcList
}

コメントをありがとう、他の人から学ぶためにここに来てください:))

4

1 に答える 1

1

あなたLoadFile(); はコンテンツを iframe にロードしており、 alert() は iframe コンテンツが完全にロードされるのに十分な時間を与えているため、残りのコードは機能します。アラートを削除すると、残りのコードは iframe コンテンツが読み込まれる直前に実行されます。iframe ページ内にも onload を配置することをお勧めします。次に、このイベントを親ウィンドウに伝播します。親コンテナ ウィンドウにアクセスするには、iframe 内で window.parent を実行します。

于 2013-06-30T20:17:23.893 に答える