javascript函数有时会使用safari进行测试(客户端指定)

时间:2014-03-12 04:09:12

标签: javascript function safari try-catch xmlhttprequest

我在我的mac(v7.0.2)上使用Safari来测试PLC上的Web服务器,并且PV_Access.js中的函数pvAccess.WritePV()被调用但是它有时只执行,我觉得很奇怪,来自if语句的错误消息没有出现,调试器说它正在工作。

此外,当我在开发菜单下的Safari中的Web检查器上使用调试器,并逐步完成PV_Access.js时,它每次都有效,但是如果我只是玩它不起作用。

我称之为功能:

<button onclick = "check_value_text_box('track')" id = "Track_home" name = "Track_home">Track</button>

是:

function check_value_text_box(next_page)
{
    if ((!Value.value) || (Value.value.length > 4) || (Value.value > 359) || (Value.value < 0))
    {
        alert("ERROR: Please enter a number between and including 0 and 359.");
    }
    else
    {
        pvAccess.WritePV('_offset', document.getElementById('Value').value);
        window.location.href = ''+ next_page +'.asp';
    }
}

和pvAccess.WritePV在文件PV_Access.js中定义:

pvAccess =  {}
pvAccess.Func = function() 
{
    function AccessPV(name, rValue, wValue)
    {
        var url = '/goform/ReadWrite';
        var data = 'redirect=/response.asp&variable=' + escape(name);
        if(rValue != null && rValue != "")
        {
            data += '&value=' + escape(rValue);
            data += "&write=1";
        }
        else
        {
            data += '&value=none';
            data += "&read=1";
        }
        var xmlHttp = null;
        try {
            // Mozilla, Opera, Safari sowie Internet Explorer (ab v7)
            xmlHttp = new XMLHttpRequest();
        } catch(e) {
            try {
                // MS Internet Explorer (ab v6)
                xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                try {
                    // MS Internet Explorer (ab v5)
                    xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
                } catch(e) {
                    xmlHttp  = null;
                }
            }
        }
        if (xmlHttp) 
        {
            xmlHttp.open('POST', url , 1);
            xmlHttp.onreadystatechange = function () {
                if (xmlHttp.readyState == 4) {

                    if(wValue != null)
                    {
                        wValue[3] = xmlHttp.responseText;
                        wValue[3] = wValue[3].replace("<!-- B&R ASP Webserver -->",""); 
                        // value attribut of node
                        wValue.value = wValue[3];
                        return wValue;
                    }


                }
            };
            xmlHttp.send(data);
        }
    }
    // public   
    {
        this.WritePV = function(name, value) 
        {
            AccessPV(name,value);
        }

        this.ReadPV = function(name,wValue)
        {
            return  AccessPV(name, null, wValue);
        }       
    }
}
pvAccess = new pvAccess.Func();

当我在PV_Access.js的第55行设置断点并让它在中断后播放时,它每次都有效。该函数接受两个输入,即变量的名称和将该变量设置为的值。

1 个答案:

答案 0 :(得分:0)

因为问题似乎是由这一行引起的:

window.location.href = ''+ next_page +'.asp';

在ajax调用完成之前执行,然后解决方案是延迟该行直到Ajax调用完成。

您可以通过向AccessPV添加回调函数来实现这一点,这样您就可以传入一个回调函数,该函数将在ajax操作完成时得到通知。然后,在WritePV()中,传入一个回调函数并更改该回调中的window.location。

function check_value_text_box(next_page)
{
    if ((!Value.value) || (Value.value.length > 4) || (Value.value > 359) || (Value.value < 0))
    {
        alert("ERROR: Please enter a number between and including 0 and 359.");
    }
    else
    {
        pvAccess.WritePV('_offset', document.getElementById('Value').value, function() {
            window.location.href = ''+ next_page +'.asp';
        });
    }
}

pvAccess =  {}
pvAccess.Func = function() 
{
    function AccessPV(name, rValue, wValue, fn)
    {
        var url = '/goform/ReadWrite';
        var data = 'redirect=/response.asp&variable=' + escape(name);
        if(rValue != null && rValue != "")
        {
            data += '&value=' + escape(rValue);
            data += "&write=1";
        }
        else
        {
            data += '&value=none';
            data += "&read=1";
        }
        var xmlHttp = null;
        try {
            // Mozilla, Opera, Safari sowie Internet Explorer (ab v7)
            xmlHttp = new XMLHttpRequest();
        } catch(e) {
            try {
                // MS Internet Explorer (ab v6)
                xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                try {
                    // MS Internet Explorer (ab v5)
                    xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
                } catch(e) {
                    xmlHttp  = null;
                }
            }
        }
        if (xmlHttp) 
        {
            xmlHttp.open('POST', url , 1);
            xmlHttp.onreadystatechange = function () {
                if (xmlHttp.readyState == 4) {

                    if(wValue != null)
                    {
                        wValue[3] = xmlHttp.responseText;
                        wValue[3] = wValue[3].replace("<!-- B&R ASP Webserver -->",""); 
                        // value attribut of node
                        wValue.value = wValue[3];
                        return wValue;
                    }
                    if (fn) {
                        fn(xmlHttp.responseText);
                    }
                }
            };
            xmlHttp.send(data);
        }
    }
    // public   
    {
        this.WritePV = function(name, value, callback) 
        {
            AccessPV(name,value, null, callback);
        }

        this.ReadPV = function(name,wValue)
        {
            return  AccessPV(name, null, wValue);
        }       
    }
}
pvAccess = new pvAccess.Func();