我在我的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行设置断点并让它在中断后播放时,它每次都有效。该函数接受两个输入,即变量的名称和将该变量设置为的值。
答案 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();