2

У меня есть проблема, только на старых исследователей IE с этим JS код:IE7 - проблема с JavaScript

var elements = [ 
     {'name':'manuscript_file', 'filetype':/(\.|\/)(doc|docx|txt|odt|zip|rar|rtf|gz|tar|bz2|bz|7z|tex)$/i}, 
     {'name':'presentation_file', 'filetype':/(\.|\/)(pdf)$/i}, 
     {'name':'figures_file', 'filetype':/(\.|\/)(pdf|png|jpg|gif|zip|rtf|eps)$/i}, 
     {'name':'graphical_file', 'filetype':/(\.|\/)(pdf|png|jpg|gif)$/i}, 
     {'name':'supplementary_file', 'filetype':/(\.|\/)(zip)$/i}, 
     {'name':'non_published_material', 'filetype':/(\.|\/)(doc|docx|zip|pdf)$/i}, 
    ] 
    , url = $('form').attr('action'); 



$.each(elements, function(i, element) { 
    $('#form_' + element.name).val(''); 
    $('#form_' + element.name).prev('button').removeAttr('disabled') 
    ... 

На линии с

$('#form_' + element.name).val(''); 

IE7 говорит мне

Message: 'name' is null or not an object 

Любая идея? Спасибо.

+0

Что произойдет, если вы используете element.getAttribute ('имя') '' вместо 'element.name'? –

+0

Я не знаю почему, но в моем случае, в первой итерации, переменная 'element' является самим массивом' elements'. Просто добавьте 'if (element)', чтобы избавиться от ошибки. – DontVoteMeDown

+0

Какую версию jQuery вы используете? И да, что @PaulS. сказал или, как альтернативный $ (элемент) .attr ('name') используется? –

ответ

4

Проблема здесь в вашей конечной запятой в массиве элементов. Internet Explorer 7 неправильно интерпретирует значение справа от последней запятой. Это делает длины п + 1, тем самым вызывая Jquery оценить нулевое значение на последнем цикле:

var elements = [ 
    { 'name': 'manuscript_file' }, 
    { 'name': 'non_published_material' }, <-- 
] 

Вы можете увидеть это подтверждается цикл над двумя массивами; один с задней запятой и один без. Откройте http://jsfiddle.net/jonathansampson/mqntjbky/show/ в IE 7 для подтверждения.

(function() { 

    var elements = [ 
     { name: "Foo" }, 
     { name: "Bar" } 
    ]; 

    var alternatives = [ 
     { name: "Fizz" }, 
     { name: "Buzz" }, 
    ]; 

    // This $.each will not throw an exception 
    $.each(elements, function create (i, element) { 
     try { 
      $("<div></div>").text(element.name).appendTo("body"); 
     } catch (e) { alert("Top fail: " + e.message) } 
    }); 

    // This $.each WILL throw an exception 
    $.each(alternatives, function create (i, element) { 
     try { 
      $("<div></div>").text(element.name).appendTo("body"); 
     } catch (e) { alert("Bottom fail: " + e.message) } 
    }); 

}()); 

примечание ниже, что «Вверх провал» сообщение никогда не поднимается, как это происходит в блоке цикла сбора, который испытывает недостаток в Запятая. Однако сообщение «нижний отказ» находится в поврежденном блоке и, таким образом, создается во время итерации.

enter image description here

+0

У меня нет IE 7 под рукой. Что он показывает? 'element' является' undefined' в последнем вызове? – Bergi

+0

Отличный ответ, и он работает как шарм. Большое спасибо. –