dragon071111 2016-11-07 23:53
浏览 72

无需按“提交”og“下一步”即可连续将数据存储到数据库

I am a student who will conduct an experiment online.

The participants go to a website (a more complex version of this one: http://auforskning.rf.gd/TEST2.php) which will track a) which buttons they press and b) how long time the buttons are pushed. This is to track how many seconds each participant spend on reading the information.

However, there is one problem: The participants have to press 'Submit' or 'Next' in order to store the informations. If they read the information behind the boxes (as intended) and just close the window, the data will be lost.

Is there a way to store data continuously, so that the data isn't lost if they just close the window?

mlweb.js-file:

dtNewDate = new Date(); 
starttime = dtNewDate.getTime(); // abs. starttime of experiment

// set vars for delay 
prevtime = 0;   // memory in timefunction to compensate for delay
dtime=0;         
prevCell = -1;  // delay lag memory (-1 means first cell is not delayable 
loaded = false; // flag to test whether page has been loaded 9is set to true in reorder
boxOpen = false; // flag to test whether box is already open (using in showCont and hideCont)
chkFrm = false // flag to test whether additional form elements have to be checked on submission
warningTxt = "Some questions have not been answered. Please answer all questions before continuing!";
CBpreset = false; // flag to set CB order fixed by a matrix on forehand: default is set to false 
prevfieldname = ""; // default for switching clicks

transpImg = new Image()
tempImg = new Image()   

previousSrc="";

// default values
mlweb_outtype="XML";
mlweb_fname=0;
masterCond = 1;  // number of master conditions
randomOrder = false; // force randomize of counterbalancing order
subject="";
evtOpen = 0;
evtClose = 0;

tmDirectStart = false;
tmTimeUp = false;
tmActive = false;
tmCurTime = 0;

// get source transparant image
transpImg.src="transp.gif"

function abc_num(str)
{
out=str.toUpperCase().charCodeAt(0)-65;
return out
}

function fac(x)
{
// Faculty: x!=x(x-1)...1
var outp=1;
for (var i=1; i<=x; i++)
{outp=outp*i}
return outp
}

function CountBal(subjnr, num)
{
// counterbalance based on subj number. 
// first subject is 0
// Num is number of options to counterbalance
// (number of orders is Num!)

var numOrd=fac(num);
start = subjnr - numOrd*Math.floor((subjnr-1)/numOrd)

orderstr=""
for (var i=0;i<num;i++)
{orderstr+=i.toString()}

outstr=""
for (var i=num; i>0; i--)
{
var den=fac(i-1);
pos = Math.floor((start-1)/den)+1
outstr+=orderstr.charAt(pos-1)+","
orderstr = orderstr.substring(0,pos-1)+orderstr.substr(pos)
start=start-(pos-1)*den
}
outstr=outstr.substr(0,outstr.length-1)
return outstr.split(",")
}

function ExpMatrix(M)
{ // expand data matrices
var Mrows=M.split("`");

var outM = new Array();
for (rowcount=0;rowcount<Mrows.length;rowcount++)
    {
    outM[rowcount]=Mrows[rowcount].split("^")
    }
return outM;
}

function ExpRow(M)
{ // expand data vectors

var outM = new Array();
outM = M.split("^") 
return outM;
}

function btnHover(loc,act)
{
    if (act=='out') 
        {
            if (loc.className.indexOf(" ")>0) {tempstyle= loc.className.substring(0,loc.className.indexOf(" "));}
        } 
        else 
        {tempstyle=loc.className + ' btnhov';}

    loc.className=tempstyle;
}

function timefunction(event,name,value) {
// Record proc data in form element
mlweb_form=document.forms[mlweb_fname].elements['procdata']

    dtNewDate = new Date();
    eventtime = dtNewDate.getTime();
    var curtime = eventtime-starttime-dtime;  // dtime is to compensate for delay time (failed openings have negative time!
//  if (prevtime>curtime) {curtime=prevtime;} else {prevtime=curtime}; // check with previous event time: if smaller, then delay was not finished: set curtime to prevtime so event has duration 0;

    dtime=0; // reset dtime
    if (mlweb_outtype=="XML")
        {
        var str="<eventblock><event>"+event+"</event><name>"+name+"</name><value>"+value+"</value><time>"+curtime+"</time></eventblock>";
        var headerstr="<?xml version=1.0?>"
        }
        else 
        {
        var str="\""+event+"\",\""+name+"\",\""+value+"\",\""+curtime+"\"
"
        var headerstr="\"event\",\"name\",\"value\",\"time\"
"
        };

    if(mlweb_form.value=='') 
        {
        mlweb_form.value=headerstr;
        }
    mlweb_form.value+=str;

if (event=="onload") {reorder();}
return true;
}

// convert event to eventdata and call save function
function RecordEventData(objActionElement, objEvent)
    {
    var strName, strEventType, strFormValue;
    strName = objActionElement.name;
    strFormValue = (objActionElement.value) ? objActionElement.value : "";
    strEventType = objEvent.type;

    //call timefunction 
    timefunction(strEventType,strName, strFormValue)
    return false;
    }

function checkForm(formHandle)
{
if (chkFrm) 
    {
    noElm = document.forms[mlweb_fname].elements.length;

    var filled=true;

    for (i=0;i<noElm;i++)
        {   
        elemHandle = document.forms[0].elements[i];
        if (elemHandle.type=="hidden") {continue}; 
        if (elemHandle.value=="") {filled = false; break};
        if (elemHandle.type=="select-one") {if (elemHandle.options[elemHandle.selectedIndex].value=="") {filled = false; break};}
        if (elemHandle.type=="radio")   // procedure to check radio buttons
           { 
             radio_name=elemHandle.name;  // get name (needed to retrieve length)
                                      // get length of radio button group      
            r_length = eval("document.forms[0]."+radio_name).length

            for (ri=0;ri<r_length;ri++)  // check each button and break loop if checked button was found
            { radioHandle = document.forms[0].elements[i+ri];
              if (radioHandle.checked) {filled=true; break} else {filled=false};
            }
            if (filled) {i=i+r_length-1; continue} else {break};  // if checked button found; continue
                                                              // else break loop and show warning
            }

    }
if (!filled) {alert(warningTxt);timefunction('submit','submit','failed');return false};
}

if ((chkchoice=="nobuttons") | !chkFrm) {return true;}
if (chkchoice==true) {timefunction('submit','submit','succeeded');return true} else {alert(warningTxt);timefunction('submit','submit','failed');return false};
}


function objElem(name,value)
{
this.name=name
this.value=value
}

function ShowCont(fieldname, objEvent)
{
if (!loaded) {return;} // do not open boxes when page is loading
if (!tmDirectStart & tmActive & tmCurTime==0) {startTmBar();}
if (tmTimeUp) {return;}
// check if a click on a link (A) occurs. this happens for example 
// when a mlweb A link gets a focus (due to clicking the box) and a subject presses enter
// this is to prevent enters from generating events when in click (rather than mouseover) mode

if (objEvent.srcElement)
    {
        if (objEvent.srcElement.nodeName=="A") {return}
    }
    else if (objEvent.target)
    {
        if (objEvent.target.nodeName=="A") {return}
    }

var row = abc_num(fieldname);
var col = parseInt(fieldname.substr(1));

thisElem = new objElem
// check if open cell should be recorded
if ((statecont[RowOut[row]][ColOut[col]]=="0") & !(recOpenCells)) {return;}
if (boxOpen) {return;}

if (evtClose<3) {boxOpen = true;} //set flag to show box is open

// retrieve tagname and txt for this cell
thisElem.name = tagcont[RowOut[row]][ColOut[col]];
thisElem.value = txtcont[RowOut[row]][ColOut[col]];

RecordEventData(thisElem, objEvent);

if (document.getElementById)  
    {
    // IE6/NS6>/Mozilla
    HandleTxt = document.getElementById(fieldname+"_txt");
    HandleBox = document.getElementById(fieldname+"_box");
    }
    else if (document.all)
    {
    //IE4/5
    HandleTxt=eval("document.all['"+fieldname+"_txt"+"']");
    HandleBox=eval("document.all['"+fieldname+"_box"+"']");
    }

// delay

currCell = -1; 
for (var i=0;i<Dlist.length;i++)
    {if (tagcont[RowOut[row]][ColOut[col]]==Dlist[i]) {currCell=i;break;}}

if ((prevCell!=-1)&(currCell!=-1)) {dtime = DTimes[currCell][prevCell];} else {dtime=0}; 
prevCell = currCell;

//HandleTxt.style.visibility='visible';HandleBox.style.visibility='hidden';

delay=window.setTimeout("HandleTxt.style.visibility='visible';HandleBox.style.visibility='hidden';",dtime)  //make image transparant

}

function HideCont(fieldname,objEvent)
{
if (!loaded) {return;} // do not open boxes when page is loading
if (!boxOpen) {return;} // do not close boxes that are not open...

window.clearTimeout(delay);

var row = abc_num(fieldname);
var col = parseInt(fieldname.substr(1));

// check if open cell should be recorded
if ((statecont[RowOut[row]][ColOut[col]]=="0") & !(recOpenCells)) {return;}

boxOpen = false; // set tag to show that box is closed again

thisElem = new objElem;
thisElem.name = tagcont[RowOut[row]][ColOut[col]];

// save procesdata
RecordEventData(thisElem, objEvent)

if (document.getElementById)  
    {
    // IE6/NS6>/Mozilla
    HandleTxt = document.getElementById(fieldname+"_txt");
    HandleBox = document.getElementById(fieldname+"_box");
    }
    else if (document.all)
    {
    //IE4/5
    HandleTxt=eval("document.all['"+fieldname+"_txt"+"']");
    HandleBox=eval("document.all['"+fieldname+"_box"+"']");
    }

HandleTxt.style.visibility='hidden';HandleBox.style.visibility='visible';
}

function SwitchCont(fieldname, objEvent)
{
// special function for clicking tasks

if (!loaded) {return;} // do not open boxes when page is loading
if (!tmDirectStart & tmActive & tmCurTime==0) {startTmBar();}
if (tmTimeUp) {return;}

// check if a click on a link (A) occurred. this happens for example 
// when a mlweb A link gets a focus (due to clicking the box) and a subject presses enter
// this is to prevent enters from generating events when in click (rather than mouseover) mode

if (objEvent.srcElement)
    {
        if (objEvent.srcElement.nodeName=="A") {return}
    }
    else if (objEvent.target)
    {
        if (objEvent.target.nodeName=="A") {return}
    }

thisElem = new objElem
var row = abc_num(fieldname);
var col = parseInt(fieldname.substr(1));
// check if open cell should be recorded
if ((statecont[RowOut[row]][ColOut[col]]=="0") & !(recOpenCells)) {return;}

if (fieldname==prevfieldname)
    {
    // just close current box if box is same as previous    
    window.clearTimeout(delay);

    var row = abc_num(fieldname);
    var col = parseInt(fieldname.substr(1));
    thisElem.name = tagcont[RowOut[row]][ColOut[col]];

    // save procesdata
    RecordEventData(thisElem, objEvent)

    if (document.getElementById)  
        {
        // IE6/NS6>/Mozilla
        HandleTxt = document.getElementById(fieldname+"_txt");
        HandleBox = document.getElementById(fieldname+"_box");
        }
        else if (document.all)
        {   
        //IE4/5
        HandleTxt=eval("document.all['"+fieldname+"_txt"+"']");
        HandleBox=eval("document.all['"+fieldname+"_box"+"']");
        }

        HandleTxt.style.visibility='hidden';HandleBox.style.visibility='visible';
        prevfieldname="";
    }
    else
    {
    if ((prevfieldname!="")&(evtClose==1))
        {
        // first close prev box if box is not same as previous
        window.clearTimeout(delay);
        var row = abc_num(prevfieldname);
        var col = parseInt(prevfieldname.substr(1));
        thisElem.name = tagcont[RowOut[row]][ColOut[col]];

        // save procesdata
        RecordEventData(thisElem, objEvent)

        if (document.getElementById)  
            {
            // IE6/NS6>/Mozilla
            HandleTxt = document.getElementById(prevfieldname+"_txt");
            HandleBox = document.getElementById(prevfieldname+"_box");
            }
            else if (document.all)
            {   
            //IE4/5
            HandleTxt=eval("document.all['"+prevfieldname+"_txt"+"']");
            HandleBox=eval("document.all['"+prevfieldname+"_box"+"']");
            }

            HandleTxt.style.visibility='hidden';HandleBox.style.visibility='visible';
        }

    if ((prevfieldname=="")|(evtClose==1))
    {
    // only if any box may be opened or there as no previous box open, show content
    var row = abc_num(fieldname);
    var col = parseInt(fieldname.substr(1));
    thisElem.name = tagcont[RowOut[row]][ColOut[col]];
    thisElem.value = txtcont[RowOut[row]][ColOut[col]];

    RecordEventData(thisElem, objEvent);

    if (document.getElementById)  
        {
        // IE6/NS6>/Mozilla
        HandleTxt = document.getElementById(fieldname+"_txt");
        HandleBox = document.getElementById(fieldname+"_box");
        }
        else if (document.all)
        {
        //IE4/5
        HandleTxt=eval("document.all['"+fieldname+"_txt"+"']");
        HandleBox=eval("document.all['"+fieldname+"_box"+"']");
        }

    // delay

    currCell = -1; 
    for (var i=0;i<Dlist.length;i++)
        {if (tagcont[RowOut[row]][ColOut[col]]==Dlist[i]) {currCell=i;break;}}

    if ((prevCell!=-1)&(currCell!=-1)) {dtime = DTimes[currCell][prevCell];} else {dtime=0}; 
    prevCell = currCell;

    //HandleTxt.style.visibility='visible';HandleBox.style.visibility='hidden';

    delay=window.setTimeout("HandleTxt.style.visibility='visible';HandleBox.style.visibility='hidden';",dtime)  //make image transparant
    prevfieldname=fieldname;
    }
    }
}



function recChoice(eventname ,name, value)
{
chkchoice = true;
timefunction(eventname, name, value);

if (document.forms[mlweb_fname].choice) {document.forms[mlweb_fname].choice.value = name;}

if (btnType=="button")
    {
    for (i=0;i<btnTxt.length;i++)
        {
        if (btnFlg==1) {btnNum = ColOut[i]} else {btnNum = RowOut[i]};
        HandleBut = eval("document.forms['"+mlweb_fname+"']."+btnTag[btnNum]);

        if (btnTag[btnNum]==name) {HandlePressed = HandleBut};

        if (btnState[btnNum]=="1") {HandleBut.className = 'btnStyle';}
        }

        HandlePressed.className='pressedStyle btnHov';
}

}
function loadMatrices()
{
// get settings data from script in body
txtcont = ExpMatrix(txt);
statecont = ExpMatrix(state);  
tagcont = ExpMatrix(tag);   
boxcont = ExpMatrix(box);
WidthCol = ExpRow(W_Col);
HeightRow = ExpRow(H_Row);
DTimes = ExpMatrix(delay);

CountCol = ExpRow(CBCol);
CountRow = ExpRow(CBRow);

btnTxt = ExpRow(btntxt);
btnTag = ExpRow(btntag);
btnState = ExpRow(btnstate);

// new in version 99.2: CB preset matrix
if (CBpreset) {
    CBorder = ExpMatrix(CBord);
}

ColOut = new Array();
for (var i=0; i<CountCol.length; i++)
{ColOut[i]=i;}

RowOut = new Array();
for (var i=0; i<CountRow.length; i++)
{RowOut[i]=i;}

Dlist = new Array();
for (j=0;j<RowOut.length;j++)
    {
    for (i=0;i<ColOut.length;i++)
        {
        if (statecont[j][i]=="1") {Dlist[Dlist.length]=tagcont[j][i];}
        }
    }
}

function reorder()
{
// if referer present (or other php/asp code) then get current hit number
if (document.cookie.indexOf("mlweb_subject=")!=-1)
        {
        subjstr=document.cookie;
        subject=subjstr.substr(subjstr.indexOf("mlweb_subject=")+14);
        }

if (document.cookie.indexOf("mlweb_condnum=")!=-1)
        {
        subjstr=document.cookie;
        subjnr=parseInt(subjstr.substr(subjstr.indexOf("mlweb_condnum=")+14));
        subjtype = "cookie";
        //alert(subjnr + " " + subjtype);
        }
        else 
        {
            if (typeof ref_cur_hit!="undefined")
                {subjnr = ref_cur_hit; subjtype = "header"}
                else
                { 
                subjnr=-1; subjtype = "random"; 
                }
        }

    // if subj nr turns out to be not a number, or randomizer is set to true then set it to randomize
    if (isNaN(subjnr)|randomOrder) {subjnr=-1; subjtype = "random";}

if (document.forms[mlweb_fname].condnum) {document.forms[mlweb_fname].condnum.value = subjnr;}
if (document.forms[mlweb_fname].expname) {document.forms[mlweb_fname].expname.value = expname;}
if (document.forms[mlweb_fname].nextURL) {document.forms[mlweb_fname].nextURL.value = nextURL;}
if (document.forms[mlweb_fname].subject) {document.forms[mlweb_fname].subject.value = subject;}
if (document.forms[mlweb_fname].to_email) {document.forms[mlweb_fname].to_email.value = to_email;}


if (CBpreset)
{
if (subjnr==-1) {subjnr=Math.floor(Math.random()*CBorder.length)}
// CB order is preset in a matrix 
curord = Math.floor(subjnr/masterCond) % CBorder.length;
cbcount=0;
for (var i=0; i<CountCol.length; i++)
    {
    ColOut[i]=parseInt(CBorder[curord][cbcount]);
    cbcount++;
    }


RowOut = new Array();

for (var i=0; i<CountRow.length; i++)   
    {
    RowOut[i]=parseInt(CBorder[curord][cbcount]);
    cbcount++
    }

}

else
{

// code if no prespecified CBorder

// retrieve position of counterbalance groups 

var cf=new Array()  // position of fixed cols
var c1=new Array()  // position of c1 cols

for (var i=0; i<CountCol.length; i++)
    {
    switch (CountCol[i])
        { 
        case '0': cf[cf.length]=i;break;
        case '1': c1[c1.length]=i;break;
        }
    }

var rf=new Array()  // position of fixed rows
var r1=new Array()  // position of c1 rows

for (var i=0; i<CountRow.length; i++)
    {
    switch (CountRow[i])
        { 
        case '0': rf[rf.length]=i;break;
        case '1': r1[r1.length]=i;break;
        }
    }

// subjDen is the denominator used to devide the subj number for each counterbalance step

subjDen = 1;   

if (subjtype!="random") {subjDen = Math.floor(subjDen * masterCond)};
// first determine column and row connects and switch on that

var numCond = (c1.length>0 ? fac(c1.length) : 1)*(r1.length>0 ? fac(r1.length) : 1);

if (subjnr==-1) {subjnr=Math.floor(Math.random()*numCond)}
//alert("total cond:" + numCond+"
subject: "+subjnr);

// counterbalance col groups        
if (c1.length>0) {c1_order=CountBal(subjnr/subjDen+1,c1.length); 
                    subjDen = subjDen*fac(c1.length);} 

var c1count=0;
ColOut = new Array();

for (var i=0; i<CountCol.length; i++)
    {
    switch (CountCol[i])
        { 
        case '0': ColOut[i]=i;break;
        case '1': ColOut[i]=c1[c1_order[c1count]];c1count++;break;
        }
    }

// counterbalance rows                  
if (r1.length>0) {r1_order=CountBal(subjnr/subjDen+1,r1.length); subjDen = subjDen * fac(r1.length);} 

var r1count=0;
RowOut = new Array();

for (var i=0; i<CountRow.length; i++)
    {
    switch (CountRow[i])
        { 
        case '0': RowOut[i]=i;break;
        case '1': RowOut[i]=r1[r1_order[r1count]];r1count++;break;
        }
    }


}

Dlist=new Array();

// reorder and resize table content
    for (j=0;j<RowOut.length;j++)
    {
    for (i=0;i<ColOut.length;i++)
        {
        var label = String.fromCharCode(j+97)+i.toString();
        if (statecont[j][i]=="1") {Dlist[Dlist.length]=tagcont[j][i];}

        if (document.getElementById)  
            {
            // IE6/NS6>/Mozilla
            HandleCont = document.getElementById(label+"_cont");
            HandleTxt = document.getElementById(label+"_txt");
            HandleBox = document.getElementById(label+"_box");
            HandleTD = document.getElementById(label+"_td");
            HandleTDbox = document.getElementById(label+"_tdbox");
            HandleImgBox = document.getElementById(label+"_img");
            HandleImg = eval("document.images."+label);
            pxstr="px";
            }
            else if (document.all)
            {
            //IE4/5
            HandleCont=eval("document.all['"+label+"_cont"+"']");
            HandleTxt=eval("document.all['"+label+"_txt"+"']");
            HandleTD=eval("document.all['"+label+"_td"+"']");
            HandleBox=eval("document.all['"+label+"_box"+"']");
            HandleTDbox=eval("document.all['"+label+"_tdbox"+"']");
            HandleImgbox=eval("document.all['"+label+"_img"+"']");
            HandleImg = eval("document.images."+label);
            pxstr="px";
            }

        // set txt 
        HandleTD.innerHTML =""; // empty for IE5 on mac bug
        // if txtcont is empty or only contains spaces then replace by nbsp to keep TD layout
        if (txtcont[RowOut[j]][ColOut[i]].replace(/[\x20]/gi, "")=="") {HandleTD.innerHTML = "&nbsp;"} 
            else {
                    // if boxes are non-active and labels are fixed, header rows should also be fixed
                    if (statecont[RowOut[j]][ColOut[i]]=="0")   
                        { 
                        if (colFix) {tempcol = i} 
                            else    {tempcol=ColOut[i]};

                        if (rowFix) {temprow = j} 
                            else    {temprow = RowOut[j]};

                        HandleTD.innerHTML = txtcont[temprow][tempcol];
                        }

                    else {HandleTD.innerHTML = txtcont[RowOut[j]][ColOut[i]]};
            };

        HandleTDbox.innerHTML =""; // empty for IE5 on mac bug
        // if boxcont is empty or only contains spaces then replace by nbsp to keep TD layout
        if (boxcont[RowOut[j]][ColOut[i]].replace(/[\x20]/gi, "")=="") {HandleTDbox.innerHTML = "&nbsp;"} 
            else {
                        if (colFix) {tempcol = i} 
                            else    {tempcol=ColOut[i]};

                        if (rowFix) {temprow = j} 
                            else    {temprow = RowOut[j]};

                        HandleTDbox.innerHTML = boxcont[temprow][tempcol];              
                };

        //set sizes
        HandleTD.width = parseInt(WidthCol[ColOut[i]])-5;
        HandleTD.height = parseInt(HeightRow[RowOut[j]])-5;
        HandleTDbox.width = parseInt(WidthCol[ColOut[i]])-5;
        HandleTDbox.height = parseInt(HeightRow[RowOut[j]])-5;
        if (statecont[RowOut[j]][ColOut[i]]=="1") {HandleTD.className = activeClass;} else {HandleTD.className = inactiveClass};
        HandleCont.style.width = parseInt(WidthCol[ColOut[i]])+pxstr;
        HandleCont.style.height = parseInt(HeightRow[RowOut[j]])+pxstr;
        HandleTxt.style.width = parseInt(WidthCol[ColOut[i]])+pxstr;
        HandleTxt.style.height = parseInt(HeightRow[RowOut[j]])+pxstr;
        HandleTxt.style.clip = "rect(0px "+ HandleTxt.style.width + " " + HandleTxt.style.height +" 0px)";
        HandleBox.style.width = parseInt(WidthCol[ColOut[i]])+pxstr;
        HandleBox.style.height = parseInt(HeightRow[RowOut[j]])+pxstr;
        HandleBox.style.clip = "rect(0px "+ HandleBox.style.width + " " + HandleBox.style.height +" 0px)";
        HandleImgBox.style.width = parseInt(WidthCol[ColOut[i]])+pxstr;
        HandleImgBox.style.height = parseInt(HeightRow[RowOut[j]])+pxstr;
        HandleImg.height = parseInt(HeightRow[RowOut[j]]);
        HandleImg.width  = parseInt(WidthCol[ColOut[i]]);

        // open state=0 boxes using img names from imgcont matrix
        if (statecont[RowOut[j]][ColOut[i]] == '0') {HandleBox.style.visibility = "hidden"; HandleTxt.style.visibility = "visible";} else {HandleBox.style.visibility = "visible"; HandleTxt.style.visibility = "hidden";}

        }
    }
    // if there are buttons then reorder the buttons according to the counterbalancing scheme
    if (btnFlg>0)
        {
        btn_inner = new Array()
        for (bc=0;bc<btnTxt.length;bc++)
            {               

            // swap names if not counterbalancing is turned off 
            if (btnFlg==1) 
                {
                //var btnNum = parseInt(ColOut[bc])
                realNum=parseInt(ColOut[bc]);
                if (colFix) {var txtNum = bc;  } 
                    else   {var txtNum = realNum;} 
                }
                else {
                //var btnNum = parseInt(RowOut[bc])                 
                    realNum=parseInt(RowOut[bc]);
                if (rowFix) {var txtNum = bc;}
                    else {var txtNum = realNum;}
                    }
            if (btnState[realNum]=="1") 
                        {
                        if (btnType=="radio") 
                            {var functionstr = "onMouseOver=\"timefunction('mouseover','"+btnTag[realNum]+"','"+btnTxt[realNum]+"')\" onClick=\"recChoice('onclick','"+btnTag[realNum]+"','"+btnTxt[txtNum]+"')\" onMouseOut=\"timefunction('mouseout','"+btnTag[realNum]+"','"+btnTxt[realNum]+"')\"";
                                btn_inner[bc]="<INPUT type=\"radio\" name=\"mlchoice\" value=\""+btnTag[realNum]+"\" "+functionstr+">"+btnTxt[txtNum];}
                            else
                            {var functionstr = "onMouseOver=\"btnHover(this,'in');timefunction('mouseover','"+btnTag[realNum]+"','"+btnTxt[realNum]+"')\" onClick=\"recChoice('onclick','"+btnTag[realNum]+"','"+btnTxt[txtNum]+"')\" onMouseOut=\"btnHover(this,'out');timefunction('mouseout','"+btnTag[realNum]+"','"+btnTxt[realNum]+"')\"";
                                btn_inner[bc]="<INPUT class=\"btnStyle\" type=\"button\" name=\"" + btnTag[realNum] + "\" value=\""+btnTxt[txtNum]+"\" "+functionstr+">";} 
                        }
                        else
                        {btn_inner[bc]="&nbsp;";}

            }

            for (bc=0;bc<btnTxt.length;bc++)
                {   
                    if (document.getElementById)  
                        {
                        // IE6/NS6>/Mozilla
                        HandleTD = document.getElementById("btn_"+bc.toString());
                        }
                        else if (document.all)
                            {
                        //IE4/5
                        HandleTD=eval("document.all['"+"btn_"+bc.toString()+"']");
                        }
            if (bc==0) {defTDcolor = HandleTD.style.backgroundColor;}
            docstr=btn_inner[bc];

            HandleTD.innerHTML =""; // empty for IE5 on mac bug
            HandleTD.innerHTML = docstr;
                }
    }

// send col and row orders as events
timefunction("subject", subjtype,subjnr)
timefunction("order","col",ColOut.join("_"))
timefunction("order","row",RowOut.join("_"))
timefunction("events","open_close",evtOpen.toString()+"_"+evtClose.toString());
loaded = true; // set flag that page has been loaded;
if (tmActive)   {
                initTmBar();
                if (tmDirectStart) {startTmBar();}
                }

return;
}

function initTmBar() {
if (!tmActive) {return false;}

if (document.getElementById)  
    {
    // IE6/NS6>/Mozilla
    HandleTmCont = document.getElementById("tmCont");
    HandleTmBar = document.getElementById("tmBar");
    HandleTmTime = document.getElementById("tmTime");
    }
    else if (document.all)
    {
    //IE4/5
    HandleTmCont =eval("document.all['tmCont']");
    HandleTmBar=eval("document.all['tmBar']");
    HandleTmTime=eval("document.all['tmTime']");
    }
HandleTmCont.style.width=parseInt(tmWidthPx+4)+"px";
HandleTmTime.style.width=parseInt(tmWidthPx+4)+"px";

if (tmFill) {HandleTmBar.style.width="0px"; HandleTmTime.innerHTML="0 sec";} 
        else {HandleTmBar.style.width=parseInt(tmWidthPx)+"px"; HandleTmTime.innerHTML=parseInt(tmTotalSec)+" sec";}
if (tmShowTime) {HandleTmTime.style.visibility="visible";} 
        else {HandleTmTime.style.visibility="hidden";}
}

function startTmBar()
{
if (!tmActive) {return false;}
tmCurTime = 0;
tmInt = setInterval("refreshTmBar()", tmStepSec*1000);
}

function refreshTmBar()
{
if (!tmActive) {return false;}
tmCurTime= tmCurTime + tmStepSec*1000;
if (tmCurTime>tmTotalSec*1000) {clearInterval(tmInt); tmTimeUp=true; return;}
if (tmFill) {
            HandleTmBar.style.width=parseInt(Math.round(tmCurTime/(tmTotalSec*1000)*tmWidthPx))+"px";
            if (tmMinLabel=="false" | tmCurTime <60000) {HandleTmTime.innerHTML=parseInt(Math.round(tmCurTime/1000))+" "+tmSecLabel}
                                        else 
                                    {   var mnt = parseInt(Math.floor(tmCurTime/60000));
                                        var secs = parseInt((tmCurTime-mnt*60000)/1000);
                                        HandleTmTime.innerHTML=mnt+" "+tmMinLabel+" : "+secs+" "+tmSecLabel}    ;
            }
            else {HandleTmBar.style.width=parseInt(tmWidthPx-Math.round(tmCurTime/(tmTotalSec*1000)*tmWidthPx))+"px";
            HandleTmTime.innerHTML=parseInt(tmTotalSec-Math.round(tmCurTime/1000))+" sec";
            if (tmMinLabel=="false" | tmCurTime<60000) {HandleTmTime.innerHTML=parseInt(tmTotalSec-Math.round(tmCurTime/1000))+" "+tmSecLabel}
                                        else 
                                    {   var timeleft = tmTotalSec*1000-tmCurTime;
                                        var mnt = parseInt(Math.floor(timeleft/60000));
                                        var secs = parseInt((timeleft-mnt*60000)/1000);
                                        HandleTmTime.innerHTML=mnt+" "+tmMinLabel+" : "+secs+" "+tmSecLabel}    ;
            }
}
  • 写回答

1条回答 默认 最新

  • dongyashun2559 2016-11-08 00:34
    关注

    EDIT: There is a lot going on in that javascript function. A lot of it is exporting and importing values from and to the form. Without really knuckling down into it, I can't be certain that my attempts below won't ruin the integrity of your data.
    Please consider hiring someone to correct this. It may be a relativeley simple change and a google of 'freelance javascript developer' would help you find someone.

    That code submits the words 'submit','submit','submit' to a function called timefunction. Apart from the hint that this code is a form of subliminal messaging to make your uses more subservient (/joke), it looks like that function is defined elsewhere. This means we cannot tell what it actually does. mlweb.js is an external javascript file that is linked at the start of this page, and that leads me to believe it is where that function is defined (that means all the code to handle that function comes from there).

    There is, however, and obvious link from your submit button that calls the function using an onclick method. onClick=timefunction('submit','submit','submit') which could be replicated based on other criteria that doesn't require a click. If, for example, you wished to make it submit the data IF someone tries to leave the page (this may cause an issue if they submit first.)

    Rough code

    window.onbeforeunload = timefunction('submit','submit','submit');
    

    This code would tell the browser to send this function those three words before closing.

    As that code seems to simply send text values (probably to hint timefunction to do some action in particular), there may be one of those values you could change to record that it was a close event rather than a submit. But we do not know which one without seeing the other code. I would experiment by changing one at a time if it was my code. But I would not advise you to do so since you don't know what the rest does.

    Then you have an action on the form that does two things, one is onSubmit="return checkForm(this)" which seems like a form validator to make sure everything is filled in correctly. You could add this step in to ensure it has, but now you're going to try and prevent them from closing the window, and bug them about not submitting it.

    Then the form is actually submitted to save.php which we also cannot see. Again, we can send the form details (as is) just as if it was submitted (WITHOUT VALIDATION). We would do that by adding document.forms["mlwebform"].submit(); with the previous code.

    We can squeeze in the form validation, but I'm not sure what the return result is. Here's two options.

    Like so

    //no validation!!!
    window.onbeforeunload = function() {
        timefunction('submit','submit','submit');
        document.forms["mlwebform"].submit();
    }
    
    //with possible validation
    window.onbeforeunload = function() {
        if (checkForm(document.forms["mlwebform"])) { //if the validator returns true, continue
            timefunction('submit','submit','submit');
            document.forms["mlwebform"].submit();
        } else { //if the validator does anything else, say so
            MsgBox("Apologies, something went wrong");
        }
    }
    

    This COULD work, depending on the functions in that other file. I would try the second one first, because having validation would be great. Otherwise use the first one as a fall back.

    I would add this after loadMatrices(); and before </script>.

    Conclusion
    Seeing mlweb.js would help.
    We can try and fake the same response a submit would do (this could cause errors, and we don't know how they are dealt with)
    If you're brave, and there are no/little consequences to you messing up your data by dumping errors and un-validated into it through experimentation at this stage, then test out the 2 code examples above.
    If the integrity of your data at this stage is important, or this is a live/production site, then don't! Get someone to properly assess the code

    评论

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配