【问题标题】:Error: HTML onClick not defined with Node.js, NPM and Parcel错误:HTML onClick 未使用 Node.js、NPM 和 Parcel 定义
【发布时间】:2019-06-02 05:32:43
【问题描述】:

我正在制作一个天气应用程序。

为了开发这个,我将 Node.js 与 NPM 和 Parcel 一起使用。 (我需要这样做,否则 OpenLayers 将无法工作,但我之前没有使用过它。)

我需要能够使用用户输入。例如,我希望用户点击一个按钮,然后需要发生一些事情。

下面是我需要完成的一个非常简单的解释。

按钮,我需要在 index.html 中

<input type="button" name="bt" value="test" onclick="clickKnop()">

点击后需要执行的函数,我需要在index.js中

    function clickKnop(){
        console.log('Hello World'); 
    };

当然,在我的应用程序中,功能需要有所不同,但这不是我的问题。

当我在 Node.js 环境中编码时,它仅在我将 clickKnop 函数放入我的 HTML 的脚本部分时才有效。

当我将该函数放入我的 index.js 文件时,它不再起作用了。我收到以下错误:Uncaught ReferenceError: clickKnop is not defined 在 HTMLInputElement.onclick

当我在我的服务器上使用创建的 /dist 文件时也会发生这种情况,一旦应用程序完成,这些文件就会显示在该服务器上。

我怎样才能做到这一点?

希望大家帮忙!!

编辑:

import Map from 'ol/Map.js';
import View from 'ol/View.js';
import TileLayer from 'ol/layer/Tile.js';
import OSM from 'ol/source/OSM.js';
import TileWMS from 'ol/source/TileWMS.js';
import {fromLonLat} from 'ol/proj';
import {ZoomSlider} from 'ol/control.js';

	/*
		Hieronder komt het stukje code voor de datum en tijd.
		Default moet present datetime zijn, afgerond op 10 min (naar beneden).
		Vervolgens moeten er stapjes van 10 minuten terug gemaakt worden om uit te kiezen.
		De eindgebruiker moet zelf ook een datetime in kunnen voeren welke dan opgehaald wordt.
		Hiervoor worden ook de stapjes van 10 minuten gebruikt.
	*/

	// Current datetime
	const date = new Date();
	
	//Round current datetime to last 10 min
	const coeff = 1000 * 60 * 10;
	const floorDate = new Date(Math.floor(date.getTime() / coeff) * coeff);

	//Format the current datetime so that it can be used as input for the WMS viewparams
	const floorDateFormat = new Date(floorDate.toString().split('GMT')[0]+' UTC').toISOString().split('.')[0].replace('T',' ');
	
	console.log(floorDateFormat);
	
	
	// -10 minutes from current time + formatting for input viewparams
	const minusTenMinutes = floorDate;
	minusTenMinutes.setMinutes(minusTenMinutes.getMinutes() - 10);
	const minusTenMinutesFormat =	new Date(minusTenMinutes.toString().split('GMT')[0]+' UTC').toISOString().split('.')[0].replace('T',' ');
	
	console.log(minusTenMinutesFormat);
	console.log(floorDate);


	/*
		Hieronder wordt de map gemaakt.
		De verschillende layers en layergroepen worden aangeroepen.
		De viewparams + datetime moet mee gaan met de hierboven gedefinieerde datetime
		Daarnaast moet de gebruiker ook kunnen wisselen tussen de verschillende weersoorten,
		hiervoor moeten de params geüpdatet worden.
	*/
	let datetime = "2018-10-16 08:00:00";
	
	//Base Europe
	const wmsSourceBaseLayer = new TileWMS({
      url: 'http://localhost:8080/geoserver/O/wms',
      params: {
        'LAYERS': 'O:Europe_Polygons',
        'TILED': true
      },
      serverType: 'geoserver',
      crossOrigin: ''
    });

    const wmsBaseLayer = new TileLayer({
      source: wmsSourceBaseLayer
    });
	
	//Weather || DEFAULT TEMPERATURE
	const wmsSourceTemperature = new TileWMS ({
      url: 'http://localhost:8080/geoserver/O/wms',
      params: {
        'LAYERS': 'O:Temperature',
        'TILED': true,
		'viewparams': 'chosen_timestamp:' + datetime
      },
      serverType: 'geoserver',
      crossOrigin: 'anonymous'
    });
	
	const wmsWeatherLayer = new TileLayer({
		source: wmsSourceTemperature
	});

	//Update de params zodat er ander weer komt
	//wmsSourceTemperature.updateParams({'LAYERS': 'Observations:observations_v'});
	
	//LonLat of germany converted for use in view
	const germanyLonLat = [10.018343, 51.133481];
	const germanyConvertedLonLat = fromLonLat(germanyLonLat);
	
	//Making a view for the map
    const view = new View({
      center: germanyConvertedLonLat,
      zoom: 5
    });
	
	//Building the map with the layers
    const map = new Map({
      layers: [wmsBaseLayer, wmsWeatherLayer],
      target: 'map',
      view: view
    });
	
  
  
  
  
	function clickKnop(){
		console.log('Hello World');	
	};
    
