Одной из замечательных особенностей модулей является то, что в них объявления верхнего уровня и т. Д. не создают глобальные переменные. Одна из плохих особенностей обработчиков событий в стиле onxyz
заключается в том, что функции, которые вы вызываете с ними, должны быть глобальными. Ваш sayHi
не является глобальным, поэтому onload="sayHi('Manish')"
терпит неудачу, потому что у него нет доступа к sayHi
.
Что хорошо.
Вместо этого просто вызовите функцию из main.js
:
import { sayHi } from './say.js';
sayHi('MK');
sayHi('Manish');
Поскольку скрипты модуля автоматически откладываются до конца обработки HTML, вы знаете, что этого не произойдет, пока весь HTML не будет загружен. Это покрыто отличной графикой в этом разделе спецификации , дублированной здесь:
Если вы хотите подождать дольше, до события load
(которое не запускается до тех пор, пока не будут загружены все изображения и тому подобное), используйте для этого современный обработчик событий:
import { sayHi } from './say.js';
sayHi('MK');
window.addEventListener("load", () => {
sayHi('Manish');
});
Если вам нужна информация от элемента, к которому вы подключили событие, используйте традиционную функцию и получите доступ к элементу как this
, или примите параметр event
и используйте event.currentTarget
(вы также можете использовать event.target
для элемент, на который нацелено событие, которое может находиться внутри элемента, к которому вы подключили событие). Например, предположим, у вас есть:
<button type="button" data-name="Manish" id="btn-say-hi">
вы могли бы иметь:
import { sayHi } from './say.js';
document.getElementById("btn-say-hi").addEventListener("click", function() {
sayHi(this.getAttribute("data-name"));
});
Также обратите внимание, что, как указал Викас Сайни, ваш say.js
использует строковый литерал вместо литерала шаблона (и хотя он или она не упомянул об этом, у него также неправильный синтаксис для подстановки), поэтому вы ' Вы увидите текст Hello { $user }
вместо Hello MK
или Hello Manish
. Либо используйте шаблонный литерал с правильной формой подстановки (${user}
, а не { $user }
):
export function sayHi(user) {
alert(`Hello, ${user}`);
}
или простая конкатенация строк:
export function sayHi(user) {
alert("Hello, " + user);
}