Проблема заключается в цепочке областей действия функций, скомпилированных из значений атрибутов элемента HTML, объявленных в исходном коде HTML. Атрибуты формы on_eventName=functionBodyCode
демонстрируют такое поведение.
По историческим причинам (DOM не существовал в его нынешнем виде, document.getElementByID
еще предстояло изобрести...) такие функции компилируются с цепочкой областей видимости, включающей объект, для которого предоставляется атрибут обработчика событий, любой form
элемент, которым является элемент внутри и объект document
. Однако разные браузеры использовали разные подходы к эмуляции поведения Netscape. Некоторые браузеры включали любой и каждый родительский объект элемента, предоставляющий атрибут обработчика событий, в то время как другие опускали некоторые соответствующие объекты, такие как document
.
Технические подробности можно найти в Javascript в полном руководстве O'Reilly, раздел 19.1.6. Область действия обработчиков событий.
Основная рекомендация — избегать предоставления обработчиков событий в HTML — вместо этого добавьте их в JavaScript, используя addEventListener
. Если по какой-либо причине вызовы функций должны быть закодированы в значениях атрибутов HTML, избегайте использования имен функций, которые являются методами объектов DOM.
Обратите внимание, что настраиваемая цепочка областей действия для обработчиков событий применяется только к функциям, созданным из атрибутов HTML. Он не применяется к функциям, созданным в JavaScript и добавленным к элементу с помощью addEventListener
или element.onEventName=aFunctionObject
.
Следующий фрагмент демонстрирует поиск имен свойств внешних элементов в цепочке областей видимости обработчиков событий, определенных в HTML:
<form name="formName1" action="">
<p> Try to access the elements collection of the form:
<button type="button"
onclick="console.log( elements);">elements
</button>
</p>
</form>
<form name="formName2" action="" onsubmit="return false">
<p> Try to access form name as form.name:
<button type="button"
onclick="console.log( 'form.name: %s', form.name);">form.name
</button>
</p>
</form>
<form name="formName3" action="" onsubmit="return false">
<p>Access document.write as "write"
<button type="button"
onclick="console.log( 'write: %s', write);">write
</button>
</p>
</form>
В первой форме elements
является свойством окружающего элемента формы.
Во второй форме form
является свойством HTMLButtonElement.
В третьей форме write
является методом document
.
Ссылаясь на 2020 год, HTML5 определяет цепочку областей действия для обработчиков атрибутов HTML как элемент › внешний элемент формы › документ в разделе Scope в элементе нумерованного списка 3.9 внутренний необработанный нескомпилированный обработчик.
person
traktor
schedule
01.10.2018
element
— это объектElement
, относящийся к элементу, для которого запускается функция. Изучение элемента div путем вызоваgetElementById
показывает, что у него есть функция scrollIntoView(), как и у любого другого элемента, и, поскольку областью действия событияonmousedown
является сам элемент, он предпочитает эту функцию созданной вами глобальной функции. Возможным решением было бы то, что Juniorized предложил ниже. - person Miki Mints   schedule 02.10.2018