Это то, что я смог придумать для удаления глобальных переменных, которые автоматически создаются для объектов DOM с идентификационным значением:
function clearElementGlobals() {
function clearItem(iden, item) {
if (iden && window[iden] && (window[iden] === item)) {
window[iden] = undefined;
}
}
var list = document.getElementsByTagName("*");
for (var i = 0, len = list.length; i < len; i++) {
var item = list[i];
clearItem(item.id, item);
clearItem(item.name, item);
}
}
Это получает список всех объектов в стр. Он просматривает поиск значений с идентификатором и когда для него существует значение id, и для него существует глобальная переменная, и эта глобальная переменная указывает на этот объект DOM, эта глобальная переменная имеет значение undefined. Как выясняется, браузеры также делают это же авто-глобальное для некоторых типов тегов с атрибутом имени (например, элементами формы), поэтому мы также очищаем их.
Конечно, этот код не может знать, собственный код делает глобальную переменную с тем же именем, что и идентификатор, поэтому было бы лучше либо не делать этого в вашем собственном коде, либо вызвать эту функцию до того, как будут инициализированы ваши глобальные переменные.
К сожалению, вы не можете удалить глобальные переменные в javascript, поэтому установить его в undefined - это лучшее, что можно сделать.
FYI, я пробовал делать это по-другому, где вы перечисляете глобальные переменные, которые ищут переменные, являющиеся экземпляром HTMLElement и которые имеют имя, которое соответствует идентификатору элемента, на который они указывают, но я не смог найти надежный способ перечислить глобальные переменные. В Chrome вы не можете перечислять их на объект окна, даже если вы можете получить к ним доступ через объект окна. Итак, мне пришлось пойти наоборот, получив все объекты DOM с идентификатором и поиская глобальные переменные, которые соответствуют им.
FYI, вы спросили о строгом режиме в своем вопросе. строгий режим применяется только к заданной области кода, поэтому не было бы никакого способа заставить его влиять на способ создания глобального пространства имен. Чтобы повлиять на что-то подобное, это должно было быть что-то на уровне документа до того, как документ был разобран как опция DOCTYPE или что-то в этом роде.
Предостережения с этой функцией.
Вот, как вы должны это сделать.
//component
import { ZoomService } from './../services/zoom.service';
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class HomePage implements OnInit{
spots: string[] = [];
constructor(private zoom: ZoomService) {}
ngOnInit() {
this.zoom.dosomthing()
.subscribe((res: string[]) => {
this.spots = res;
console.log(this.spots);
});
}
}
//service
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import * as $ from 'jquery';
@Injectable({
providedIn: 'root'
})
export class ZoomService {
constructor(private httpService: HttpClient) {}
dosomthing(): Observable<string[]> {
return this.httpService.get<string[]>('./assets/plates/plate1/spot.json');
}
}