3

У меня довольно сложная часть Javascript, которая работает безупречно без ошибок в Google Chrome, Firefox, Safari и Opera. Однако, как всегда, это бесконечно раздражающий случай, он полностью терпит неудачу в Internet Explorer. Я испытал в IE7 и IE8 и получить ту же ошибку:IE8 дает ошибку «Недопустимый аргумент» при использовании prototype.js, как найти, где ошибка?

Invalid argument. prototype.js, line 2216, character 9

Я использую Prototype 1.6.1 размещенного через Google. Указанная ошибка не очень помогает, поскольку она не говорит мне, где в моем фактическом коде происходит ошибка. Линия упоминается в сообщении об ошибке является шестой строкой из нижней части в следующем коде:

setStyle: function(element, styles) { 
    element = $(element); 
    var elementStyle = element.style, match; 
    if (Object.isString(styles)) { 
     element.style.cssText += ';' + styles; 
     return styles.include('opacity') ? 
     element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; 
    } 
    for (var property in styles) 
     if (property == 'opacity') element.setOpacity(styles[property]); 
     else 
     elementStyle[(property == 'float' || property == 'cssFloat') ? 
      (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : 
      property] = styles[property]; 

    return element; 
    }, 

Поскольку в SetStyle блоке коды, я предполагаю, что ошибка возникает, когда я устанавливаю атрибуты стиля для некоторого элемента. Тем не менее, я вызываю setStyle более 100 раз в этом скрипте и пытаюсь выяснить, где именно ошибка происходит в течение нескольких часов. Есть ли что-нибудь, что я могу сделать, чтобы помочь себе найти, где происходит ошибка?

+0

Проблема очень вероятна, что вы пытаетесь установить свойство style для некоторого недопустимого значения. Как побочная заметка, делать свою петлю таким образом ('for ... in') довольно опасно **, особенно **, когда вы используете Prototype. Вы должны включить проверку для 'hasOwnProperty' как минимум. – Pointy

+0

Это не мой код, то есть прототип. –

+0

О, ха-ха-ха! Понимаю. – Pointy

ответ

4

Поместите явный try ... catch вокруг кода:

for (var property in styles) { 
    try { 
    if (property == 'opacity') element.setOpacity(styles[property]); 
    else 
     elementStyle[(property == 'float' || property == 'cssFloat') ? 
     (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : 
      property] = styles[property]; 
    } 
    catch (_) { 
    throw "Error setting property '" + property + "' to value '" + styles[property] + "'"; 
    } 
} 

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

3

В IE8 разрешить инструменту разработчика обходить ошибку [5-я кнопка на вкладке сценария.] Нажмите кнопку Начать отладку.

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

0

Попробуйте отладить с помощью Microsoft® Visual Web Developer® 2010 Express, он бесплатный и очень прост в использовании при отладке в IE.

0

Вы уже отметили свой выбранный ответ, поэтому, вероятно, уже нашли причину. Данная строка относится к установке непрозрачности (которую IE обрабатывает как собственный фильтр), поэтому я предлагаю искать вызовы setStyle, которые устанавливают непрозрачность, возможно, те, которые устанавливают необычное значение.

0

Проблема вызвана setStyle({someProperty: null}). Возможно также undefined или что-то в этом роде.

Чтобы исследовать такие проблемы в будущем, проверьте аргументы, которые вы передаете сторонним функциям в блоке catch. Вид

try{ 
    element.setStyle({someProperty: someValue}) 
}catch(error){ 
    throw('' + someProperty + ':' + someValue) 
} 

Этот код указал бы на источник ошибки в нулевое время. Вот более подробный фрагмент код для отладки этого случая с помощью некоторого Prototype.js' помощников:

;(function() { 
    var superFunction = Element.setStyle 
    Element.addMethods({ 
    setStyle: function (element, _arguments) { 
     try{ 
     superFunction(element, _arguments) 
     }catch(error){ 
     console.log(error, $H(_arguments).inspect()) 
     } 
    } 
    }) 
})() 

P.S. в IE8 вы должны открыть Developer Tools (F12), чтобы работать console.