Javascript code is giving error

Asked

Viewed 145 times

1

I posted a thread here which dealt with how to replace an ASP code with cleaner Javascript. Well, I had a lot of help, from Maicon and Tobymosque. Well, I made the appropriate changes, to my mind and gives an error that I could not eliminate. See below the ASP code with JS mixed to be replaced:

function selecionar(num_seq_proposta_ts, num_proposta, nome_titular){
    var txt_chamada = '';
    try {
        var oMyObject = window.dialogArguments;
        txt_chamada = "oMyObject";
        var aux = oMyObject.document;
    } 
    catch (e){
        txt_chamada = "window.parent.opener";
    }   
    var txt_prefixo = '';
    var txt_sufixo  = '';

    //Somente joga o valor para o campo se ele existir
    <%if trim(nome_campo_cod_ts)<> "" then%>
        try {
            txt_prefixo = '.document.form01.';
            txt_sufixo  = '';
            <%if trim(ind_tipo_proposta_pj) = "S" then%>
                var onum_seq_proposta_pj_ts = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%><%Response.Write nome_campo_cod_ts%>' + txt_sufixo);
            <%else%>
                var onum_seq_proposta_ts    = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%><%Response.Write nome_campo_cod_ts%>' + txt_sufixo);    
            <%end if%>
        } catch (e) {
            txt_prefixo = '.document.all[\'';
            txt_sufixo  = '\']';
            <%if ind_tipo_proposta_pj = "S" then%>
                var onum_seq_proposta_pj_ts = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%><%Response.Write nome_campo_cod_ts%>' + txt_sufixo);
            <%else%>
                var onum_seq_proposta_ts    = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%><%Response.Write nome_campo_cod_ts%>' + txt_sufixo);
            <%end if%>
        }
    <% else %>
        try {
            txt_prefixo = '.document.form01.';
            txt_sufixo  = '';
            <%if ind_tipo_proposta_pj = "S" then%>
                var onum_seq_proposta_pj_ts = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%>num_seq_proposta_pj_ts' + txt_sufixo);
            <%else%>
                var onum_seq_proposta_ts    = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%>num_seq_proposta_ts' + txt_sufixo);
            <%end if%>
        } catch (e) {
            txt_prefixo = '.document.all[\'';
            txt_sufixo  = '\']';
            <%if ind_tipo_proposta_pj = "S" then%>
                var onum_seq_proposta_pj_ts = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%>num_seq_proposta_pj_ts' + txt_sufixo);
            <%else%>
                var onum_seq_proposta_ts    = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%>num_seq_proposta_ts' + txt_sufixo);
            <%end if%>
        }
    <%end if%>  

    <%if trim(ind_tipo_proposta_pj) = "S" then%>
        if (onum_seq_proposta_pj_ts != null ) {
            onum_seq_proposta_pj_ts.value = num_seq_proposta_ts;
        }
    <%else%>
        if (onum_seq_proposta_ts != null ) {
            onum_seq_proposta_ts.value = num_seq_proposta_ts;
        }
    <%end if %>

    <%if trim(nome_campo_tit)<>"" then%>
        try {
            txt_prefixo = '.document.form01.';
            txt_sufixo  = '';
            var onum_proposta   = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%><%Response.Write nome_campo_tit%>' + txt_sufixo);
        } catch (e) {
            txt_prefixo = '.document.all[\'';
            txt_sufixo  = '\']';
            var onum_proposta   = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%><%Response.Write nome_campo_tit%>' + txt_sufixo);
        }
    <%else %>
        try {
            txt_prefixo = '.document.form01.';
            txt_sufixo  = '';
            <%if ind_tipo_proposta_pj = "S" then%>
                var onum_proposta_pj    = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%>num_proposta_pj' + txt_sufixo);
            <%else%>
                var onum_proposta   = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%>num_proposta' + txt_sufixo);
            <%end if%>          
        } catch (e) {
            txt_prefixo = '.document.all[\'';
            txt_sufixo  = '\']';
            <%if ind_tipo_proposta_pj = "S" then%>
                var onum_proposta_pj    = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%>num_proposta_pj' + txt_sufixo);
            <%else%>
                var onum_proposta   = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%>num_proposta' + txt_sufixo);
            <%end if%>  
        }
    <%end if %>

    <%if trim(ind_tipo_proposta_pj) = "S" then%>
        if (onum_proposta_pj != null ) {
            onum_proposta_pj.value = num_proposta;
            <%if indOrigem = "J" then%>
                onum_proposta_pj.onchange();
            <%end if%>
        }
    <%else%>
        if (onum_proposta != null ) {
            onum_proposta.value = num_proposta;
            <%if indOrigem = "J" then%>
                onum_proposta.onchange();
            <%end if%>
        }
    <%end if%>

    <%if trim(nome_campo_prop)<>"" then%>
        try {
            txt_prefixo = '.document.form01.';
            txt_sufixo  = '';
            var onome_titular   = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%><%Response.Write nome_campo_prop%>' + txt_sufixo);
        } catch (e) {
            txt_prefixo = '.document.all[\'';
            txt_sufixo  = '\']';
            var onome_titular   = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%><%Response.Write nome_campo_prop%>' + txt_sufixo);
        }
    <% else %>
        try {
            txt_prefixo = '.document.form01.';
            txt_sufixo  = '';
            var onome_titular   = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%>nome_titular' + txt_sufixo);
        } catch (e) {
            txt_prefixo = '.document.all[\'';
            txt_sufixo  = '\']';
            var onome_titular   = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%>nome_titular' + txt_sufixo);
        }
    <% end if %>

    if (onome_titular != null )
        onome_titular.value = stringReplace(nome_titular, "|*|", "'");


    <%if trim(funcao_executar) <> "" then%>
        try{
            var aux = eval(txt_chamada + ".<%Response.Write funcao_executar%>");                
        }catch(e){
            window.returnValue = 'window.<%Response.Write funcao_executar%>';           
        }
    <%end if%>

    <% if ucase(indsubmit) = "TRUE" then %>
        eval(txt_chamada + ".document.form01.submit()");
    <%end if%>
    parent.self.close();
}

