prototype里Form.Element.focus(element) 方法是否实现错误?

博客作者在使用Prototype.js库时发现了Form.Element.focus方法的一个潜在bug:该方法返回字符串而非HTMLElement实例,导致无法进行链式调用。作者给出了修改示例。
今天上午没事做,在公司拿着买到的 <<prototype与script.aculo.us终极揭秘>>一书看,无意中发现了一个比较有趣的问题,不知道是不是 prototype.js自己的bug,拿上来让各位鉴定一下。
参照prototype.js的官方的api文档,Form.Element.focus(element) -> HTMLElement,他的意思应该是调用这个focus()方法之后返回的是应该是一个被prototye扩张的 HTMLElement,然后可以拿着返回的对象可以继续进行链式调用。可事实上并非如此。我自己测试了一把。下面的代码给的不全。要测试的话需要自己补全。


<script type="text/javascript">
function test_focus()
{
$("clickme").observe("click",function(){
alert(Object.isString(Form.Element.focus('username')))
Form.Element.focus('username').disable().setValue("hahahaha");
});
}
document.observe("dom:loaded",test_focus)
</script>
<body>
<form id="login">
username : <input type="text" id="username" value="hehehehe"><br>
password : <input type="text" id="password"><br>
<input type="button" value="click me" id="clickme"><br>
</form>
</body>


上面的代码运行到alert()部分的时候,会提示true,也就是说他返回的是一个String,然后会报出一个Form.Element.focus("username").disable is not a function的错误。

查看prototype.js的源代码,我们看到这个方法的定义,他其实就是直接返回了传进去的element,根本就没做扩展,所以所谓的链式编程到这里就不能继续下去了。

Form.Element = {
focus: function(element) {
$(element).focus();
return element;
},

select: function(element) {
$(element).select();
return element;
}
};


我直接把它hack掉之后上面的代码就可以正常运行了

Form.Element = {
focus: function(element) {
$(element).focus();
return $(element);
},

select: function(element) {
$(element).select();
return $(element);
}
};


