1

我有一个名为 MakeInput 的 JavaScript 函数。

它有大约 150 行。

我必须在我的代码中调用该函数大约 300 次。

我的 C# 代码通过 webbrowser 控件调用了该函数。

它必须调用该函数 300 次,直到 C# 中的 DataTable 完成循环。

但是也许webbrowser中的javascript认为我在调用一个无限递归函数,所以当涉及到大约60次时,它总是在第38行抛出一个称为堆栈溢出的错误。

我怎样才能防止这个错误?

如何在javascript中执行长时间功能?

编辑

好的。

我正在发布我的代码。

就这样吧。

C#

ieBrowser.Document.InvokeScript("setPageIndex", new object[] { currentPage });
ieBrowser.Document.InvokeScript("fnSearch");

JavaScript

function fnSearch() {
    var frm = document.searchFrm;
    var str = encryptData(frm, _currentPage);
}

function encryptData(form, _currentPage) {
    var retValue    = "";
    try {
        var crypto          = document.getElementById("SomeActiveX");
        var resultVal       = MakeInput(form);
        var inputStr        = "";

        if (resultVal[0] != "" && resultVal[1] != "") {
            inputStr    = resultVal[0] + "&" + resultVal[1];
        }
        else if (resultVal[0] == "") {
            inputStr    = resultVal[1];
        }
        else if (resultVal[1] == "") {
            inputStr    = resultVal[0];
        }
        else {
            inputStr    = "";
        }
        retValue        = crypto.Encrypt(inputStr);
    }
    catch (e) {
        alert(e);
    }
    return retValue;
}

function MakeInput(form) {
    var result = new Array(2);
    try {
        var keyProc = document.getElementById("SomeActiveX");
        var name = new Array(form.elements.length);
        var value = new Array(form.elements.length);
        var enc_name = new Array();
        var enc_value = new Array();
        var enc_idx = 0;
        var j = 0;
        var len = form.elements.length;
        for (i = 0; i < len; i++) {
            if ((form.elements[i].type != "button") && (form.elements[i].type != "reset") &&
                (form.elements[i].type != "submit")) {
                if ((form.elements[i].type == "radio") || (form.elements[i].type == "checkbox")) {
                    if (form.elements[i].checked == true) {
                        name[j] = form.elements[i].name;
                        value[j] = form.elements[i].value;
                        j++;
                    }
                }
                else if ((form.elements[i].type == "text") || (form.elements[i].type == "password")) {
                    name[j] = form.elements[i].name;
                    value[j] = form.elements[i].value;
                    j++;

                    if (keyProc != null && (form.elements[i].getAttribute("enc") == "on")) {
                        enc_name[enc_idx] = "_E2E_" + form.elements[i].name;
                        enc_value[enc_idx] = keyProc.GetEncData("", form.name, form.elements[i].name);
                        enc_idx++;
                    }
                }
                else {
                    if (form.elements[i].type == "select-one") {
                        var ind = form.elements[i].selectedIndex;
                        var singleLen = form.elements[i].length;
                        if (singleLen > 0) {
                            if (ind >= 0) {
                                name[j] = form.elements[i].name;
                                value[j] = form.elements[i].options[ind].value;
                                j++;
                            }
                            else {
                            }
                        }
                        else {
                        }
                    }
                    else if (form.elements[i].type == "select-multiple") {
                        var multiLen = form.elements[i].length;
                        for (k = 0; k < multiLen; k++) {
                            if (form.elements[i].options[k].selected) {
                                name[j] = form.elements[i].name;
                                value[j] = form.elements[i].options[k].value;
                                j++;
                            }
                        }
                    }
                    else {
                        name[j] = form.elements[i].name;
                        value[j] = form.elements[i].value;
                        j++;
                    }
                }
            }
        }

        var flag1 = false;
        var flag2 = false;
        var signed_text = "";
        var unsigned_text = "";
        for (i = 0; i < j; i++) {
            if (name[i].charAt(0) != "_") {
                if (flag1) {
                    signed_text += "&";
                }
                else {
                    flag1 = true;
                }
                signed_text += name[i];
                signed_text += "=";
                signed_text += escape_url(value[i]);
            }
            else {
                if (flag2) {
                    unsigned_text += "&";
                }
                else {
                    flag2 = true;
                }
                unsigned_text += name[i];
                unsigned_text += "=";
                unsigned_text += escape_url(value[i]);
            }
        }

        for (i = 0; i < enc_idx; i++) {
            if (flag2) {
                unsigned_text += "&";
            }
            else {
                flag2 = true;
            }
            unsigned_text += enc_name[i];
            unsigned_text += "=";
            unsigned_text += enc_value[i];
        }
        if (enc_idx > 0) {
            if (flag2) {
                unsigned_text += "&";
            }
            else {
                flag2 = true;
            }

            unsigned_text += "_ENCSEED";
            unsigned_text += "=";
            unsigned_text += keyProc.GetEncData(serverCert, "", "");
        }
        result[0] = signed_text;
        result[1] = unsigned_text;
    }
    catch (e) {
        throw e;
    }
    return result;
}

并捕获了错误消息。

在此处输入图像描述

对不起,错误信息是用韩文写的。

但它说,“堆栈溢出(在第 38 行)”。

但我认为数字不是指向行号,因为我已经更改了行但错误消息始终是 38。

4

1 回答 1

0

它不认为您处于连续循环中。当堆栈中的内存用完时,它会失败。相同的代码可能适用于具有更高内存的计算机。每次调用函数时,堆栈条目都会保存在堆栈中,以便在函数完成后移至 calee,因此在您的情况下,堆栈空间在 60 次调用后用完。第 38 行不是代码中的行号。

为什么不在高端 PC 上尝试相同的代码

于 2013-10-20T05:53:35.500 回答