This is the code I made. Colleague Tobymosque suggested an approach to avoid the eval but I couldn’t do it, it was a mistake. I left the eval, try to make it work first and then try to improve the code. See what I did:

    var asp = {};
    Object.defineProperty(asp, "ind_tipo_proposta_pj", { value: "<%= ind_tipo_proposta_pj %>", writable: false, enumerable: true, configurable: true });
    Object.defineProperty(asp, "prefixo", { value: "<%= prefixo %>", writable: false, enumerable: true, configurable: true });
    Object.defineProperty(asp, "nome_campo_cod_ts", { value: "<%= nome_campo_cod_ts %>", writable: false, enumerable: true, configurable: true });
    Object.defineProperty(asp, "nome_campo_tit", { value: "<%= nome_campo_tit %>", writable: false, enumerable: true, configurable: true });
    Object.defineProperty(asp, "indOrigem", { value: "<%= indOrigem %>", writable: false, enumerable: true, configurable: true });
    Object.defineProperty(asp, "nome_campo_prop", { value: "<%= nome_campo_prop %>", writable: false, enumerable: true, configurable: true });
    Object.defineProperty(asp, "funcao_executar", { value: "<%= funcao_executar %>", writable: false, enumerable: true, configurable: true });

//------------------------------------------------------------------------   
function selecionar(num_seq_proposta_ts, num_proposta, nome_titular){
    //Adequação para chamada modal dentro do chrome
    var txt_prefixo = '';
    var txt_sufixo  = '';
    var txt_chamada = "";
    var onome_titular = '';
    var janela = null;

    if (window.dialogArguments) {
        janela = window.dialogArguments;
        txt_prefixo = '.document.form01.';
        txt_sufixo  = '';
    } else if (window.parent.opener) {
        janela = window.parent.opener;
        txt_prefixo = '.document.all[\'';
        txt_sufixo  = '\']';
    } else {
        janela = window.parent.dialogArguments;
        txt_prefixo = '.document.form01.';
        txt_sufixo  = '';
    }

    if (janela) {
        var form01 = null;

        if (janela.document) {
            form01 = janela.document.form01;
        }
        else {
            form01 = janela.elements;
        }

        var onum_seq_proposta_pj_ts = null;
        var onum_seq_proposta_ts = null;
        var onum_proposta = null;
        var onum_proposta_pj = null;

        var nome_campo_cod_ts_id = "<%= trim(nome_campo_cod_ts) %>";
        var onum_seq_proposta_pj_ts_id = "<%= trim(ind_tipo_proposta_pj)%>" == "S";

        window["objeto"] = null;

        if(nome_campo_cod_ts_id != ""){
            if(asp.ind_tipo_proposta_pj == "S")
                onum_seq_proposta_pj_ts = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_cod_ts + txt_sufixo);
            else
                onum_seq_proposta_ts = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_cod_ts + txt_sufixo);
        }
        else
        {
            if(asp.ind_tipo_proposta_pj == "S")
                onum_seq_proposta_pj_ts = eval(txt_chamada + txt_prefixo + asp.prefixo + num_seq_proposta_pj_ts + txt_sufixo);
            else
                onum_seq_proposta_ts = eval(txt_chamada + txt_prefixo + asp.prefixo + num_seq_proposta_ts + txt_sufixo);
        }

        if (asp.ind_tipo_proposta_pj == "S"){
            if (onum_seq_proposta_pj_ts != null ) {
                onum_seq_proposta_pj_ts.value = num_seq_proposta_ts;
            }
        }
        else
        {
            if (onum_seq_proposta_ts != null ) {
                onum_seq_proposta_ts.value = num_seq_proposta_ts;
            }
        }

        if(nome_campo_tit != ""){
            onum_proposta = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
        }
        else
        {
            if(asp.ind_tipo_proposta_pj == "S")
            {
                onum_proposta_pj = eval(txt_chamada + txt_prefixo + asp.prefixo + num_proposta_pj + txt_sufixo);
            }
            else
            {
                onum_proposta = eval(txt_chamada + txt_prefixo + asp.prefixo + num_proposta + txt_sufixo);
            }
        }

        if (asp.ind_tipo_proposta_pj == "S"){
            if (onum_proposta_pj != null ) {
                onum_proposta_pj.value = num_proposta;
                if(asp.indOrigem == "j")
                {
                    onum_proposta_pj.onchange();
                }
            }
        }
        else
        {
            if (onum_proposta_pj != null ) {
                onum_proposta.value = num_proposta;
                if(asp.indOrigem == "j")
                {
                    onum_proposta.onchange();
                }
            }
        }

        if(asp.nome_campo_prop != "")
        {
            onome_titular   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_prop + txt_sufixo);
        }
        else
        {
            onome_titular   = eval(txt_chamada + txt_prefixo + asp.prefixo + nome_titular + txt_sufixo);
        }

        if (onome_titular != null )
            onome_titular.value = stringReplace(nome_titular, "|*|", "'");

        if (funcao_executar != "")
        {
            if (window.dialogArguments || window.parent.dialogArguments) {
                var aux = eval(txt_chamada + "." + asp.funcao_executar);
            }
            else
            {
                window.returnValue = "window." + asp.funcao_executar;
            }

        }

    }//Fim janela

    try
    {
        window.parent.dialogWindow.close();
    }
    catch (e) {
        parent.self.close();
    }

    //<% if ucase(indsubmit) = "TRUE" then %>
    //  eval(txt_chamada + ".document.form01.submit()");
    //<%end if%>
    //parent.self.close();
}

