在 angular 组件中调用外部 JS 文件事件触发的函数
Calling function triggered by event from an external JS file in angular component
我正在尝试将由 JS HTML、CSS 设计的网页转换为 angular 项目。我已将 JS 文件包含在 index.html 中,如下所示
index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Sample</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body class="">
<app-root></app-root>
<script type="text/javascript" src="assets/scripts/sample.js"></script>
</body>
</html>
sample.js
if (document.getElementById("fixedHeader")) {
window.onscroll = function () { fixedHeader(); };
var header = document.getElementById("fixedHeader");
var fixed = header.offsetTop;
}
function fixedHeader() {
if (window.pageYOffset > fixed) {
header.classList.add("fixed-active-lob");
$('body').addClass("fixed-nav");
} else {
header.classList.remove("fixed-active-lob");
$('body').removeClass("fixed-nav");
}
}
current.component.html
<div class="gb-nav gn">
<div id="fixedHeader" class="header">....
</div>
</div>
sample.css 包含在 styles.css 中的文件具有
.gb-nav.gn .fixed-active-lob {
position: fixed;
top: 0;
width: 100%;
z-index: 999999;
-webkit-box-shadow: 0px 10px 15px -1px rgba(0,0,0,0.45);
-moz-box-shadow: 0px 10px 15px -1px rgba(0,0,0,0.45);
box-shadow: 0px 10px 15px -1px rgba(0,0,0,0.45);
}
body.fixed-nav{
padding-top:56px
}
我无法从 angular 组件中的 sample.js 触发功能。但是,我能够通过在
中再次定义相同的函数来获得所需的结果
current.component.ts 如:
@HostListener('window:scroll', ['$event'])
scrollHandler(event: any) {
console.log("Scroll event", event);
this.fixedHeader();
}
fixedHeader() {
var header = document.getElementById("fixedHeader");
var fixed: number = 0;
if (header?.offsetTop != undefined) {
fixed = header?.offsetTop;
} else {
fixed = 0;
}
if (window.pageYOffset > fixed) {
header?.classList.add("fixed-active-lob");
$('body').addClass("fixed-nav");
} else {
header?.classList.remove("fixed-active-lob");
$('body').removeClass("fixed-nav");
}
}
但是我想使用JS文件中的函数而不是在ts文件中重做,请帮忙。
首先,修改 sample.js
使其像这样导出 fixedHeader
if (document.getElementById("fixedHeader")) {
window.onscroll = function () { fixedHeader(); };
var header = document.getElementById("fixedHeader");
var fixed = header.offsetTop;
}
export function fixedHeader() {
if (window.pageYOffset > fixed) {
header.classList.add("fixed-active-lob");
$('body').addClass("fixed-nav");
} else {
header.classList.remove("fixed-active-lob");
$('body').removeClass("fixed-nav");
}
}
通过这次调整,我们将 sample.js
变成了一个模块,具有一个名为 fixedHeader
的导出,因此启用了其他模块,例如我们的 current.component.ts
,以通过在 JavaScript: Modules.
中共享代码的标准、显式和规范方法使用它
接下来,在项目的 tsconfig.json
中设置 "allowJs": true
以通知 TypeScript 我们的项目包含 TypeScript 和 JavaScript 源文件的混合。
最后,将我们从sample.js
导出的fixedHeader
函数直接导入current.component.ts
,从Angular组件[=37=中删除现在多余的方法], 调用导入函数如下
import {Component, HostListener} from '@angular/core';
import {fixedHeader} from '../assets/scripts/sample.js';
@Component({
// Angular boilerplate and ceremony
})
export class CurrentComponent { // or whatever it is actually called
@HostListener('window:scroll', ['$event'])
scrollHandler(event: Event) {
console.log("Scroll event", event);
fixedHeader();
}
}
最后,从index.html
.
中删除原来加载sample.js
的脚本标签
注意:根据文件相对于彼此的实际位置,根据需要调整上述导入路径。
我正在尝试将由 JS HTML、CSS 设计的网页转换为 angular 项目。我已将 JS 文件包含在 index.html 中,如下所示
index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Sample</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body class="">
<app-root></app-root>
<script type="text/javascript" src="assets/scripts/sample.js"></script>
</body>
</html>
sample.js
if (document.getElementById("fixedHeader")) {
window.onscroll = function () { fixedHeader(); };
var header = document.getElementById("fixedHeader");
var fixed = header.offsetTop;
}
function fixedHeader() {
if (window.pageYOffset > fixed) {
header.classList.add("fixed-active-lob");
$('body').addClass("fixed-nav");
} else {
header.classList.remove("fixed-active-lob");
$('body').removeClass("fixed-nav");
}
}
current.component.html
<div class="gb-nav gn">
<div id="fixedHeader" class="header">....
</div>
</div>
sample.css 包含在 styles.css 中的文件具有
.gb-nav.gn .fixed-active-lob {
position: fixed;
top: 0;
width: 100%;
z-index: 999999;
-webkit-box-shadow: 0px 10px 15px -1px rgba(0,0,0,0.45);
-moz-box-shadow: 0px 10px 15px -1px rgba(0,0,0,0.45);
box-shadow: 0px 10px 15px -1px rgba(0,0,0,0.45);
}
body.fixed-nav{
padding-top:56px
}
我无法从 angular 组件中的 sample.js 触发功能。但是,我能够通过在
中再次定义相同的函数来获得所需的结果current.component.ts 如:
@HostListener('window:scroll', ['$event'])
scrollHandler(event: any) {
console.log("Scroll event", event);
this.fixedHeader();
}
fixedHeader() {
var header = document.getElementById("fixedHeader");
var fixed: number = 0;
if (header?.offsetTop != undefined) {
fixed = header?.offsetTop;
} else {
fixed = 0;
}
if (window.pageYOffset > fixed) {
header?.classList.add("fixed-active-lob");
$('body').addClass("fixed-nav");
} else {
header?.classList.remove("fixed-active-lob");
$('body').removeClass("fixed-nav");
}
}
但是我想使用JS文件中的函数而不是在ts文件中重做,请帮忙。
首先,修改 sample.js
使其像这样导出 fixedHeader
if (document.getElementById("fixedHeader")) {
window.onscroll = function () { fixedHeader(); };
var header = document.getElementById("fixedHeader");
var fixed = header.offsetTop;
}
export function fixedHeader() {
if (window.pageYOffset > fixed) {
header.classList.add("fixed-active-lob");
$('body').addClass("fixed-nav");
} else {
header.classList.remove("fixed-active-lob");
$('body').removeClass("fixed-nav");
}
}
通过这次调整,我们将 sample.js
变成了一个模块,具有一个名为 fixedHeader
的导出,因此启用了其他模块,例如我们的 current.component.ts
,以通过在 JavaScript: Modules.
接下来,在项目的 tsconfig.json
中设置 "allowJs": true
以通知 TypeScript 我们的项目包含 TypeScript 和 JavaScript 源文件的混合。
最后,将我们从sample.js
导出的fixedHeader
函数直接导入current.component.ts
,从Angular组件[=37=中删除现在多余的方法], 调用导入函数如下
import {Component, HostListener} from '@angular/core';
import {fixedHeader} from '../assets/scripts/sample.js';
@Component({
// Angular boilerplate and ceremony
})
export class CurrentComponent { // or whatever it is actually called
@HostListener('window:scroll', ['$event'])
scrollHandler(event: Event) {
console.log("Scroll event", event);
fixedHeader();
}
}
最后,从index.html
.
sample.js
的脚本标签
注意:根据文件相对于彼此的实际位置,根据需要调整上述导入路径。