<head>
  <title>Tiled WMS</title>
  <!--<meta http-equiv="refresh" content="10"/>-->
  <link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" type="text/css">
  <style>
    #map {
      width: 450px;
      height: 500px;
	  border: 3px solid grey;
    }
  </style>
</head>

<body>
		<div id="map" class="map"></div>
		<script src="./index.js"></script>
		<input type="button" name="bt" value="test" onclick="clickKnop()">
</body>

现在有点乱,但我想要完成的是,不同的地理服务器 WMS 层会根据时间使用不同的参数调用。

为此,我想从我的 HTML 中输入(我还想制作一个按钮以 10 分钟的步长返回)。

所以我想制作调用 WMS 层来更改时间变量的函数。

再说一遍,我现在的代码真的很乱,但我仍在努力,所以请看过去..

希望这会有所帮助...

【问题讨论】:

  • 它是一个范围问题,您在 EventListener 定义中是否有 clickKnop() 函数定义?包含.js 文件以便我们提供帮助
  • stackoverflow.com/questions/43209534/… - 您可能没有关闭模板文件中的脚本标签。如果可能的话,在上下文中发布完整代码
  • 我将添加我的代码!给我一分钟
  • 我看到node.js npm和parcel生成的project.1234.js给函数和变量起不同的名字。这可能是问题的一部分吗? (或者可能与它无关。)
  • 好的。为什么不把脚本放在body标签里面呢?

标签: javascript node.js input npm parceljs


【解决方案1】:

您似乎混淆了前端脚本和后端脚本之间的区别。

您必须开发一个能够与您的 node.js 应用程序通信的前端应用程序。您的 HTML 代码无法读取 NodeJS 源代码,这就是您收到错误 Uncaught ReferenceError: clickKnop is not defined at HTMLInputElement.onclick 的原因。

从表面上看,您必须分离出前端代码,以使用 https://expressjs.com/ 之类的方式调用 NodeJS 应用程序上的端点。

这方面的一个例子是:

前端使用 JQuery

<body>
<a id="UpdateMap">Update Map</a>
<script src="jquery..." />
<script>
    $('#UpdateMap').click(function(){
       $.get( "myNodeJSServer:Port/UpdateMap", function( data ) {
          $( ".map" ).html( data );
          alert( "Load was performed." );
        });
    });
</script>
</body>

后端使用 Express 和 NodeJS

...
//In your NodeJS Express Routes Application Page
app.get('/UpdateMap', function (req, res) {
  clickKnop();
})

【讨论】:

  • 我对这种方式的网络开发很陌生,所以你可能是对的,我还没有完全理解这些概念。但我可以再问你一件事吗?现在我正在使用 Node.js 开发应用程序,但最后我希望它显示在我的 Tomcat 服务器上。我通过以下方式执行此操作:npm run build,然后将 dist 文件从我的项目复制到 Tomcat webapps (/dist) 映射。那你的回答还适用吗?还是工作方式不同?
  • 您可以使用 NodeJS 轻松创建自己的 Web 服务器,而使用 Apache Tomcat。 (这是我处理您的问题的方式)。如果您使用 Express 创建 NodeJS 应用程序(按照他们的入门教程),您可以转到浏览器 http://localhost:8080/ 并调用您的 NodeJS 应用程序。您不会在 NodeJS 和 Tomcat 之间复制文件。
  • 感谢您的反应。我整个上午都在看 Express 的教程。我将 dist 文件复制到我的 Tomcat 服务器的原因是因为 OL5 设置指南告诉我这样做。 (或者至少,将文件复制到服务器,并且我已经将 Tomcat 服务器用于 GeoServer,因此这似乎是最好的解决方案。)我正在考虑使用 Express 制作应用程序,但不确定这是否有必要。 (设置指南链接:openlayers.org/en/latest/doc/tutorials/bundle.html
  • 哦,我现在看到了罪魁祸首。该行是指当您准备好部署到应用程序时,将 dist/ 文件夹从您的开发机器复制到您的 NodeJS 服务器。作为开发人员,您不必执行此操作并将服务器保留在本地计算机上,直到完成。然后你可以研究如何分发你的代码。
  • 该示例实际上根本没有使用 NodeJS。这超出了您的原始问题的范围,但这是我在不需要 NodeJS 的 Native Javascript(和 JQuery)中使用的 OpenLayers 的一个快速示例。 (jsfiddle.net/VictorVelarde/DbCgt)。
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 2013-12-10
  • 2013-02-18
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2019-11-21
  • 2016-07-19
相关资源
最近更新 更多