使用Javascript编写cookies(和cream)代码

使用Javascript编写cookies(和cream)代码,javascript,cookies,Javascript,Cookies,我正在做一项作业,我必须使用表单中输入的值编写cookie,但我不知道如何从下拉菜单中获取所选值以保存为cookie Javascript /* this function attachs the event handler under both event models */ function addEvent(object, evName, fnName, cap) { if (object.attachEvent) object.at

我正在做一项作业,我必须使用表单中输入的值编写cookie,但我不知道如何从下拉菜单中获取所选值以保存为cookie

Javascript

    /* this function attachs the event handler under both event models */
    function addEvent(object, evName, fnName, cap) {
        if (object.attachEvent)
            object.attachEvent("on" + evName, fnName);
        else if (object.addEventListener)
            object.addEventListener(evName, fnName, cap);
    }



    function writeCookie(cName, cValue, expDate, cPath, cDomain, cSecure) {
      if (cName && cValue != "") {
         var cString = cName + "=" + escape(cValue);
         if (expDate) 
            cString += ";expires=" + expDate.toGMTString();

         if (cPath) cString += ";path=" + cPath;
         if (cDomain) cString += ";domain=" + cDomain;
         if (cSecure) cString += ";secure";


         document.cookie = cString;
      }
    }

    function saveMailingInfo() {
      var expire = new Date();
      expire.setFullYear(expire.getFullYear() + 1);
      var allFields = document.mailingForm.elements;
      for (var i  = 0; i < allFields.length; i++) {
        if (allFields[i].type == "text") {
          writeCookie(allFields[i].id, allFields[i].value, expire);
        }
        if (allFields[i].nodename == "SELECT") {
          writeCookie(allFields[i].id, allFields[i].selectedIndex, expire);
        }
        if (allFields [i].type == "radio" || allFields[i].type == "checkbox") {
      writeCookie(allFields[i].id, allFields[i].checked, expire);
    }
      }
      alert("Registration data saved");
    }

    addEvent(window, "load", initPage, false);

    function initPage(){
      document.getElementById("sbutton").onclick = saveMailingInfo;
      document.getElementById("favoriteCake").selectedIndex = retrieveCookie("favoriteCake");
    }
/*此函数将事件处理程序附加到两个事件模型下*/
函数addEvent(对象、evName、FName、cap){
if(object.attachEvent)
object.attachEvent(“on”+evName,fnName);
else if(object.addEventListener)
object.addEventListener(evName、fnName、cap);
}
函数writeCookie(cName、CVValue、expDate、cPath、cDomain、cSecure){
如果(cName&&C值!=“”){
var cString=cName+“=”+escape(cValue);
如果(截止日期)
cString+=“expires=“+expDate.togmString();
如果(cPath)cString+=“path=“+cPath;
如果(cDomain)cString+=“domain=“+cDomain;
if(cSecure)cString+=“安全”;
document.cookie=cString;
}
}
函数saveMailingInfo(){
var expire=新日期();
expire.setFullYear(expire.getFullYear()+1);
var allFields=document.mailingForm.elements;
对于(变量i=0;i
HTML


艾米丽的蛋糕

输入您的信息,并将其添加到我们的电子邮件列表中,提醒您获得该生日 你想要的蛋糕!记得在艾米丽的蛋糕上,我们的目标是让每个生日都是最好的

第一:
最后:
电邮:
生日(月/日/年):
最喜欢的蛋糕: 奶油 巧克力 香草 红色的天鹅绒
电子邮件的频率: 每月给我发电子邮件
每季度给我发一次电子邮件
在我生日快到的时候给我发电子邮件

要在HTML
选择中获取所选项目的值,请使用:

var cake = document.getElementById("favoriteCake");
var cakeValue = cake.options[cake.selectedIndex].value;
我也情不自禁地注意到,当分支只包含一条语句时,大多数
if
语句都利用了可选的大括号:

    if (object.attachEvent)
        object.attachEvent("on" + evName, fnName);
    else if (object.addEventListener)
        object.addEventListener(evName, fnName, cap);
下面是一个很好的例子,说明了为什么不应该这样做:

    if (cPath) cString += ";path=" + cPath;
这使得它看起来像是如果
cPath
true
,那么将执行同一行上的代码,但
path=“+cPath
将始终被执行,因为当您省略大括号时,您告诉JavaScript运行时,当代码进入该分支时,只应执行测试后的第一条语句或
else

这是一种非常糟糕的做法,最终会导致程序出现错误。始终用大括号括住分支代码:

    if (object.attachEvent){
        object.attachEvent("on" + evName, fnName);
    } else if (object.addEventListener) {
        object.addEventListener(evName, fnName, cap);
    }
以及:

最后,使用跨浏览器事件连接功能:

/* this function attachs the event handler under both event models */
function addEvent(object, evName, fnName, cap) {
    if (object.attachEvent)
        object.attachEvent("on" + evName, fnName);
    else if (object.addEventListener)
        object.addEventListener(evName, fnName, cap);
}
您不仅应该包括花括号,还可以通过切换测试顺序来提高性能。由于
attachEvent
仅适用于IE8及以下版本,因此很少有情况下您的测试是正确的,但您每次都会进行测试。如果您切换序列,您将很少需要运行else代码,而现在,您大部分时间都需要运行测试代码和else代码。最后,您只需要一个
else
,而不需要
else if
,因为如果其中一个事件模型不受支持,那么另一个是-您不需要测试它

function addEvent(object, evName, fnName, cap) {
    if (object.addEventListener){
        object.addEventListener(evName, fnName, cap);
    } else {
        object.attachEvent("on" + evName, fnName);
    }          
}
可以使用“选定索引值”属性获取选定项

将其存储在cookie中的一种方法是:

/* this function attachs the event handler under both event models */
function addEvent(object, evName, fnName, cap) {
    if (object.attachEvent)
        object.attachEvent("on" + evName, fnName);
    else if (object.addEventListener)
        object.addEventListener(evName, fnName, cap);
}
function addEvent(object, evName, fnName, cap) {
    if (object.addEventListener){
        object.addEventListener(evName, fnName, cap);
    } else {
        object.attachEvent("on" + evName, fnName);
    }          
}
var cake = document.getElementById("favoriteCake");
var selectedCake = cake.options[cake.selectedIndex].value;
document.cookie = "selected_cake="+selectedCake;