That’s the mistake you’re making:

Uncaught Syntaxerror: Unexpected token .

This is what debug brought about in this mistake

.Document.form01.3753742

The number is the registration number of a person the search returns. What is wrong?

Missing to load the var txt_chamada:

if (window.dialogArguments) {
        janela = window.dialogArguments;
        txt_chamada = 'window.dialogArguments';
        txt_prefixo = '.document.form01.';
        txt_sufixo  = '';
    } else if (window.parent.opener) {
        janela = window.parent.opener;
        txt_chamada = 'window.parent.opener';
        txt_prefixo = '.document.all[\'';
        txt_sufixo  = '\']';
    } else {
        janela = window.parent.dialogArguments;
        txt_chamada = 'window.parent.dialogArguments';
        txt_prefixo = '.document.form01.';
        txt_sufixo  = '';
    }

Now the mistake is this:

Uncaught Syntaxerror: Unexpected number

Tobymosque, let me clarify something here. This call:

if (asp.nome_campo_tit) {}
    try {
        txt_prefixo = '.document.form01.';
        txt_sufixo  = '';
        var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
    } catch (e) {
        txt_prefixo = '.document.all[\'';
        txt_sufixo  = '\']';
        var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
    }
}

With this call the form does not open Modal in Chrome. It was necessary to do this:

