Проблемы с JavaScript - PullRequest
       31

Проблемы с JavaScript

3 голосов
/ 05 марта 2011

Прежде всего, позвольте мне предсказать этот вопрос, сказав, что мой профессор твердо укоренился в прошлом.Наше последнее задание потребовало, чтобы мы поместили ссылки поверх картинок.

Вы также можете сказать, что он безумен, поскольку для тестирования наших страниц он требует, чтобы все функции (включая файлы cookie) были реализованы с помощью "технологии на стороне клиента".т.е. не на сервере.Он использует Firefox для тестирования страниц, поэтому единственное благословение в том, что он не заботится о совместимости между браузерами.

При этом у меня проблема с нашим последним заданием.Мы создаем систему «корзины покупок» с использованием Javascript и файлов cookie для хранения покупаемых товаров.Это нормально, за исключением того, что по какой-то причине в моей функции, которая добавляет новый элемент cookie, назначение чего-то для document.cookie не работает.

Вы можете найти весь мой сайт здесь .zip file download (если есть что-то, что вас интересует, «с какой стати вы это делаете? Это безумие!» - это либо прямое задание, либо способ попытаться свести к минимумуболь.)

Это мой код, который должен изменить cookie:

var mycookies = new function (){
    var cookies = document.cookie.split(';');
    var cookie, values;
    this.items = [];
    for(var x = 0; x < cookies.length; x++){
        if(cookies[x] != ""){
            cookie = cookies[x].split('=')[0].trim()
            values = cookies[x].split('=')[1]
            values = values.split(',');
            if(!this.items[cookie]){
                this.items.push(cookie);
                this[cookie] = new function(){};
            }
            this[cookie].size = values[0];
            this[cookie].qty = parseInt(values[1]);
        }
    }
    this.render = function(){
        var values, cookies = "", cookie;
        for(var x = 0; x < this.items.length; x++){
            cookie = this.items[x];
            values = [this[cookie].size, this[cookie].qty].join(',');
            cookies += cookie + "=" + values + '; ';
        }
        return cookies;    
    }                      
    this.clear = function(){
        for(var x = 0; x < this.items.length; x++){
            delete this[this.items[x]];
        }                  
        this.items = [];
        document.cookie['expires'] = '26 Aug 1984 01:01:01 UTC;';
    }                      
    this.additem = function(){
        var i = document.forms[0].size.selectedIndex;
        if (this.items[page]){
            this[page].size = document.getElementById('size').value;
            this[page].qty = document.getElementById('qty').value;
        }                  
        else{              
            this.items.push(page);
            this[page] = new function(){};
            this[page].size = document.getElementById('size').value;
            this[page].qty = document.getElementById('qty').value;
        }
        console.log(this.render()); // For use with firebug
        document.cookie = this.render();
        console.log(document.cookie); // For use with firebug
    }
}

Когда я запускаю это, firebug выдает следующее:

expires=12 Aug 2001 01:01:01 UTC,NaN; whitec=Small,3;
expires=12 Aug 2001 01:01:01 UTC,NaN

Теперь я ожидаю, что 1) срок действия моего cookie истек (я установил срок действия через firebug, мой разбор добавил NaN позже, - но там он остался), и 2) значение для файла cookie будет изменено нарезультат this.render()

Помимо очевидного факта, что поведение cookie на стороне клиента не гарантируется спецификацией w3, я что-то здесь упускаю?( РЕДАКТИРОВАТЬ - я имею в виду, когда страница находится на стороне клиента, открывается как файл, а не обслуживается сервером) Это действительно отягчает - я пробовал множество разных углов, и нет "javascript cookie «поиск или« изменение cookie javascript »приводит меня ко всему полезному.Любые предложения о том, как я могу это исправить?

Или я должен просто написать своему профессору ссылку на спецификации w3 и сказать ему, что требовать от нас поддержки файлов cookie на стороне клиента глупо?

Ответы [ 3 ]

3 голосов
/ 05 марта 2011

Работа document.cookie - это не то, о чем вы, по-видимому, думаете.Когда вы устанавливаете значение в переменную, вы устанавливаете один файл cookie за раз .Таким образом, если вы хотите установить все куки-файлы, которые вы храните в своем объекте, вы бы перебрали свой массив «items» и последовательно установили document.cookie для каждой пары имя / значение (преобразованной в строку «cookieName = cookieValue»).).

Это факт во всех современных браузерах.См., Например, эту страницу документации Mozilla .

Другие комментарии к коду, поскольку вы были достаточно хороши, чтобы опубликовать его:

        cookie = cookies[x].split('=')[0].trim()
        values = cookies[x].split('=')[1]

Лучше назвать "split"только один раз.

            this[cookie] = new function(){};

Это по сути эквивалентно this[cookie] = {}; для установки свойства для нового пустого объекта.

0 голосов
/ 05 марта 2011

Ваш класс программирования звучит немного странно.

Но по моему опыту, манипулирование куки на стороне клиента действительно хорошо поддерживается в браузерах.

В Quirksmode есть отличная статья о файлах cookie с некоторыми примерами вспомогательных функций для установки и чтения файлов cookie: http://www.quirksmode.org/js/cookies.html

0 голосов
/ 05 марта 2011

Похоже, что-то может быть плохо с датами?Попробуйте установить время истечения в далеком будущем при настройке cookie.

...