开发者问题收集

Jquery .click() 给出“超出堆栈大小”

2016-06-29
13204

我的代码中什么地方导致了此错误?

jquery-2.1.3.min.js:3 Uncaught RangeError: Maximum call stack size exceeded

HTML

<form id="addPhotoForm">
    <img class="pull-right" src="" width="100px" height="140px"/>
    <input type="file" id="addPhotoInput" name="addPhotoInput" style="display: none;"/> 
</form>

JS

//On click Photo
$('#addPhotoForm').on('click', function(){
    //Check if usrname exist
    var usrname = $('#usrname').val();
    if(usrname){
        $('#addPhotoInput').trigger('click');
    }
    else{
        alert("!");
    }
})

如何解决此错误?
我尝试在单击表单时打开文件对话框。

更新
我尝试过:

$('#addPhotoInput').click();
3个回答

为避免触发使用 jQuery 绑定的任何点击事件处理程序,同时仍保持事件传播(如果任何委托点击事件也绑定则很有用),您可以改为调用本机 DOM click() 方法:

$('#addPhotoInput')[0].click();

或者:

$('#addPhotoInput').get(0).click();

与以下方法相同:

document.getElementById('addPhotoInput').click();
A. Wolff
2016-06-29

您已将 click 事件 附加到表单本身。因此,当单击 任何表单元素 时,由于 事件冒泡 ,它会再次被表单 捕获 。因此,它将再次在表单上调用 click 事件 。并且相同的过程一次又一次重复

您可以阻止 事件传播

$('#addPhotoForm').on('click', function(e){
    e.stopPropagation();

   // rest of the code goes here
})

编辑: 您应该将事件处理程序附加到表单内对最终用户可见的其他元素,而不是表单

RIYAJ KHAN
2016-06-29

您可以为点击事件使用命名空间

$('#addPhotoInput').on('click.input',function(){
    // do something
});

//On click Photo
$('#addPhotoForm').on('click.form', function(){
    //Check if usrname exist
    var usrname = $('#usrname').val();
    if(usrname){
        $('#addPhotoInput').trigger('click.input');
    }
    else{
        alert("!");
    }
})
Veslav
2016-06-29