我不知道这是不是prototype.js的bug,我这样的修改也只能说能测试通过我写的demo,所以拿出来供大家谈论一下。
请分析下面代码: <html> <head> <meta http-equiv="Expires" CONTENT="0"> <meta http-equiv="Cache-Control" CONTENT="no-cache"> <meta http-equiv="Pragma" CONTENT="no-cache"> <title>MIT ERC_V3.6.3</title> <link rel="stylesheet" href="/erc/css/tigris.css" type="text/css" /> <link rel="stylesheet" href="/erc/css/inst.css" type="text/css" /> <link rel="stylesheet" href="/erc/css/datepicker.css" type="text/css" /> <link rel="stylesheet" href="/erc/js/sortable/sortabletable.css" type="text/css" /> <script type="text/javascript" src="/erc/js/datepicker.js"></script> <script type="text/javascript" src="/erc/js/buttonstyle.js"></script> <script type="text/javascript" src="/erc/js/stringutil.js"></script> <script type="text/javascript" src="/erc/js/openwindow.js"></script> <script type="text/javascript" src="/erc/js/sortable/sortabletable.js"></script> <script type="text/javascript" src="/erc/js/filterlist.js"></script> <script type="text/javascript" src="/erc/js/prototype.js"></script> <script type="text/javascript" src="/erc/js/xmlextras.js"></script> <!--script language="javascript" src="http://10.222.4.104:6006/ese/js/ese.js"></script> <script language="javascript" src="http://10.222.4.104:6006/ese/js/xml2json.js"></script--> <!--script src="/erc/dwr/engine.js"></script> <script src="/erc/dwr/util.js"></script> <script src="/erc/dwr/interface/checkSTRNoService.js"></script--> </head> <body marginwidth="0" marginheight="0" onkeydown="if(event.keyCode=='13') return false;" class="composite" > <script> function getHoldLotInfo(){ checkRuncardStatus(); //if(checkRuncardStatus()){ var form = document.forms['updateRequestForm']; var lotId = form.elements["requestForm.lotId"].value; var holdStepNo= form.elements["requestForm.holdStepNo"].value; if(lotId==""){alert("Please key-in one LotId");return false;} if(holdStepNo==""){ form.action="updateHoldLotInfo.action"; checkboxSync();form.submit();alert("Please key-in Hold Step No#:");} if (lotId.indexOf(" ")>0){alert("Lot Id is not allowed space!"); return false;} form.action="updateHoldLotInfo.action"; checkboxSync();form.submit(); //} } function EndQtimeHanle(id){ //alert (id); var QtimeHanle = document.getElementById("EndQtimeHanle"+id); var sQtimeHanle = QtimeHanle.options[QtimeHanle.selectedIndex].text; //alert(sQtimeHanle); var tObj = document.getElementById("allEndQtimeHandle"); var allEndQtimeHandle= tObj.value; //alert (allEndQtimeHandle); if (allEndQtimeHandle==""){ //alert(1); tObj.value = id +","+ sQtimeHanle+ ";"; }else{ //alert(2) //alert (allEndQtimeHandle.indexOf(id+",")); if (allEndQtimeHandle.indexOf(id+",")>=0){ //alert ("Replace"); allEndQtimeHandle=allEndQtimeHandle.replace(id +",;",id +","+ sQtimeHanle+ ";"); //alert ("Replace 1:"+allEndQtimeHandle ); allEndQtimeHandle=allEndQtimeHandle.replace(id +",Mapping;",id +","+ sQtimeHanle+ ";"); //alert ("Replace 2:"+allEndQtimeHandle ); allEndQtimeHandle=allEndQtimeHandle.replace(id +",Ignore;",id +","+ sQtimeHanle+ ";"); //alert ("Replace 3:"+allEndQtimeHandle ); allEndQtimeHandle=allEndQtimeHandle.replace(id +",NULL;",id +","+ sQtimeHanle+ ";"); //alert ("Replace 3:"+allEndQtimeHandle ); tObj.value = allEndQtimeHandle; }else{ //alert (2); tObj.value = allEndQtimeHandle +id +","+ sQtimeHanle+ ";" } } } </script> <textarea id="_HIDDEN_TABLE_SPAN_STEPFORM" style="display:none"> <script> function updateWaferGroupResult(){ var form = document.forms['updateRequestForm']; form.action="updateWaferGroupResult.action"; form.submit(); } </script> <table border="0" cellspacing="1" cellpadding="8" width="100%"> </table> <table border="0" cellspacing="1" cellpadding="8" width="100%"> <tr class="a"> <td>Fab Area:</td> <td> FABJ1A </td> <td>NA<input type="checkbox" disabled="true"> Step No:                    01600</td> <td></td> </tr> <tr class="b"> <a name="1"> <td>Area:</td> <td >YE&FQC</td> <td>Check With RCP<input type="checkbox" disabled="true"></td> <td>Step Serial No:  <strong>1</strong></td> </tr> <tr class="b"> <td>Equipment:</td> <td colspan="3">Eqp Group: JME_MET_ET1</td> </tr> <tr class="b"> <td>Recipe:</td> <td colspan="3">CPBET3KA</td> </tr> <tr class="b"> <td>Wafer ID:</td> <td colspan="2">#02,#03,#04,#05,#06,#07,#08,#09,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19,#20,#21,#22,#23,#24,#25</td><td>Qty.: 24</td> </tr> <tr class="b"> <td>Contamination Flag: </td> <td colspan="3">NA</td> </tr> <tr class="b"> <td colspan="4">实际下货Tools:</td> </tr> <tr class="b"> <td>Remark:</td> <td colspan="3">1</td> </tr> <tr> <td bgcolor="#87CEFF" colspan=9> <b> Qtime Configuration <font color="#0000FF">Start </font> at this Step in Mainflow,need setting after 'add the step': </b> </td> </tr> <tr > <td bgcolor="#DCDCDC" width=15% colspan=2><b>Qtime info:</b></td> <td bgcolor="#DCDCDC" colspan=7> <TABLE border=0 cellSpacing=1 cellSpacing=1 width="100%"> <TR> <TD >Plan ID </TD> <TD >Plan Ver </TD> <TD ><font color="#0000FF"><B><Red>StrStepSeq</font></TD> <TD >EndStepSeq</TD> <TD >IntervalTime</TD> <TD >ControlType</TD> <TD >ExpireAction</TD> <TD >mpsStepSeq</TD> </TR> <TR> <TD >JLF100UPI0L01</TD> <TD >15</TD> <TD ><font color="#0000FF"><B>01600</font></TD> <TD >01700</TD> <TD >60</TD> <TD >Max Time</TD> <TD >Hold Lot</TD> <TD ></TD> </TR> </Table> </td> </tr> </script> <tr bgcolor="#FFFFFF"> <td colspan="4"> </td></tr> <tr bgcolor="#FFFFFF"> <td colspan="4"> </td></tr> <tr class="b"> <td colspan="4"> <center> </center> </td> </tr> </table> <table border="0" cellspacing="1" cellpadding="8" width="100%"> <script> function doQTime(groupResult){ var form = document.forms['updateRequestForm']; form.action="comeinQTime.action?method=fromMainPage&groupResultId="+groupResult; form.submit(); } function doMainFlowQTime(groupResult){ var form = document.forms['updateRequestForm']; form.action="comeinMainFlowQTime.action?method=fromMainPage&groupResultId="+groupResult; form.submit(); } </script> <tr class="b"> <th colspan="4">Group Result</th> </tr> <tr class="b"> <td colspan="4"> <table border="0" cellspacing="1" cellpadding="8" width="100%"> <input type="hidden" name="groupResults[0].id" value="113213" /> <tr class=odder> <td><b>Wafer List</b></td> <td colspan=2 align=left><b>Step List</b></td> <td colspan=2><b>QTime(m)</b></td> <td></td> </tr> <tr class=odder> <td>#02,#03,#04,#05,#06,#07,#08,#09,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19,#20,#21,#22,#23,#24,#25</td> <td width=15% colspan=2 align=left>01</td> <td colspan=2> <table border="0" cellspacing="1" cellpadding="8" width="100%"> <tr><TD><B>Type:</B>Max Time <B>Period:</B>60 <B>From:</B>1 <B>To:</B>01700 <B>mpsStepSeq:</B> <B>Action:</B>Hold Lot</TD></tr> </table> </td> <td> <input type="button" name="btnAddQtime" value="AddQTime" onclick="doQTime('113213')" class="button"> <BR> <input type="button" name="btnAddMainFlowQtime" value="AddMainFlowQTime" onclick="doMainFlowQTime('113213')" class="button"> </td> </tr> </table> </td> </tr> </table> </textarea> <script> window.opener.document.getElementById("SPAN_STEPFORM").innerHTML = document.getElementById("_HIDDEN_TABLE_SPAN_STEPFORM").value; </script> <style type="text/css"> <!-- .TextBoxReadOnly { border:1px solid #C0C0C0; text-align:left; background-color:#D3D3D3; width:200px; readonly:expression(this.readOnly=true); } .TextBoxReadWrite { border:1px solid #C0C0C0; text-align:left; background-color:#FFFFFF; width:200px; readonly:expression(this.readOnly=false); } --> </style> <script> var area="normal"; window.onload=function(){ //opener.document.updateRequestForm.updateWaferGroupResultBtn.click(); var fabName=document.forms['stepForm'].elements["stepForm.fabName"].value; if((fabName=="FAB1" ||fabName=="FAB2") && area.indexOf("DIFF")!=-1){ document.getElementById("showRemark").style.display=''; } var area=document.forms['stepForm'].elements["stepForm.area"]; if('FABJ1A'=="S1" && 'Normal'=="Scan Defect" && area.value == ""){ if(fabName=="A"){ area.value="S1A-PHOTO-M"; } else if(fabName=="B"){ area.value="S1B-PHOTO-M"; } else if(fabName=="C"){ area.value="S1C-CMP"; } } } function checkboxSync(){ var stepForm=document.forms['stepForm']; if ( (typeof stepForm.elements["rcpCheck"]!= "undefined") && stepForm.elements["rcpCheck"].checked){ stepForm.elements["stepForm.RCP"].value="on"; }else{ stepForm.elements["stepForm.RCP"].value="uncheck"; } if ( (typeof stepForm.elements["noStepNoPar"]!= "undefined") && stepForm.elements["noStepNoPar"].checked){ stepForm.elements["stepForm.noStepNo"].value="on"; }else{ stepForm.elements["stepForm.noStepNo"].value="uncheck"; } } function changeShow(object){ var stepForm=document.forms['stepForm']; var fabName=object.value; if("Engineering"==fabName) { if(!confirm("请注意您现在选择使用的是engineer folder 下的recipe!")) { stepForm["stepForm.recipeType"][0].checked=true; stepForm.action="viewStepForm.action"; checkboxSync(); stepForm.submit(); } } if("Matrix"==fabName) { if(!confirm("请注意您现在选择的是FEM run模式!")) { stepForm["stepForm.batchType"][0].checked=true; return false; } } if(object.value=="") { alert("Please select the fab area!"); return false; } if((fabName=="FAB1" ||fabName=="FAB2") && area.indexOf("DIFF")!=-1) { document.getElementById("showRemark").style.display=''; } else { document.getElementById("showRemark").style.display='none'; } if("Engineering"==fabName || "Production"==fabName || "Matrix"==fabName) { if("Engineering"==fabName) stepForm.action="viewStepForm.action?stepForm.batchType=Production"; else if("Matrix"==fabName) stepForm.action="viewStepForm.action?stepForm.energyStep=&stepForm.focusStep="; else stepForm.action="viewStepForm.action"; } else stepForm.action="viewStepForm.action?command=&stepForm.area="; checkboxSync(); stepForm.submit(); } function restrictLength(object){ var stepForm=document.forms['stepForm']; var value=object.value; if(value=="Eqp ID") { alert("输入的Eqp ID 的最大长度为7位!"); } } function checkNA(object){ var stepForm=document.forms['stepForm']; var eqpName=stepForm.elements["stepForm.eqpModeName"].value; var value=object.value; if(eqpName=="DUMMY" ||eqpName.indexOf("DMY02")!=-1){ if(value!="NA"){ alert("EQPName is DUMMY.You must select the 'NA'!"); object[object.length-1].selected=true; return false; } } } function showOvl(){ window.open('showOvl.action','','left=0,top=200,width=760,height=200'); } function defalutValue(){ var stepForm=document.forms['stepForm']; var chk=stepForm.elements['rcpCheck']; var area=stepForm.elements['stepForm.area']; var trackOutRecipe= stepForm.elements["stepForm.trackOutRecipe"]; if(chk.checked==false) { alert("如果想指定Chamber去auto run,可以把“Check with RCP”前边的勾去掉,Recipe填写recipe name_chamber list(或者中划线“-”)"); if(areaValue=="PHOTO" || areaValue=="S1A-PHOTO" || areaValue=="S1B-PHOTO" ||areaValue=="S1C-PHOTO" || areaValue=="M1A-PHOTO" || areaValue=="M1B-PHOTO" || areaValue=="M1C-PHOTO" || areaValue=="SXA-PHOTO" || areaValue=="SXC-PHOTO") trackOutRecipe.value="recipe name_chamber list"; else stepForm.elements["stepForm.recipe"].value="recipe name_chamber list"; } else { alert("请填写正确的Recipe"); if(areaValue=="PHOTO" || areaValue=="S1A-PHOTO" || areaValue=="S1B-PHOTO" ||areaValue=="S1C-PHOTO" || areaValue=="M1A-PHOTO" || areaValue=="M1B-PHOTO" || areaValue=="M1C-PHOTO" || areaValue=="SXA-PHOTO" || areaValue=="SXC-PHOTO") trackOutRecipe.value="waiting Pi_Run Result"; else stepForm.elements["stepForm.recipe"].value="waiting Pi_Run Result"; } } function clearSpec(){ var stepForm=document.forms['stepForm']; stepForm.elements['stepForm.spec'].value=""; } function showSpec(){ var stepForm=document.forms['stepForm']; //stepForm.elements['stepForm.spec'].value=""; var value= stepForm.elements['stepForm.ecdPlanName'].value; if(value==""){ alert("Please input the EdcPlan"); return false;} window.open('showSpec.action?requestFormId=113203&edcPlan=' + value + '','','status=no,scrollbars=yes,location=no,resizable=yes,left=0,top=200,width=760'); } function changeByArea(object){ var stepForm=document.forms['stepForm']; if($F("stepForm.fabName")==""){ alert("Please select the fab area !"); return false; } var value=object.value; var eqpId=stepForm.elements["stepForm.eqpMode"].value; var eqpValue=stepForm.elements["stepForm.eqpModeName"].value; if(eqpId=="Eqp ID"){ if(eqpValue=="dummy" ||eqpValue=="DUMMY" || eqpValue.indexOf("DMY02")!=-1){ //DMY02 for cension if(areaValue=="PHOTO" || areaValue=="S1A-PHOTO" || areaValue=="S1B-PHOTO" ||areaValue=="S1C-PHOTO" || areaValue=="M1A-PHOTO" || areaValue=="M1B-PHOTO" || areaValue=="M1C-PHOTO" || areaValue=="SXA-PHOTO" || areaValue=="SXC-PHOTO"){ alert("Please do not set area as PHOTO for DUMMY Eqp ID!") stepForm.elements["stepForm.area"].focus(); } } } stepForm.elements["stepForm.eqpModeName"].value=""; if(typeof stepForm.elements["stepForm.recipe"]!= "undefined") stepForm.elements["stepForm.recipe"].value=""; if(typeof stepForm.elements["stepForm.trackOutRecipe"]!= "undefined") stepForm.elements["stepForm.trackOutRecipe"].value=""; stepForm.action="changeArea.action?stepForm.recipeType=Production"; checkboxSync(); stepForm.submit(); } function changeValeuToNumber(object){ var objectValue=object.value; var pattern = /[^\d\.\+\-]/g; if(pattern.test(objectValue)){ alert("请输入正确的数字格式"); object.value=""; object.focus(); } if("energyStep"==object.id) {if( eval(objectValue)>1000 || eval(objectValue)<-1000.0) { alert("EnergyStep的范围在 (-1000~1000)."); object.value=""; object.focus(); } } if("focusStep"==object.id) {if( eval(objectValue)>2 || eval(objectValue)<-2) { alert("FocusStep的范围在 (-2~2)."); object.value=""; object.focus(); } } } function eqpToUpper(object){ var form = document.forms['stepForm']; var mode=form.elements["stepForm.eqpMode"].value; var areaValue=form.elements["stepForm.area"].value; var value=object.value; var reg=/\s/g; var stringLength=value.replace(reg,""); if(mode!="Eqp Group"){ object.value=stringLength.toUpperCase(); } if(mode=="Eqp ID"){ if(stringLength.length>7) {alert("最多7个字符!"); object.value=""; object.focus(); return false; } if(stringLength=="dummy" ||stringLength=="DUMMY" || stringLength.indexOf("DMY02")!=-1){ //DMY02 for cension if(areaValue=="PHOTO" || areaValue=="S1A-PHOTO" || areaValue=="S1B-PHOTO" ||areaValue=="S1C-PHOTO" || areaValue=="M1A-PHOTO" || areaValue=="M1B-PHOTO" || areaValue=="M1C-PHOTO" || areaValue=="SXA-PHOTO" || areaValue=="SXC-PHOTO"){ alert("Please do not set area as PHOTO for DUMMY Eqp ID!"); form.elements["stepForm.area"].focus(); return false; } if (typeof form.elements["stepForm.recipe"]!= "undefined"){ form.elements["stepForm.recipe"].value="DUMMY"; form.elements["stepForm.recipe"].className="TextBoxReadOnly"; // checkNA(form.elements['stepForm.contaminationFlag']); } }else if(typeof form.elements["stepForm.recipe"]!= "undefined") form.elements["stepForm.recipe"].className="TextBoxReadWrite"; } } function scannerToUpper(){ var form = document.forms['stepForm']; var element = form.elements["stepForm.scannerRecipe"]; element.value =element.value.toUpperCase(); } function trackToUpper(){ var form = document.forms['stepForm']; var element = form.elements["stepForm.trackOutRecipe"]; element.value =element.value.toUpperCase(); } function recipeToUpper(){ var form = document.forms['stepForm']; var element = form.elements["stepForm.recipe"]; element.value =element.value.toUpperCase(); } function getStepLotInfo(){ var form = document.forms['stepForm']; var chk= form.elements['rcpCheck']; var noStepNo= form.elements['noStepNoPar']; if (typeof form.elements["noStepNoPar"]!= "undefined"){ if (!noStepNo.checked && form.elements["stepForm.stepNo"].value==""){ alert("Please input step No."); form.elements["stepForm.stepNo"].focus(); return false; } if (noStepNo.checked && form.elements["stepForm.stepNo"].value!=""){ alert("Please unCheck NA."); return false; } } form.action="updateStepInfo.action?ercParams=true"; checkboxSync(); disableButton(); form.submit(); } function checkBoxValue(param){ var returnPara=param; var form = document.forms['stepForm']; var chk= form.elements['rcpCheck']; var noStepNo= form.elements['noStepNoPar']; if (typeof form.elements["noStepNoPar"]!= "undefined"){ } return returnPara; } function checkPageToSubmit(){ var form = document.forms['stepForm']; var chk= form.elements['rcpCheck']; var noStepNo= form.elements['noStepNoPar']; var eqpID=$F("stepForm.eqpMode"); var eqpIDValue=$F("stepForm.eqpModeName"); var areaValue=$F("stepForm.area"); var stepNo=form.elements["stepForm.stepNo"]; if (typeof form.elements["noStepNoPar"]!= "undefined"){ var elementMes = form.elements["stepForm.stepNoMes"].value; var element = form.elements["stepForm.stepNo"].value; if (elementMes==null || element!=elementMes){ alert("Please click [go] to get MES information."); form.elements["stepForm.stepNo"].focus(); return false; } } EndQtimeHanle(113228); if((eqpIDValue=="dummy" || eqpIDValue=="DUMMY")&& (areaValue=="PHOTO" || areaValue=="S1A-PHOTO" || areaValue=="S1B-PHOTO" ||areaValue=="S1C-PHOTO" || areaValue=="M1A-PHOTO" || areaValue=="M1B-PHOTO" || areaValue=="M1C-PHOTO" || areaValue=="SXA-PHOTO" || areaValue=="SXC-PHOTO") && eqpID=="Eqp ID"){ alert("Please do not set area as PHOTO for DUMMY Eqp ID!"); $("stepForm.area").focus(); return false; } if (typeof form.elements["noStepNoPar"]!= "undefined"){ if (!noStepNo.checked && form.elements["stepForm.stepNo"].value==""){ alert("Please input step No."); form.elements["stepForm.stepNo"].focus(); return false; } if (noStepNo.checked && form.elements["stepForm.stepNo"].value!=""){ alert("Please unCheck NA."); return false; } } if(form.elements['stepForm.slotId'].value!="") { if(form.elements['stepForm.ecdPlanName'].value=="") {alert("Please Input Corrective EDC Plan Name!"); form.elements['stepForm.ecdPlanName'].focus(); return false;} } if(form.elements['stepForm.ecdPlanName'].value!="") { if(form.elements['stepForm.slotId'].value=="") { alert("Please select SlotId!"); return false; } else { if(!checkWaferIdIsEqualSlotId(form)){ alert("Meas slot id is not in wafer id list"); return false; } } } if (typeof form.elements["stepForm.spec"]!= "undefined"){ var element = form.elements["stepForm.spec"].value; if (element==""&&form.elements['stepForm.slotId'].value!=""){ alert("Please Input Corrective EDC Plan Name!"); form.elements["stepForm.ecdPlanName"].focus(); return false; } } if (typeof form.elements["stepForm.area"]!= "undefined"){ var element = form.elements["stepForm.area"].value; if (element=="Please Select"){ alert("Please select area."); form.elements["stepForm.area"].focus(); return false; } } if (typeof form.elements["stepForm.waferId"]!= "undefined"){ var element = form.elements["stepForm.waferId"].value; if (element==""){ alert("Please select waferId."); form.elements["stepForm.waferId"].focus(); return false; } } if (typeof form.elements["stepForm.eqpModeName"]!= "undefined"){ var element = form.elements["stepForm.eqpModeName"].value; var elementFlag = form.elements["stepForm.contaminationFlag"].value; if (element=="" || element=="NA"){ alert("Equipment ID/Group can not be null or NA!"); form.elements["stepForm.eqpModeName"].focus(); return false; } if((element=="DUMMY" || element.indexOf("DMY02")!=-1)&& elementFlag!="NA"){ alert("EQPName is DUMMY.You must select the Contamination Flag 'NA'!"); return false; } } if (typeof form.elements["stepForm.recipe"]!= "undefined"){ var element = form.elements["stepForm.recipe"].value; if (element==""){ alert("Recipe can not be null"); form.elements["stepForm.recipe"].focus(); return false; } } if (typeof form.elements["stepForm.area"]!= "undefined"){ var element = form.elements["stepForm.area"].value; if (element==""){ alert("Area can not be empty"); form.elements["stepForm.area"].focus(); return false; } } if (typeof form.elements["stepForm.scannerRecipe"]!= "undefined"){ var element = form.elements["stepForm.scannerRecipe"].value; if (element==""){ alert("Scanner Recipe can not be null"); form.elements["stepForm.scannerRecipe"].focus(); return false; } } if (typeof form.elements["stepForm.trackOutRecipe"]!= "undefined"){ var element = form.elements["stepForm.trackOutRecipe"].value; if (element==""){ alert("Track Recipe can not be null"); form.elements["stepForm.trackOutRecipe"].focus(); return false; } } if (typeof form.elements["stepForm.waferSlotId"]!= "undefined"){ var element = form.elements["stepForm.waferSlotId"].value; if (element==""){ alert("Wafer/Slot Id can not be null"); form.elements["stepForm.waferSlotId"].focus(); return false; } } if (typeof form.elements["stepForm.contaminationFlag"]!= "undefined"){ var element = form.elements["stepForm.contaminationFlag"].value; var eqpName = form.elements["stepForm.eqpModeName"]; if (element=="Please Select"){ alert("Please Select Contamination Flag:"); form.elements["stepForm.contaminationFlag"].focus(); return false; } } if (typeof form.elements["stepForm.remark"]!= "undefined"){ var element = form.elements["stepForm.remark"].value; if(element.length>150) { alert("Remark 最多150个字符"); return false; } if(element.indexOf(">")!=-1 ||element.indexOf("<")!=-1){ alert("Remark can not have special character!"); form.elements["stepForm.remark"].focus(); return false; } if (element==""){ alert("Remark can not be null!"); form.elements["stepForm.remark"].focus(); return false; }else{ removeEnter(form.elements["stepForm.remark"]); } } if (typeof form.elements["stepForm.reticleId"]!= "undefined"){ var element = form.elements["stepForm.reticleId"].value; if (element==""){ alert("ReticleID can not be null!"); form.elements["stepForm.reticleId"].focus(); return false; } } if (typeof form.elements["stepForm.energy"]!= "undefined"){ var element = form.elements["stepForm.energy"].value; if (element==""){ alert("Energy can not be null!"); form.elements["stepForm.energy"].focus(); return false; } } if (typeof form.elements["stepForm.focus"]!= "undefined"){ var element = form.elements["stepForm.focus"].value; if (element==""){ alert("Focus can not be null!"); form.elements["stepForm.focus"].focus(); return false; } } if (typeof form.elements["stepForm.ovlData"]!= "undefined"){ var element = form.elements["stepForm.ovlData"].value; if (element==""){ alert("OVL Data can not be null!"); form.elements["stepForm.ovlData"].focus(); return false; } } if (typeof form.elements["stepForm.fabName"]!= "undefined"){ var element = form.elements["stepForm.fabName"].value; if (element==""){ alert("Please Select the Fab Area!"); form.elements["stepForm.fabName"].focus(); return false; } } if( typeof form.elements["stepForm.energyStep"]!= "undefined") { if(""==$F("stepForm.energyStep")) { alert("Please input the energyStep"); $("stepForm.energyStep").focus(); return false; } } if( typeof form.elements["stepForm.focusStep"]!= "undefined") { if(""==$F("stepForm.focusStep")) { alert("Please input the energyStep"); $("stepForm.focusStep").focus(); return false; } } form.action="addStepForm.action?ercParams=true"; checkboxSync(); disableButton(); form.submit(); } function checkWaferIdIsEqualSlotId(object){ //第二个参数中的 g 表示全部匹配,i表示忽略大小写 var regS = new RegExp("S","gi"); var regS1=new RegExp("#","gi"); var slotIds; var waferIds; var slotId=object.elements["stepForm.slotId"].value; var waferId=object.elements["stepForm.waferId"].value; if(slotId.indexOf("S")!=-1){ slotIds=slotId.replace(regS,""); }else{ slotIds=slotId.replace(regS1,""); } if(waferId.indexOf("S")!=-1){ waferIds=waferId.replace(regS,""); }else{ waferIds=waferId.replace(regS1,""); } var array=slotIds.split(","); for(var i=0;i<array.length;i++){ if(waferIds.indexOf(array[i])==-1) return false; } return true; } function removeEnter(object) { var regS = new RegExp(/\s*(.*?)\s*(\r\n)\s*/mg); var s = object.value; object.value = s.replace(regS, "$1"); //回车前后的空格都替换掉 } function showWaferId(){ var windowOptions = "directories=no,location=no,width=700,height=500,alwaysRaised=yes,resizable=yes,scrollbars=yes"; var win= window.open('showWaferId.action?w&requestFormId=113203','stepFormWaferid','left=500,top=20,width=150,height=450'); win.focus(); } function showSlotId(){ var win=window.open('showSlotId.action?s&requestFormId=113203','stepFormSlotid','left=500,top=20,width=150,height=450'); win.focus(); } function showWaferIdStr(){ var windowOptions = "directories=no,location=no,width=700,height=500,alwaysRaised=yes,resizable=yes,scrollbars=yes"; var win= window.open('showWaferIdStr.action?w&requestFormId=113203','stepFormWaferid','left=500,top=20,width=150,height=450'); win.focus(); } function showSlotIdStr(){ var win=window.open('showSlotIdStr.action?s&requestFormId=113203','stepFormSlotid','left=500,top=20,width=150,height=450'); win.focus(); } function check(object){ var Number ="0123456789"; var holdStepNo="01600"; var repositStepNo="01600"; var stepNo=object.value; for (i = 0; i < stepNo.length;i++){ var c = stepNo.charAt(i); if(Number.indexOf(c)==-1){ alert("StepNo must be number!"); object.value=""; object.focus(); return false; } } /*if(eval(stepNo)>eval(repositStepNo)||eval(stepNo)<eval(holdStepNo) ) { alert("StepNo: "+stepNo+" must be between "+holdStepNo+" and "+repositStepNo); object.value=""; object.focus(); return false; }*/ } function checkRemarkLength(object){ var value=object.value; if(value.length>150){ alert("Remark 最多150个字符"); return false; } var pattern = /[^\x00-\xff]/; if('Normal'=="Scan Defect" && pattern.test(object.value)){ alert("只能输入英文!"); object.focus(); return false; } } function checkEqpID(eqpID){ var form = document.forms['stepForm']; var areaValue=form.elements["stepForm.area"].value; form.elements["stepForm.eqpModeName"].value=""; if(typeof form.elements["stepForm.recipe"]!= "undefined") form.elements["stepForm.recipe"].value=""; if(typeof form.elements["stepForm.trackOutRecipe"]!= "undefined") form.elements["stepForm.trackOutRecipe"].value=""; var eqpId=eqpID.value; var eqpValue=form.elements["stepForm.eqpModeName"].value; var reg=/\s/g; var stringLength=eqpValue.replace(reg,""); if(eqpId=="Eqp ID"){ if(stringLength.length>7) {alert("最多7个字符!请重新输入Eqp ID"); form.elements["stepForm.eqpModeName"].value=""; form.elements["stepForm.eqpModeName"].focus(); return false; } if(eqpValue=="dummy" ||eqpValue=="DUMMY" || eqpValue.indexOf("DMY02")!=-1){ //DMY02 for cension if(areaValue=="PHOTO" || areaValue=="S1A-PHOTO" || areaValue=="S1B-PHOTO" ||areaValue=="S1C-PHOTO" || areaValue=="M1A-PHOTO" || areaValue=="M1B-PHOTO" || areaValue=="M1C-PHOTO" || areaValue=="SXA-PHOTO" || areaValue=="SXC-PHOTO") { alert("Please do not set area as PHOTO for DUMMY Eqp ID!"); form.elements["stepForm.area"].focus(); return false; } if(typeof form.elements["stepForm.recipe"]!= "undefined"){ form.elements["stepForm.recipe"].value="DUMMY"; form.elements["stepForm.recipe"].className="TextBoxReadOnly"; } } }else if(typeof form.elements["stepForm.recipe"]!= "undefined") form.elements["stepForm.recipe"].className="TextBoxReadWrite"; } </script> <div class="app"> <h3 class="center">Add Runcard Step</h3> <form name="stepForm" action="/erc/stepForm/addStepForm.action" method="post" onsubmit="return(stepForm_validate())" > <table class="wwFormTable"> <input type="hidden" name="requestFormId" value="113203" /><input type="hidden" name="stepFormId" /><input type="hidden" name="command" value="normal" /><input type="hidden" name="stepForm.RCP" value="on" /><input type="hidden" name="stepForm.noStepNo" value="uncheck" /><input type="hidden" name="stepForm.stepNoMes" value="01700" /> <input type="hidden" name="stepForm.measurementSpecNo" id="measurementSpecNo" value=""/> <TABLE STYLE="display:none" BORDER=0 CELLSPACING=0 CELLPADDING=0> <select name="strCondition" > </select> </TABLE> <table border="0" cellspacing="1" cellpadding="8" width="100%"> <tr class="b"> <td>*&nbspFab Area:</td> <td> <select name="stepForm.fabName" onchange="changeShow(this)" > <option value=""></option> <option value="A" >A</option> <option value="B" >B</option> <option value="C" >C</option> <option value="FAB7" >FAB7</option> <option value="FAB11" >FAB11</option> <option value="FAB15" >FAB15</option> <option value="FABJ1A" >FABJ1A</option> </select></td> <td>StepNo:</td> <td> NA <input type="checkbox" name="noStepNoPar" value="true" /><input type="text" name="stepForm.stepNo" size="10" value="01700" id="stepNo" onblur="check(this)" /> <input type="button" value="Go" onclick="getStepLotInfo();" > <input type="button" name="getStepList" value="ViewFutureStep" class="btn" onclick="doViewFutureStep('stepNo','getStepLotInfo()');">  <font color="red">(RunCard Step与MES Step做Compare)</font></td> </tr> <tr class="b" id="area" > <td>*&nbspArea:</td> <td colspan="3"> <select name="stepForm.area" onchange="changeByArea(this)" > <option value=""></option> </select>                      Check With RCP<input type="checkbox" name="rcpCheck" value="true" checked="checked" onclick="defalutValue();" /> </td> </tr> <tr id="showRemark" style="display:none;background: #efefef"> <td colspan="4"> <pre><font color="red" face="Arial">Is it Batch run at chamber: ADASM01_N&ADASM01_O or ADASM02_P&ADASM02_G or BDASM91_H&BDASM91_P If it is auto run, please fill in the special Eqp Group : ADVF_RCN_1&ADVF_RCO_1 or ADVF_RCP_1&ADVF_RCG_1 or ADVF_RCH_1&ADVF_RCP_2</font></pre> </td> </tr> <tr class="b"> <td>*&nbspEquipment:</td> <td colspan="3"><select name="stepForm.eqpMode" onchange="checkEqpID(this)" > <option value="Eqp ID" >Eqp ID</option> <option value="Eqp Group" selected="selected">Eqp Group</option> </select>:<input type="text" name="stepForm.eqpModeName" size="25" value="JMD_SRD_C" onblur="eqpToUpper(this)" /><font color="red">   (Eqp Group区分大小写.输入的Eqp ID 的最大长度为7位!)</font></td> </tr> <tr class="b" > <td>*&nbspRecipe:</td> <td colspan="3"><input type="input" name="stepForm.recipe" size="40" value="DI clean"/>   <font color="red">(区分大小写)</font></td> </tr> <tr class="b"> <td>*&nbspWafer ID:</td> <td colspan="3"> <input type="text" readonly="true" name="stepForm.waferId" value="#02,#03,#04,#05,#06,#07,#08,#09,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19,#20,#21,#22,#23,#24,#25" id="wId" size="75" onclick="showWaferId()"/> Qty.:<input type="text" name="stepForm.waferIdQty" value="24" size="10" id="wQty" Style="background: #efefef;border:none"/> </td> </tr> <tr class="b"> <td>MeasSlotId:</td> <td colspan="3"><input type="text" readonly="true" name="stepForm.slotId" value="" id="sId" size="75" onclick="showSlotId();"/> Qty.:<input type="text" name="stepForm.slotIdQty" value="" size="10" id="sQty" Style="background: #efefef;border:none"/></td> </tr> <tr class="b"> <td>*&nbspContamination Flag: </td> <td colspan="3"> <select name="stepForm.contaminationFlag" onchange="checkNA(this)" > <option value="Please Select">Please Select</option> <option value="1--Front end w/o PR" >1--Front end w/o PR</option> <option value="2--Front end w/i PR (photo-resist)" >2--Front end w/i PR (photo-resist)</option> <option value="3--TiSix (eDRAM process)" >3--TiSix (eDRAM process)</option> <option value="4--Metal (W/Ti/TiN/AI-Cu) w/o PR" >4--Metal (W/Ti/TiN/AI-Cu) w/o PR</option> <option value="5--Metal (W/Ti/TiN/AI-Cu) w/i PR (photo-resist)" >5--Metal (W/Ti/TiN/AI-Cu) w/i PR (photo-resist)</option> <option value="6--Cobalt salicide" >6--Cobalt salicide</option> <option value="6.5--Cosix process b/f glue layer dep" >6.5--Cosix process b/f glue layer dep</option> <option value="7--Metal CAP dielectric" >7--Metal CAP dielectric</option> <option value="NA" >NA</option> </select> <b> current lot's contamination level: Please refer to Queen. </b> </td> </tr> <tr class="b"> <td colspan="4"><strong>实际下货Tools:</strong></td> </tr> <tr class="b"> <td>*&nbspRemark:</td> <td colspan="3"><textarea name="stepForm.remark" cols="35" rows="3" value="" onblur="checkRemarkLength(this)" ></textarea><font color="red">(如果输入中文,Runcard只能Manual Run!!)</font></td> </tr> <tr class="b"> <td>EDC Plan Name:</td> <!--onchange="showSpec();" --> <td colspan="3"><input type="text" name="stepForm.ecdPlanName" onchange="clearSpec();" value="" size="20" /><input type="button" onclick="showSpec();" value="Go"></td> </tr> <!-- Modity--> <tr class="b"> <td>量测规格SPEC</td> <td colspan="3"> <textarea name="stepForm.spec" cols="65" rows="2" value="" readonly="readonly" id="spec" style="background: #efefef;border:none" ></textarea> </td> </tr> </table> <h3>Runcard Qtime Inforamtion</h3> <table width="100%"> <tr> <td bgcolor="#87CEFA" colspan=9> <b> Qtime Configuration <font color="#0000FF">End </font> at this Step in Mainflow,pls select the 'Action'. </b> </td> </tr> <tr style="display:none"> <td> <input type="text" name="allEndQtimeHandle" /> </TD> </tr> <tr> <td bgcolor="#E6E6FA" width=15% colspan=2><b>End Qtime info:</b></td> <td bgcolor="#E6E6FA" colspan=7> <TABLE border=0 cellSpacing=1 cellSpacing=1 width="100%"> <TR> <TD >Plan ID </TD> <TD >Plan Ver </TD> <TD >StrStepSeq</TD> <TD ><font color="#0000FF"><B>EndStepSeq</font></TD> <TD >IntervalTime</TD> <TD >ControlType</TD> <TD >ExpireAction</TD> <TD >Action</TD> </TR> <TR> <TD >JLF100UPI0L01</TD> <TD >15</TD> <TD >01600</TD> <TD ><font color="#0000FF"><B>01700</font></TD> <TD >60</TD> <TD >Max Time</TD> <TD >Hold Lot</TD> <TD > <select name="endQtimeHanle113228" onchange="EndQtimeHanle(113228)" > <option value="Mapping" >Mapping</option> <option value="NULL" >NULL</option> </select> </TD> </TR> </Table> </td> </tr> </table> <table width="100%"> <tr class="a"> <tr class="b"><td colspan="4" class="center"><input type="button" onclick="checkPageToSubmit()" value="Submit" class="btn1" />      <input type="Button" class="btn1" value="Close" onclick="window.close();"></td> </tr> </table> </table> <script> function stepForm_validate() { var form = document.forms['stepForm']; var focus = stepForm_validate_actual(); if (focus != null) { element = form.elements[focus]; if(element.length > 0){ element = element[0]; } element.focus(); if (element.type == 'text' || element.type == 'textarea') { element.select(); } return false; } else { disableButton(); return true; } } function stepForm_validate_actual() { var form = document.forms['stepForm']; // cannot find any applicable validators return null; } </script> </form> <h3>Runcard Step Inforamtion</h3> <script> function updateWaferGroupResult(){ var form = document.forms['updateRequestForm']; form.action="updateWaferGroupResult.action"; form.submit(); } </script> <table border="0" cellspacing="1" cellpadding="8" width="100%"> <tr class="a"> <td><strong>Step List:</strong>     <a href="#1"><strong>1</strong></a> </td> </tr> </table> <table border="0" cellspacing="1" cellpadding="8" width="100%"> <tr class="a"> <td>Fab Area:</td> <td> FABJ1A </td> <td>NA<input type="checkbox" disabled="true"> Step No:                    01600</td> <td></td> </tr> <tr class="b"> <a name="1"> <td>Area:</td> <td >YE&FQC</td> <td>Check With RCP<input type="checkbox" disabled="true"></td> <td>Step Serial No:  <strong>1</strong></td> </tr> <tr class="b"> <td>Equipment:</td> <td colspan="3">Eqp Group: JME_MET_ET1</td> </tr> <tr class="b"> <td>Recipe:</td> <td colspan="3">CPBET3KA</td> </tr> <tr class="b"> <td>Wafer ID:</td> <td colspan="2">#02,#03,#04,#05,#06,#07,#08,#09,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19,#20,#21,#22,#23,#24,#25</td><td>Qty.: 24</td> </tr> <tr class="b"> <td>Contamination Flag: </td> <td colspan="3">NA</td> </tr> <tr class="b"> <td colspan="4">实际下货Tools:</td> </tr> <tr class="b"> <td>Remark:</td> <td colspan="3">1</td> </tr> <tr> <td bgcolor="#87CEFF" colspan=9> <b> Qtime Configuration <font color="#0000FF">Start </font> at this Step in Mainflow,need setting after 'add the step': </b> </td> </tr> <tr > <td bgcolor="#DCDCDC" width=15% colspan=2><b>Qtime info:</b></td> <td bgcolor="#DCDCDC" colspan=7> <TABLE border=0 cellSpacing=1 cellSpacing=1 width="100%"> <TR> <TD >Plan ID </TD> <TD >Plan Ver </TD> <TD ><font color="#0000FF"><B><Red>StrStepSeq</font></TD> <TD >EndStepSeq</TD> <TD >IntervalTime</TD> <TD >ControlType</TD> <TD >ExpireAction</TD> <TD >mpsStepSeq</TD> </TR> <TR> <TD >JLF100UPI0L01</TD> <TD >15</TD> <TD ><font color="#0000FF"><B>01600</font></TD> <TD >01700</TD> <TD >60</TD> <TD >Max Time</TD> <TD >Hold Lot</TD> <TD ></TD> </TR> </Table> </td> </tr> </script> <tr class="a"> <td colspan="4" class="center"> <input type="button" value="Update" class="btn1" onclick="window.location.href='viewStepForm.action?requestFormId=113203&stepFormId=113212&command=YE&FQC'" />      <input type="button" class="btn1" value="Delete" onclick="window.location.href='deleteStepForm.action?requestFormId=113203&stepFormId=113212'"/>     <input type="Button" class="btn1" value="Close" onclick="window.close();"> </td> </tr> <tr bgcolor="#FFFFFF"> <td colspan="4"> </td></tr> <tr bgcolor="#FFFFFF"> <td colspan="4"> </td></tr> </table> <table border="0" cellspacing="1" cellpadding="8" width="100%"> <script> function doQTime(groupResult){ var form = document.forms['updateRequestForm']; form.action="comeinQTime.action?method=fromMainPage&groupResultId="+groupResult; form.submit(); } function doMainFlowQTime(groupResult){ var form = document.forms['updateRequestForm']; form.action="comeinMainFlowQTime.action?method=fromMainPage&groupResultId="+groupResult; form.submit(); } </script> <tr class="b"> <th colspan="4">Group Result</th> </tr> <tr class="b"> <td colspan="4"> <table border="0" cellspacing="1" cellpadding="8" width="100%"> <input type="hidden" name="groupResults[0].id" value="113213" /> <tr class=odder> <td><b>Wafer List</b></td> <td colspan=2 align=left><b>Step List</b></td> <td colspan=2><b>QTime(m)</b></td> <td></td> </tr> <tr class=odder> <td>#02,#03,#04,#05,#06,#07,#08,#09,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19,#20,#21,#22,#23,#24,#25</td> <td width=15% colspan=2 align=left>01</td> <td colspan=2> <table border="0" cellspacing="1" cellpadding="8" width="100%"> <tr><TD><B>Type:</B>Max Time <B>Period:</B>60 <B>From:</B>1 <B>To:</B>01700 <B>mpsStepSeq:</B> <B>Action:</B>Hold Lot</TD></tr> </table> </td> <td> </td> </tr> </table> </td> </tr> </table> </div> <script> function doViewFutureStep(callField,functionCall) { var employeeSearchPopup; var windowOptions = "directories=no,location=no,width=700,height=500,alwaysRaised=yes,resizable=yes,scrollbars=yes"; employeeSearchPopup = window.open('../user/popUpFetchStepInfo.action?method=peFetchStepInfo&catalogue=StepSeq&fetchDirection=0&requestFormId=113203', 'employeeSearchPopup', windowOptions); employeeSearchPopup.focus(); callback = function (employeeNo){ document.getElementById(callField).value = employeeNo; employeeSearchPopup.close(); if (functionCall!=null) eval(functionCall); }; } </script>
最新发布
09-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值