Ошибка Javascript IE: неожиданный вызов метода или доступа к свойствам
У меня есть следующий код и его работа (как обычно) во всем, кроме IE. Это дает мне неожиданный вызов метода или доступа к свойствам в JQuery, и я не знаю, как его отладить. Я использовал панель инструментов разработчика IE, которая бесполезна для этой ошибки и просто дает мне строку № 12 (внутри jQuery script).
Любая помощь приветствуется:
<script type="text/javascript">
$(document).ready(function () {
$.history.init(pageload);
$('a[href=' + window.location.hash + ']').addClass('selected');
$('a[rel=ajax]').click(function () {
var hash = this.href;
hash = hash.replace(/^.*#/, '');
$.history.load(hash);
$('a[rel=ajax]').removeClass('selected');
$(this).addClass('selected');
$('.loading').show();
getPage();
return false;
});
});
function pageload(hash) {
if (hash) getPage();
}
function getPage() {
hash = document.location.hash;
hash = hash.replace(/^.*#/, '');
var data = 'page=' + encodeURIComponent(hash);
$.ajax({
url: "index.php",
type: "POST",
data: data,
cache: false,
success: function (html) {
$('.loading').hide();
$('tbody').html(html);
}
});
}
</script>
Вот плагин истории: http://plugins.jquery.com/project/history
И вот демо, над которым я слежу:
http://plugins.jquery.com/project/history
По-прежнему меняет window.location обратно на document.location, похоже, не имеет значения
Я потерял на этом. Когда я меняю тег im, вызывающий его, он публикует так, чтобы он работал, но в том, что дизайн все сломан, а следующие ссылки я нажимаю на dont post. Действительно странно!!, отлично работает в FF, опера и т.д.
Ответы
Ответ 1
Я немного удивлен, что IE жалуется на это, но это хорошо, что он делает: вам не хватает декларации в getPage
для hash
(например, поместите var
перед первым использованием).
На других он предположительно создает неявный глобальный (свойство объекта window
, называемое hash
), что, конечно, Bad Thing (tm), но, как я понимаю, он правильный в соответствии со спецификацией (соответствующие разделы составляют 8,7 ["Ссылка
Type "] и 10.1.4 [" Scope Chain and Identifier Resolution "]).
Однако удивление IE жалуется на это. Это должно быть связано с областью, в которой jQuery вызывает ваш обработчик кликов.
Ответ 2
ЕСЛИ вы получите эту ошибку при использовании элементов HTML5 в IE, убедитесь, что вы используете html5shim, чтобы сообщить IE, что это реальные элементы.
Ответ 3
Это будет:
$('tbody').html(html);
IE выдает ошибку при попытке помещать определенные вещи внутри некоторых узлов. Например,
$('<input>').append('</p>')
Чтобы исправить это, добавьте html
к другому элементу. Например, вы можете попробовать:
$('table').html('<tbody>' + html + '</tbody>');
Ответ 4
Я не могу найти метод истории в jQuery API, поэтому могу предположить:
- Плагин для сторонних разработчиков.
- Непосредственный вызов старого старого window.history объекта.
- Пользовательский объект, который вы создали.
Я предполагаю, что IE (известный тем, что загрязняет глобальную область, делая все глобальное) считает, что любая ссылка на история на самом деле означает window.history, и она запутывается. Если это настраиваемый объект, попробуйте переименовать его в myHistory или что-то еще.
Ответ 5
Я думаю, что мистер Кроудер что-то наделал. Насколько я могу судить по источнику jQuery, если ваш возвращенный фрагмент HTML не содержит тегов <script>
и не имеет пары других не слишком вероятных характеристик, то jQuery, вероятно, пытается его набить в ваш элемент <tbody>
, используя свойство "innerHTML". IE не нравится.
Что вам нужно сделать, это обернуть целое <table>
в манекене <div>
, а затем перестроить всю вещь из вашего фрагмента HTML.
Ответ 6
У меня была эта проблема в веб-приложении, которое использовало элементы HTML5. Когда я включил Modernizr script в страницы, проблема была решена.
Ответ 7
У меня была та же проблема. Первоначально был выбран список, который был добавлен к нему. По пути выбор был изменен на поле ввода. Попытка добавить тег опции в поле ввода, похоже, делает IE недовольным.
Ответ 8
У меня была такая же проблема прямо сейчас. Мне кажется, что это происходит для невидимых элементов. Проверьте, отображается ли ваш элемент в момент вызова .html()
на нем.
Ответ 9
Вы устанавливаете какие-либо поля ввода?
У меня была такая же проблема, зациклившись на массив значений, но я изменил текстовое поле на вход. Chrome просто игнорирует его, но IE 8 взрывается.
$("#someID").html("someValue")
= стрела! на IE 8, если someID является входом
Уже был вызов val, но ему нужно было удалить html.
$("#someID").val("someValue")
= good