if (window.dialogArguments) {
            janela = window.dialogArguments;
        } else if (window.parent.opener) {
            janela = window.parent.opener;
        } else {
            var janela = window.parent.dialogArguments;
        }

Soon I will make this change, to suit my need. Our trampo here is exactly these form or frame open in a Modal way in Chrome. This happens only in IE.

I made this change and solved. Thanks to Toby and Maicon.

function selecionar(num_seq_proposta_ts, num_proposta, nome_titular) {
        var janela = window.dialogArguments || window.parent.opener || window.parent.dialogArguments;

        if (janela) {
            var form01 = null;
            if (janela.document) {
                form01 = janela.document.form01;
            }
            else {
                form01 = janela.elements;
            }
            var container = form01 || janela.document.all;

            var onum_seq_proposta_ts = container[asp.prefixo + asp.nome_campo_cod_ts];
            var onum_proposta = container[asp.prefixo + asp.nome_campo_tit];
            var onome_titular = container[asp.prefixo + asp.nome_campo_prop]

            if (onum_seq_proposta_ts != null) {
                onum_seq_proposta_ts.value = num_seq_proposta_ts;
            }
            if (onum_proposta != null) {
                onum_proposta.value = num_proposta;
                if (asp.indOrigem === "J") {
                    onum_proposta.onchange();
                }
            }
            if (onome_titular != null) {
                onome_titular.value = stringReplace(nome_titular, "|*|", "'");
            }

            var aux = null;
            if (asp.funcao_executar) {
                if (janela[asp.funcao_executar]) {
                    aux = janela[asp.funcao_executar]();
                } else if (window[asp.funcao_executar]) {
                    window.returnValue = window[asp.funcao_executar]()
                }
            }
        }

        try {
            window.parent.dialogWindow.close();
        }
        catch (e) {
            parent.self.close();
        }

        //if (asp.indsubmit && janela.document.form01) {
        //    janela.document.form01.submit();
        //}
        parent.self.close();
    }
  • 3

    pnet, the problem of eval() is precisely the difficulty of debugging the same, so try to wrapper for the Val as in the following example, instead of calling the eval() call the method debugEval() as in the example and see if the script is being mounted correctly.

  • @Tobymosque, ok I’ll do it. I didn’t close the previous post because I haven’t been able to make it work yet. That approach you went through, I couldn’t do, declaring the window["object"]...

  • @Tobymosque, I remembered something here. My situation is this: I make my changes on my local machine, save, copy the form I changed, then I put it on the server and I rotate. This server has no way to log and etc...

  • take a look at this mine reply, especially in the part that has the comment //conteudo.contentWindow.opener = window;, maybe doing this will solve the I i compatibility problem between Chrome and IE (dialog vs popup).

1 answer

3


pnet, I think you misunderstood my suggestion, I will post here a prototype of your code with the proposed changes:

Asp file.

<script type="text/javascript">
    var asp = {};
    asp.ind_tipo_proposta_pj = "<%= trim(ind_tipo_proposta_pj) %>";
    asp.indOrigem = "<%= trim(indOrigem) %>";

    asp.complemento = asp.ind_tipo_proposta_pj === "S" ? "_pj" : "";    
    asp.prefixo = "<%= trim(prefixo) %>";
    asp.nome_campo_cod_ts = "<%= trim(nome_campo_cod_ts) %>" || "num_seq_proposta" + asp.complemento + "_ts";
    asp.nome_campo_tit = "<%= trim(nome_campo_tit) %>" || "num_proposta" + asp.complemento;
    asp.nome_campo_prop = "<%= trim(nome_campo_prop) %>" || "nome_titular";
    asp.funcao_executar = "<%= trim(funcao_executar) %>";
    asp.indsubmit = "<%= trim(ucase(indsubmit)) %>" === "TRUE";
