JavaScript 函数在 Parcel 构建期间在 HTML 文件中调用时不会触发

JavaScript function won't trigger when called in HTML file during Parcel build

我有一个链接到 JavaScript 文件的基本 HTML 表单页面。这两个文件都存在于 Node 项目中,我将 Parcel 用作打包器(因为我最终想将其转换为 TypeScript)。

当我运行浏览器中的html文件时,JavaScript函数会触发,但是当我运行构建Parcel时,index.html 将编译,但 JavaScript 函数不会触发。它识别 js 文件,因为我可以在函数外调用 dom 查询。

当我检查控制台时出现错误:

(index):12 Uncaught ReferenceError: validationFunction is not defined
    at HTMLInputElement.onchange

但这没有意义,因为函数是在 Parcel 构建之外定义的。

用Parcel编译时如何让index.html页面识别JavaScript函数?

index.js 文件如下:

function validationFunction(event) {
  event.preventDefault();
  var div;
  div = document.getElementById("appendedText");
  div.innerHTML += "hello world";
}

index.html是:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
</head>

<body>
    <form action="" method="post">
        First name:<br />
        <input onChange="validationFunction(event)" type="text" name="firstname" /><br />
        <input type="submit" name="Submit" />
    </form>
    <h1></h1>
    <div id="appendedText"></div>
    <script src="index.js"></script>
</body>

</html>

而 package.json 是:

{
  "name": "typescriptprojects",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "parcel index.html"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "typescript": "^3.5.3"
  },
  "dependencies": {
    "parcel-bundler": "^1.12.3"
  }
}

默认情况下,parcel js 包在全局命名空间中不可用。

您可以将您的函数直接附加到 window 对象,然后您的代码应该按原样工作:

window.validationFunction = function validationFunction(event) {
  event.preventDefault();
  var div;
  div = document.getElementById("appendedText");
  div.innerHTML += "hello world";
}

或者使用全局标志导出命名模块:

// package.json
"scripts": {
    "dev": "parcel index.html --global myCustomModule"
  },

// index.js
module.exports.validationFunction= function validationFunction(event) {
  event.preventDefault();
  var div;
  div = document.getElementById("appendedText");
  div.innerHTML += "hello world";
}

// or alternatively index.ts
export function validationFunction(event) {
  event.preventDefault();
  var div;
  div = document.getElementById("appendedText");
  div.innerHTML += "hello world";
}

// index.html
<input onChange="myCustomModule.validationFunction(event)" type="text" name="firstname" /><br />

我正在使用纯 js 和 html 包裹。我无法得到 运行 的正确答案。它永远无法找到我的功能(我认为是因为它从未导出过)。我个人通过将点击事件设置为 js 文件末尾的元素来解决我试图做的事情..

import { isEven } from '../src/ease.rs'

function rustIt(){
 
    var input = document.getElementById("entered-number").value
    var res = isEven(input)
    if (res === 1) { //true
        document.getElementById("result").innerText = "TRUE!!!"
    }
    else {
        document.getElementById("result").innerText = "FALSE!!!"
    }
    document.getElementById("entered-number").value = ''
}

document.getElementById("myButton").onclick =  function (){
    rustIt()
};

而我的html只是

<html>
<body>
  <script src="./index.js"></script>
      <div style="justify-content: center;">
          <label for="entered-number">
              enter number please
          </label>
          <input id="entered-number" type="number" style="border: 1px black solid" />
          <button type="button" id="myButton">USE RUST</button>
      </div>

    <div id="container">
        RUST SAYS: <span id="result"></span>
    </div>
</body>
</html>