Javascript: автозаполнение имени функции

#javascript #function #autocomplete

#javascript #функция #автозаполнение

Вопрос:

После нескольких обновлений FireFox и Chrome, похоже, у меня есть функция, которая больше не работает (в JavaScript). Имя функции — автозаполнение, например:

 function autocomplete() {
    alert("autocomplete!");
}
 

По-видимому, браузерам больше не нравится это имя функции, поскольку вызов функции игнорируется. Я попытался переписать это следующим образом:

 var autocomplete = function() {
    alert("autocomplete!");
};
 

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

Редактировать: использование продемонстрировано в следующей скрипке: http://jsfiddle.net/P43xs / Я пытаюсь запустить функцию по событию.

Комментарии:

1. jsfiddle.net/UwG4e — мой хром с тобой не согласен.

2. Это работает даже в IE…

3. Невозможно воспроизвести проблему. Есть ли ошибка в консоли JavaScript? Что-то еще не так с кодом? Когда вы его отлаживаете, где / как происходит сбой? В имени вашей функции нет ничего плохого, должно быть, что-то еще не так.

4. @putvande: что бы это изменило? jsfiddle.net/UwG4e/1

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

Ответ №1:

РЕШЕНИЕ:

 onclick="autocomplete();"  // --> does not work

onclick="window.autocomplete();" // --> works
 

Итак, при вызове функции автозаполнения просто переместите ее в window, а затем она работает и показывает предупреждение (попробовано в вашей скрипке)

Причина:

Входные элементы имеют атрибут с именем «автозаполнение», поэтому, когда вы упоминаете onclick="autocomplete();" , внутренне он вычисляется autocomplete===this.autocomplete и, следовательно, ничего не делает. (‘this’ в текущем контексте является элементом ввода).

Итак, когда вы ограничиваете его window.autocomplete() , он указывает на функцию автозаполнения, которую вы определили.

Комментарии:

1. Моя функция отображается в консоли, хотя она не выполняется через событие.

Ответ №2:

Я могу воспроизвести это в Chrome 35.

Я создал вторую скрипку с обходным путем: http://jsfiddle.net/5m7UD/1 /

 <input type="button" onclick="autocomplete();" value="Click me!" />
<input type="button" onclick="whatever();" value="Me too please!" />
<input type="button" id="id1" value="Second attempt" />
 

с помощью этого скрипта:

 console.log(autocomplete)

function autocomplete() {
    alert("This doesn't work, only in IE compatible mode or other, lder browsers :(");
}

function whatever() {
    alert("This works, obviously...");
    eval("console.log(autocomplete.toString())");
}

document.getElementById('id1').onclick = autocomplete;
 

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

(Я использую eval , чтобы убедиться, что код не может просто сохранить ссылку на исходную функцию).

Когда я запускаю код и нажимаю кнопку, я вижу эту ошибку в консоли: Uncaught TypeError: string is not a function в строке, где определена кнопка (т. Е. Для onclick="autocomplete();" ), Поэтому ей действительно не нравится HTML.

Комментарии:

1. Это может быть связано с тем, что браузер пытается связать его с атрибутом автозаполнения для поля ввода. Я попытался использовать window.autocomplete(); и тогда все работает нормально. (Странно !!)

2. Да, window.autocomplete() или настройка события onclick с помощью JavaScript делает свое дело, хотя его нужно менять везде (разные страницы используют один и тот же файл JavaScript). Я думаю, что лучшее решение — накрутить себя и везде менять имя функции. Спасибо всем, что помогли мне. Надеюсь, мы помогли другим тоже сейчас и в будущем.

3. @LaVomit: Подумайте о том, чтобы задать вопрос в группе поддержки Chrome по адресу productforums.google.com/forum /#!категории/chrome