JS:未捕获TypeError:对象不是函数(onclick)

ita*_*mar 21 html javascript

编辑: 这是一个JSfiddle

Edit2:错误在这一行:<input type="button" value="totalbandwidthresult" onclick="javascript:totalbandwidth();">

试图让按钮执行计算.下面是必需的变量,以及HTML所在的位置

我收到错误点击: Uncaught TypeError: object is not a function index.html:71 onclick

这是我的Javascript

function totalbandwidth() {  
    var fps=Number(document.calculator.fps.value);  
    var bitrate=Number(document.calculator.bitrate.value);  
    var numberofcameras = Number(document.calculator.numberofcameras.value); 
    var encoding = document.calculator.encoding.value; 
    if (encoding = "mjpeg")
    {
        storage = bitrate*fps;
    }
    else
    {
        storage = bitrate;
    }

    totalbandwidth = (numberofcameras * storage) / 1000;
    document.calculator.totalbandwidthresult.value = totalbandwidth;  
}  
Run Code Online (Sandbox Code Playgroud)

HTML:

<form name="calculator" class="formtable">  
<div class="formrow"><label for="rcname">RC Name</label> <input type="text" name="rcname"></div>  
<div class="formrow"><label for="fps">FPS</label> <input type="text" name="fps">  </div>  
<div class="formrow"><label for="bitrate">Bitrate</label> <input type="text" name="bitrate">  </div>  
<div class="formrow"><label for="numberofcameras">Number of Cameras</label> <input type="text" name="numberofcameras"> </div>   
<div class="formrow"><label for="encoding">Encoding</label> <select name="encoding" id="encodingoptions">
  <option value="h264">H.264</option>
  <option value="mjpeg">MJPEG</option>
  <option value="mpeg4">MPEG4</option>
</select></div>  
Total Storage: <input type="text" name="totalstorage">   
Total Bandwidth: <input type="text" name="totalbandwidth">   
<input type="button" value="totalbandwidthresult" onclick="javascript:totalbandwidth();">  
Run Code Online (Sandbox Code Playgroud)

基本上 - 似乎我在JS中使用的语法可能有问题 - 但我不确定.

Nil*_*tel 44

请只更改功能名称; 无需其他更改

<script>
    function totalbandwidthresult() {
        alert("fdf");
        var fps = Number(document.calculator.fps.value);
        var bitrate = Number(document.calculator.bitrate.value);
        var numberofcameras = Number(document.calculator.numberofcameras.value);
        var encoding = document.calculator.encoding.value;
        if (encoding = "mjpeg") {
            storage = bitrate * fps;
        } else {
            storage = bitrate;
        }

        totalbandwidth = (numberofcameras * storage) / 1000;
        alert(totalbandwidth);
        document.calculator.totalbandwidthresult.value = totalbandwidth;
    }
</script>

<form name="calculator" class="formtable">
    <div class="formrow">
        <label for="rcname">RC Name</label>
        <input type="text" name="rcname">
    </div>
    <div class="formrow">
        <label for="fps">FPS</label>
        <input type="text" name="fps">
    </div>
    <div class="formrow">
        <label for="bitrate">Bitrate</label>
        <input type="text" name="bitrate">
    </div>
    <div class="formrow">
        <label for="numberofcameras">Number of Cameras</label>
        <input type="text" name="numberofcameras">
    </div>
    <div class="formrow">
        <label for="encoding">Encoding</label>
        <select name="encoding" id="encodingoptions">
            <option value="h264">H.264</option>
            <option value="mjpeg">MJPEG</option>
            <option value="mpeg4">MPEG4</option>
        </select>
    </div>Total Storage:
    <input type="text" name="totalstorage">Total Bandwidth:
    <input type="text" name="totalbandwidth">
    <input type="button" value="totalbandwidthresult" onclick="totalbandwidthresult();">
</form>
Run Code Online (Sandbox Code Playgroud)

  • 为什么通过更改名称修复问题? (12认同)
  • @StevenHernandez - 他们发生冲突.一旦名称被更改,冲突就会得到解决. (7认同)

Ng *_*ong 17

由于行为有点奇怪,我对行为做了一些测试,这是我的结果:

TL; 博士

如果你是:

  • form, 和
  • 使用onclick="xxx()"的元件上
  • 不要添加id="xxx"或添加name="xxx"到该元素
    • (例如<form><button id="totalbandwidth" onclick="totalbandwidth()">BAD</button></form>

这是一些测试及其结果:

对照样例(可以成功调用函数)

function totalbandwidth(){ alert("Total Bandwidth > 9000Mbps"); }
Run Code Online (Sandbox Code Playgroud)
<form onsubmit="return false;">
  <button onclick="totalbandwidth()">SUCCESS</button>
</form>
Run Code Online (Sandbox Code Playgroud)

给按钮添加id (调用函数失败)

function totalbandwidth(){ alert("Total Bandwidth > 9000Mbps"); }
Run Code Online (Sandbox Code Playgroud)
<form onsubmit="return false;">
  <button id="totalbandwidth" onclick="totalbandwidth()">FAILED</button>
</form>
Run Code Online (Sandbox Code Playgroud)

给按钮添加名称(调用函数失败)

function totalbandwidth(){ alert("Total Bandwidth > 9000Mbps"); }
Run Code Online (Sandbox Code Playgroud)
<form onsubmit="return false;">
  <button name="totalbandwidth" onclick="totalbandwidth()">FAILED</button>
</form>
Run Code Online (Sandbox Code Playgroud)

给按钮添加值(可以成功调用函数)

function totalbandwidth(){ alert("Total Bandwidth > 9000Mbps"); }
Run Code Online (Sandbox Code Playgroud)
<form onsubmit="return false;">
  <input type="button" value="totalbandwidth" onclick="totalbandwidth()" />SUCCESS
</form>
Run Code Online (Sandbox Code Playgroud)

给按钮添加id,但不是在表单中(可以成功调用函数)

function totalbandwidth(){ alert("Total Bandwidth > 9000Mbps"); }
Run Code Online (Sandbox Code Playgroud)
<button id="totalbandwidth" onclick="totalbandwidth()">SUCCESS</button>
Run Code Online (Sandbox Code Playgroud)

给表单内的另一个元素添加id (可以成功调用函数)

function totalbandwidth(){ alert("The answer is no, the span will not affect button"); }
Run Code Online (Sandbox Code Playgroud)
<form onsubmit="return false;">
<span name="totalbandwidth" >Will this span affect button? </span>
<button onclick="totalbandwidth()">SUCCESS</button>
</form>
Run Code Online (Sandbox Code Playgroud)

  • 原因是在 HTML 表单内部以及 HTML 表单内部, onclick() JavaScript 块将获得一个注入的作用域,该作用域包含表单的所有其他输入元素。因此,名称为“xxx”的元素隐藏了名称为“xxx”的全局函数。另请参阅https://medium.com/analytics-vidhya/javascript-variables-inside-form-elements-event-attributes-aa945388a47d (3认同)

ita*_*mar 5

我能够通过遵循此线程中的答案来弄清楚:/sf/answers/627794681/

基本上,我将所有值、函数名称和元素名称重命名为不同的值,这样它们就不会发生冲突 - 并且它起作用了!