</script>

js file.

function selecionar(num_seq_proposta_ts, num_proposta, nome_titular){    
    var janela = window.dialogArguments || window.parent.opener;    
    var container = janela.document.form1 || janela.document.all;   

    var onum_seq_proposta_ts = container[asp.prefixo + asp.nome_campo_cod_ts];
    var onum_proposta = container[asp.prefixo + asp.nome_campo_tit];
    var onome_titular = container[asp.prefixo + asp.nome_campo_prop]

    if (onum_seq_proposta_ts != null ) {
        onum_seq_proposta_ts.value = num_seq_proposta_ts;
    }
    if (onum_proposta != null ) {
        onum_proposta.value = num_proposta;
        if (indOrigem === "J") {
            onum_proposta.onchange();
        }
    }
    if (onome_titular != null ) {
        onome_titular.value = stringReplace(nome_titular, "|*|", "'");
    }

    var aux = null;
    if (asp.funcao_executar) {
        if (typeof janela[asp.funcao_executar] === "function") {
            aux = janela[asp.funcao_executar]();
        } else if(typeof window[asp.funcao_executar] === "function") {
            window.returnValue = window[asp.funcao_executar]()
        }
    }

    if (asp.indsubmit && janela.document.form1) {}
        janela.document.form1.submit();
    }
    parent.self.close();
}

Explanations

In my view, the most important thing is to try to decouple as much as possible script page asp, as well as avoiding code repetition and finally removing the use of exceptions such as flow control.

To try to achieve these goals I made some decisions, starting by dividing the script in 3 parts:

  1. statements of server variables that will be used in the arquivo.asp.
  2. declaration of local and global variables already in the arquivo.js.
  3. algorithm body.

So at first I searched and listed all the markings ASP (<% valor %>) in the script and moved them to the page header asp, for example, the following code snippet:

<%if trim(nome_campo_tit)<>"" then%>
    try {
        txt_prefixo = '.document.form01.';
        txt_sufixo  = '';
        var onum_proposta   = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%><%Response.Write nome_campo_tit%>' + txt_sufixo);
    } catch (e) {
        txt_prefixo = '.document.all[\'';
        txt_sufixo  = '\']';
        var onum_proposta   = eval(txt_chamada + txt_prefixo + '<%Response.Write prefixo%><%Response.Write nome_campo_tit%>' + txt_sufixo);
    }
<%else %>

we move the statements ASP <%Response.Write prefixo%>, <%Response.Write nome_campo_tit%> for the page header

<script type="text/javascript">
    var asp = {};
    ...   
    asp.prefixo = "<%= trim(prefixo) %>";
    asp.nome_campo_cod_ts = "<%= trim(nome_campo_cod_ts) %>";
    ...
</script>

and the script went like this:

if (asp.nome_campo_tit) {}
    try {
        txt_prefixo = '.document.form01.';
        txt_sufixo  = '';
        var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
    } catch (e) {
        txt_prefixo = '.document.all[\'';
        txt_sufixo  = '\']';
        var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
    }
}

then I analyzed the blocks try-catch which are being used to control the flow of script, then the try was replaced by a if which checks whether the condition causing the error will not happen and the catch for else, let’s take as an example the following block:

try {
    var oMyObject = window.dialogArguments;
    txt_chamada = "oMyObject";
    var aux = oMyObject.document;
} 
catch (e){
    txt_chamada = "window.parent.opener";
}

the error that can happen here, is to access a property of window.dialogArguments when the same is undefined, as if(undefined) is assessed as false, we can do the following:

if (window.dialogArguments) {
    var oMyObject = window.dialogArguments;
    txt_chamada = "oMyObject";
} else {
    txt_chamada = "window.parent.opener";
}

note that we have removed the aux, for its only use was to cause the error.

now let’s check the conditions, let’s take a if to study:

if (asp.nome_campo_tit) {}
    try {
        txt_prefixo = '.document.form01.';
        txt_sufixo  = '';
        var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
    } catch (e) {
        txt_prefixo = '.document.all[\'';
        txt_sufixo  = '\']';
        var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
    }
} else {
    try {
        txt_prefixo = '.document.form01.';
        txt_sufixo  = '';
        var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + "nome_titular" + txt_sufixo);
    } catch (e) {
        txt_prefixo = '.document.all[\'';
        txt_sufixo  = '\']';
        var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + "nome_titular" + txt_sufixo);
    }
}

what changes in the block of if to the else, is that case the asp.nome_campo_tit is equal to empty, the script uses a default value, in the case of "name_holder", so why not make a else with the variable asp.nome_campo_tit? For this we will update the page header:

<script type="text/javascript">
    var asp = {};
    ...   
    asp.nome_campo_cod_ts = "<%= trim(nome_campo_cod_ts) %>";
    ...
</script>

was like this:

<script type="text/javascript">
    var asp = {};
    ...   
    asp.nome_campo_cod_ts = "<%= trim(nome_campo_cod_ts) %>" || "nome_titular";
    ...
</script>

this is possible because the default value of a type is assessed as false in a comparison, then if ("") results in false, as well as var str = "" || "alt" will result in str = "alt", whereas var str = "teste" || "alt" in str = "exemplo", in this way asp.nome_campo_tit will always have a value, and we can simplify the script:

try {
    txt_prefixo = '.document.form01.';
    txt_sufixo  = '';
    var onum_proposta = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
} catch (e) {
    txt_prefixo = '.document.all[\'';
    txt_sufixo  = '\']';
    var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
}

we still have the problem of eval, but to solve we need to understand what the variables txt_chamada, txt_prefixo and txt_sufixo do...

txt_chamada contains the reference to the window containing the input:

var txt_chamada = "";
if (window.dialogArguments) {
    var oMyObject = window.dialogArguments;
    txt_chamada = "oMyObject";
} else {
    txt_chamada = "window.parent.opener";
}

instead of storing the text to assemble a script to be executed by eval(), we will store the window itself:

var janela = window.dialogArguments || window.parent.opener;

note that if janela receives window.parent.opener only if window.dialogArguments for undefined

txt_prefixo receives the txt_chamada + ".document.form1" belonging to our window, case form1 be it undefined he will use the txt_chamada + ".document.all".

try {
    txt_prefixo = '.document.form01.';
    txt_sufixo  = '';
    var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
} catch (e) {
    txt_prefixo = '.document.all[\'';
    txt_sufixo  = '\']';
    var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);
}

note that it uses a block again try-catch to set the flow control, the error here occurs when the script tries to access a property of form1 when it does not exist, then we can simplify to the following:

var container = janela.document.form1 || janela.document.all;

txt_sufixo receives the closure of a parenthesis, if txt_prefiro open a, as we will not access the properties of container through the eval(), he is unnecessary.

is worth remembering that I can access the input of container, regardless of whether he receives form1 and of all through the name of input as follows: container[nome_input], this way the line below:

var onum_proposta   = eval(txt_chamada + txt_prefixo + asp.prefixo + asp.nome_campo_tit + txt_sufixo);

is equivalent to the following:

var onum_proposta   = container[asp.prefixo + asp.nome_campo_tit];

and finally, some security checks before calling some function with dynamic name:

if (typeof janela[asp.funcao_executar] === "function") { 
    janela[asp.funcao_executar]();
}

it is necessary to do this because if janela[asp.funcao_executar] has an assigned value and is not a function, this will trigger an exception.

Remarks

As in your script the eval() always accesses the variable from the window, then it will always use a global variable, so in this case eval(variavel) will equal window[variavel].

Normally, I use the comparator === to ensure that types are equal, for example "1" == 1 returns true, whereas "1" === 1 returns false, yeah, despite the value: "1" be equal to value: 1, the type: string is different from type: int.

If any questions remain, feel free to ask.

  • I think you should follow this guideline @pnet

  • @pnet, I have made some explanations, I hope you have now understood some of the logic I applied to try to improve the readability of the script.

  • @Tobymosque, man, is giving form01 as Undefined. I have three options, not two, that is, Showmodaldialog, window.open and Modal that we use. So form01 is coming Undefined, but I have declared the three options. Uncaught Typeerror: Cannot read Property 'form01' of Undefined

  • janela is with the window who called the page?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.