2008-10-15 2 views
1

У меня есть эта функция в моем Javascript Code, который обновляет поля html с их новыми значениями всякий раз, когда он вызывается. Проблема не может быть связана с самой функцией, потому что она блестяще работает в каждом разделе, кроме одного. Вот функция JS:Непоследовательные результаты функции JavaScript

function updateFields() { 
    document.getElementById('bf').innerHTML = bill.time[breakfast][bill.pointPartOfWeek]; 
    document.getElementById('ln').innerHTML = bill.time[lunch][bill.pointPartOfWeek]; 
    document.getElementById('dn').innerHTML = bill.time[dinner][bill.pointPartOfWeek]; 
    document.getElementById('se').innerHTML = bill.time[special][bill.pointPartOfWeek]; 
    document.getElementById('fdr').innerHTML = bill.time[full][bill.pointPartOfWeek]; 
    document.getElementById('cost').innerHTML = bill.cost; 
    } 

И он выполняет штраф в следующем случае:

<select onchange='if(this.selectedIndex == 0) {bill.unholiday();updateFields()} else { bill.holiday();updateFields()}' id='date' name='date'> 
    <option value='else'>Jan. 02 - Nov. 20</option> 
    <option value='christmas'>Nov. 20 - Jan. 01</option> 
    </select> 

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

<select onchange='if(this.selectedIndex == 0) {bill.pointPartOfWeek = 1;} else { bill.pointPartOfWeek = 2;}updateFields();alert(updateFields());' id='day' name='day'> 
    <option value='0'>Monday thru Thursday</option> 
    <option value='1'>Friday, Saturday, or Sunday</option> 
    </select> 
    <br /> 

как ни странно, сам общая переменная стоимость обновляются, но поле, которое представляет собой переменный не является. Если вы используете другой раздел страницы, который не изменит значение общей стоимости, но снова вызовет функцию updateFields, поле затрат затем будет корректно обновляться. Это должна быть проблема с вызванной функцией.

Примечание: мы знаем, что функция выполняется потому, что она делает 5 из 6 вещей, которые она должна выполнять. Это странная проблема.

Редактировать: Пастерины для всей страницы будут полезны. Вот оно:

http://pastebin.com/f70d584d3

ответ

1

мне очень интересно, возможно ли, что есть на самом деле 2 элемента с идентификатором «стоимость»? Это могло бы, обновив первое, которое оно обнаружит, вызывает эту проблему. У разных браузеров могут быть разные способы реализации document.getElementById(), поэтому вы можете получить еще более противоречивые результаты с разными браузерами, если это так.

ОБНОВЛЕНИЕ: Оказывается, вам нужно вызвать bill.holiday() или bill.unholiday() перед вызовом updateFields() во втором выборе.

+0

Я думал то же самое и искал документ для дублирования записей. Насколько я могу судить, существует только один элемент с идентификатором «стоимость». Однако есть элемент с атрибутом name «cost». Я попытался изменить это на «цену». Тем не менее проблема осталась. – objectivesea 2008-10-15 21:45:17

+0

Интересно, на самом деле я думаю, что в IE был какой-то странный бит, где document.getElementById() получает элементы, соответствующие атрибуту name. Я посмотрю, что я могу сделать с вашей ссылкой. – 2008-10-15 21:49:26

1

Мой опыт работы с getElementById был в лучшем случае смешанным, и это, скорее всего, ваша проблема. Вероятно, какая-то ошибка браузера DOM, в которой у вас есть два элемента с одинаковым идентификатором или что-то в этом роде.

Я использую Prototype, который позволяет избежать двусмысленности и привередливым браузеров с помощью простого вызова:

document.getElementById('bf') 

становится

$('bf') 

И точно так же вы можете обновить innerHTML элемента легко:

$('bf').update(bill.time[breakfast][bill.pointPartOfWeek]); 

Проверьте это. Это спасло мой бекон более чем пару раз.

0

Проблема заключается в том, что свойство cost на бильярдном объекте не обновлялось при вызове updateFields(). Вам нужно вызвать bill.calculate(), который обновляет свойство стоимости.

0

Теперь я понимаю, почему решение Эрика работало ... что привело меня к лучшему решению.

Его сообщение было удалено по какой-то причине, но я прокомментировал его другое сообщение, перефразируя его ответ.

Anyways, Он сказал, чтобы назвать holiday() или unholiday(). Когда вы смотрите на тех функций, которые вы увидите на последней строке кода:

this.setRoom(this.pointPartOfDay,this.pointPartOfWeek); 

Тогда все начинает иметь смысл. Раньше я просто устанавливал значение pointPartOfWeek на его новое значение и двигался дальше. но pointPartOfDay - это просто адрес массива. Я никогда не обновлял стоимость комнаты. Это также объясняет, почему стоимость в конечном итоге исправляет себя. Пока pointPartOfWeek не изменяется, вызовы setRoom будут по-прежнему фиксировать сумму (даже в другом случае).

Веселье отладки ...

Смежные вопросы