我在提供Ionic 5应用程序时遇到以下错误:
Uncaught TypeError: Failed to construct 'HTMLElement': Please use the 'new' operator, this DOM object constructor cannot be called as a function.
at Reflect.<anonymous> (js?key=MY_API_KEY&v=3.exp&callback=initMap&libraries=places:261:93)
at new _.C.HTMLElement (js?key=MY_API_KEY&v=3.exp&callback=initMap&libraries=places:338:225)
at new HostElement (index-7a8b7a1c.js:1847:17)
at DefaultDomRenderer2.createElement (platform-browser.js:645:1)
at BaseAnimationRenderer.createElement (animations.js:249:1)
at createElementNode (core.js:5759:1)
at ɵɵelementStart (core.js:14957:1)
at AppComponent_Template (template.html:3:3)
at executeTemplate (core.js:9705:1)
at renderView (core.js:9508:1)
js?key=MY_API_KEY&v=3.exp&callback=initMap&libraries=places:261 Uncaught TypeError: Failed to construct 'HTMLElement': Please use the 'new' operator, this DOM object constructor cannot be called as a function.
at Reflect.<anonymous> (js?key=MY_API_KEY&v=3.exp&callback=initMap&libraries=places:261:93)
at new _.C.HTMLElement (js?key=MY_API_KEY&v=3.exp&callback=initMap&libraries=places:338:225)
at new HostElement (index-7a8b7a1c.js:1847:17)
at DefaultDomRenderer2.createElement (platform-browser.js:645:1)
at BaseAnimationRenderer.createElement (animations.js:249:1)
at createElementNode (core.js:5759:1)
at ɵɵelementStart (core.js:14957:1)
at AppComponent_Template (template.html:4:5)
at executeTemplate (core.js:9705:1)
at renderView (core.js:9508:1)
这是我的index.html,错误似乎来自于:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Ionic App</title>
<script>
function initMap() {}
</script>
<script src="https://maps.googleapis.com/maps/api/js?key=MY_API_KEY&v=3.exp&callback=initMap&libraries=places"></script>
<link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.10.0/css/all.css" integrity="sha384-MY_SHA+p" crossorigin="anonymous"/>
<link rel="stylesheet" type="text/html" href="../node_modules/angular-calendar/css/angular-calendar.css">
<meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="format-detection" content="telephone=no" />
<meta name="msapplication-tap-highlight" content="no" />
<link rel="icon" type="image/png" href="assets/icon/favicon.png" />
<!-- add to homescreen for ios -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<base href="/">
</head>
<body>
<app-root></app-root>
</body>
</html>
我相信错误是在那里引入的,因为当我删除
<script src="https://maps.googleapis.com/maps/api/js?key=MY_API_KEY&v=3.exp&callback=initMap&libraries=places"></script>
应用程序按预期提供。
我检查了一下我在Google Cloud Platform上的API密钥是否有问题,但那里看起来一切正常。
到目前为止,我已经尝试了以下方法:from:https://github.com/parcel-bundler/parcel/issues/2652我将我的编译器选项目标从es 5升级到es6。然后删除node_modules并运行npm cache clear --force。然后运行npm install,然后服务ionic应用程序,仍然得到相同的错误。
最初,我有一个想法,我今天引入了一些bug,但我没有添加任何新的依赖项。此外,我一直在多台机器上测试这个应用程序,我碰巧在另一台机器上提交了一个版本。我试图在那里服务应用程序,我得到了完全相同的错误。这也是完全随机发生的,在一天的中间,当我在编码一些完全不相关的东西时。这让我相信google maps API中的一些东西引入了一些错误。
作为参考,这里是我的package.json:
{
"name": "treetopfour",
"version": "0.0.1",
"author": "Ionic Framework",
"homepage": "https://ionicframework.com/",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "^12.2.16",
"@angular/cdk": "^12.2.13",
"@angular/common": "^12.2.16",
"@angular/core": "^12.2.16",
"@angular/fire": "^6.1.5",
"@angular/forms": "^12.2.16",
"@angular/material": "^12.2.13",
"@angular/platform-browser": "^12.2.16",
"@angular/platform-browser-dynamic": "^12.2.16",
"@angular/router": "^12.2.16",
"@awesome-cordova-plugins/core": "^6.1.0",
"@awesome-cordova-plugins/geolocation": "^6.1.0",
"@babel/runtime": "^7.19.4",
"@ctrl/ngx-emoji-mart": "^6.2.0",
"@ionic-native/badge": "^5.36.0",
"@ionic-native/core": "^5.36.0",
"@ionic-native/file-chooser": "^5.36.0",
"@ionic-native/file-path": "^5.36.0",
"@ionic-native/file-picker": "^5.36.0",
"@ionic-native/geolocation": "^5.36.0",
"@ionic-native/splash-screen": "^5.36.0",
"@ionic-native/status-bar": "^5.36.0",
"@ionic/angular": "^5.9.4",
"@ionic/core": "^5.9.4",
"@types/googlemaps": "^3.43.3",
"ajv": "^6.12.6",
"angular-calendar": "^0.28.28",
"angular-draggable-droppable": "^6.1.0",
"angular-ng-autocomplete": "^2.0.12",
"angular-resizable-element": "^5.0.0",
"calendar-utils": "^0.10.4",
"core-js": "^3.26.0",
"date-fns": "^2.29.3",
"dateformat": "^5.0.3",
"firebase": "^8.10.1",
"ionicons": "^5.5.4",
"moment-timezone": "^0.5.41",
"positioning": "^2.0.1",
"rxjs": "^6.6.7",
"tslib": "^2.4.0",
"typesense": "^1.4.1",
"zone.js": "^0.11.8"
},
"devDependencies": {
"@angular-devkit/architect": "^0.1402.8",
"@angular-devkit/build-angular": "^12.2.18",
"@angular-devkit/core": "^14.2.8",
"@angular-devkit/schematics": "^14.2.8",
"@angular/cli": "^12.2.18",
"@angular/compiler": "^12.2.16",
"@angular/compiler-cli": "^12.2.16",
"@angular/language-service": "^14.2.8",
"@ionic/angular-toolkit": "^6.1.0",
"@types/jasmine": "^4.3.0",
"@types/jasminewd2": "^2.0.10",
"@types/node": "^18.11.9",
"codelyzer": "^6.0.2",
"cordova-plugin-badge": "^0.8.8",
"cordova-plugin-filepath": "^1.6.0",
"cordova-plugin-filepicker": "^1.1.6",
"cordova-plugin-geolocation": "^4.0.2",
"jasmine-core": "^4.5.0",
"jasmine-spec-reporter": "^7.0.0",
"karma": "^6.4.1",
"karma-chrome-launcher": "^3.1.1",
"karma-coverage-istanbul-reporter": "^3.0.3",
"karma-jasmine": "^5.1.0",
"karma-jasmine-html-reporter": "^2.0.0",
"protractor": "^7.0.0",
"ts-node": "^10.9.1",
"tslint": "^6.1.3",
"typescript": "4.3.5"
},
"description": "An Ionic project",
"cordova": {
"plugins": {
"cordova-plugin-whitelist": {},
"cordova-plugin-statusbar": {},
"cordova-plugin-device": {},
"cordova-plugin-splashscreen": {},
"cordova-plugin-ionic-webview": {},
"cordova-plugin-ionic-keyboard": {},
"cordova-plugin-geolocation": {},
"cordova-plugin-badge": {},
"cordova-plugin-filepicker": {},
"cordova-plugin-filepath": {}
},
"config": {
"ionic_copy": "./config/copy.config.js"
},
"platforms": [
"browser"
]
}
}
下面是我的angular.json(我为应用程序提供:“ionic serve -configuration=dev”):
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"defaultProject": "app",
"newProjectRoot": "projects",
"projects": {
"app": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"prefix": "app",
"schematics": {},
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "www",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.app.json",
"assets": [
{
"glob": "**/*",
"input": "src/assets",
"output": "assets"
},
{
"glob": "**/*.svg",
"input": "node_modules/ionicons/dist/ionicons/svg",
"output": "./svg"
}
],
"styles": [
{
"input": "node_modules/angular-calendar/css/angular-calendar.css"
},
{
"input": "node_modules/@ctrl/ngx-emoji-mart/picker.css"
},
{
"input": "src/theme/variables.scss"
},
{
"input": "src/global.scss"
},
{
"input": "src/app/app.scss"
}
],
"scripts": []
},
"configurations": {
"dev": {
"optimization": false,
"outputHashing": "all",
"sourceMap": true,
"extractCss": true,
"namedChunks": false,
"aot": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": false,
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.ts"
}
]},
"production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"budgets": [
{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
}
]
},
"ci": {
"progress": false
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "app:build"
},
"configurations": {
"production": {
"browserTarget": "app:build:production"
},
"dev": {
"browserTarget": "app:build:dev"
},
"ci": {
"progress": false
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "app:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.spec.json",
"karmaConfig": "src/karma.conf.js",
"styles": [],
"scripts": [],
"assets": [
{
"glob": "favicon.ico",
"input": "src/",
"output": "/"
},
{
"glob": "**/*",
"input": "src/assets",
"output": "/assets"
}
]
},
"configurations": {
"ci": {
"progress": false,
"watch": false
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": ["src/tsconfig.app.json", "src/tsconfig.spec.json"],
"exclude": ["**/node_modules/**"]
}
},
"ionic-cordova-build": {
"builder": "@ionic/angular-toolkit:cordova-build",
"options": {
"browserTarget": "app:build"
},
"configurations": {
"production": {
"browserTarget": "app:build:production"
}
}
},
"ionic-cordova-serve": {
"builder": "@ionic/angular-toolkit:cordova-serve",
"options": {
"cordovaBuildTarget": "app:ionic-cordova-build",
"devServerTarget": "app:serve"
},
"configurations": {
"production": {
"cordovaBuildTarget": "app:ionic-cordova-build:production",
"devServerTarget": "app:serve:production"
}
}
}
}
},
"app-e2e": {
"root": "e2e/",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "e2e/protractor.conf.js",
"devServerTarget": "app:serve"
},
"configurations": {
"production": {
"devServerTarget": "app:serve:production"
},
"ci": {
"devServerTarget": "app:serve:ci"
}
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": "e2e/tsconfig.e2e.json",
"exclude": ["**/node_modules/**"]
}
}
}
}
},
"cli": {
"defaultCollection": "@ionic/angular-toolkit"
},
"schematics": {
"@ionic/angular-toolkit:component": {
"styleext": "scss"
},
"@ionic/angular-toolkit:page": {
"styleext": "scss"
}
}
}
下面是我的tsconfig.json:
{
"compileOnSave": false,
"compilerOptions": {
"skipLibCheck": true,
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"module": "es2020",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"importHelpers": true,
"target": "es6",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2018",
"dom"
]
}
}
如前所述,在上面的“目标”最初是“es 5”。
我完全惊讶,这只是随机发生的。任何建议都表示赞赏,我很高兴提供任何信息是我的要求。
3条答案
按热度按时间ijnw1ujt1#
谷歌更新了他们的MapAPI到版本3.52.7 -与突破性的变化。发言与谷歌的支持,他们正在回滚到3.52.6。
目前正在进行推广。
以下是Google Issue Tracker的链接:https://issuetracker.google.com/issues/275849045?pli=1
ghhkc1vu2#
看起来Google在最新的更新中搞砸了一些事情。在花了几个小时之后,我发现回到早期版本工作正常。使用v=3.51
14ifxucb3#
更新加载API的脚本标记,并请求一个较旧的版本号。例如,如果google.maps.version是“3.52.2”,则在脚本标记中使用v=3.51。此临时解决方案仅在有限的时间内有效。