用jquery的click或者trigger("click")模拟文件域点击不好使。

本文详细阐述了如何通过HTML和JavaScript模拟文件上传框的功能,包括创建文本框和按钮,实现点击按钮触发文件选择对话框,并同步更新文本框的值。然而,通过将代码放入表单中进行测试发现,模拟的上传框无法实际上传文件,原因是浏览器出于安全考虑限制了非点击按钮的上传行为。文章最后提出了一种解决方案,通过调整透明上传框的位置来模仿真实的点击行为。

原帖http://bbs.blueidea.com/viewthread.php?tid=1227402

 

 

<input type="file" style="border:1px solid blue;color:red;background:green;font:bold 12px '隶书';height:18px;width:160px">

 

 

可以看到,上传框带有两个控件:一个文本框和一个按钮。定义的样式对文本框全部生效,对于按钮,只有边框样式、字体大小和外观尺寸生效。看来直接用CSS定义它的外观是行不通的。

我们知道,大部分控件都有一个单击(click)事件句柄,上传框在单击"浏览..."按钮时会弹出"选择文件"对话框,如果我们自己模拟一个上传框:一个文本框(<input type="text">)和一个按钮(<input type="button">或<button>Text</button>),在单击自定义按钮时同时触发上传框的click事件让它弹出"选择文件"对话框... ...于是有:

 

<style>
.file{border:1px solid #333333;color:#666666;background:#eeeeee;font:normal 12px Tahoma;height:18px}
</style>
<input type="text" class="file" id="f_file"><input type="button" value="上传文件" class="file" onClick="t_file.click()">
<input name="upload" type="file" id="t_file" onchange="f_file.value=this.value" style="display:none">

 

 

在点击"上传文件"按钮时执行t_file.click(),当上传框的值有所改变时通过onchange事件句柄执行f_file.value=this.value,即保持真正的上传框与模拟的上传框的值同步更新,style="display:none"让真正的上传框隐藏,使模拟的文件上传框能以假乱真------问题似乎解决了,不过,把代码放到表单中测试一下看看:

 

 

 

<style>
.file{border:1px solid #333333;color:#666666;background:#eeeeee;font:normal 12px Tahoma;height:18px}
</style>
<form method="post" action="" enctype="multipart/form-data"><input type="text" class="file" id="f_file"><input type="button" value="上传文件" class="file" onClick="t_file.click()">
<input name="upload" type="file" id="t_file" onchange="f_file.value=this.value">
<input type="submit">
</form>

 

 

点击"上传文件"按钮后再提交表单,可以看到,真正的上传框的内容被清空了,意思就是说,这样模拟出来的上传框没有任何意义,因为没办法上传文件(记得上期《电脑》报上有关于这个的文章,我想作者肯定没放到表单中测试过)。
之所以是这个结果,估计是因为微软出于安全方面的考虑,只有当鼠标真正单击在上传控件的按钮上浏览到的文件才可以上传(否则,只要你进入我的页面,我就可以随心所欲的得到你的私密文件)。看来此路又是不通,不过不要丧气,运行一下下面的代码看看:

 

<script>
function fclick(obj){
  with(obj){
    style.posTop=event.srcElement.offsetTop	//设置透明上传框的Y坐标跟模拟按钮的Y坐标对齐
    style.posLeft=event.x-offsetWidth/2		//设置透明上传框的X坐标为鼠标在X轴上的坐标加上它的宽的一半(确保点击时能点中透明上传框的按钮控件),这里只是提供一种思路,其实还可以更精确的控制它的X坐标范围
  }
}
</script>
<style>
input{border:1px solid #333333;color:#666666;background:#eeeeee;font:normal 12px Tahoma;height:18px}
</style>
<form method="post" action="" enctype="multipart/form-data">
<input id="f_file">&nbsp;<input type="button" onmouseover="fclick(t_file)" value="选择上传文件">
<input name="upload" type="file" style="position:absolute;filter:alpha(opacity=0);width:30px;" id="t_file" onchange="f_file.value=this.value" hidefocus>
<br><input type="submit" value="提交">
</form>
 

 

直接看代码一时可能还明白不过来,可以把上传框的透明度增加到百分之三十再看看效果(或者看这里的讨论:http://bbs.blueidea.com/viewthread.php?tid=1118701):

 

<script>
function fclick(obj){
  with(obj){
    style.posTop=event.srcElement.offsetTop
    style.posLeft=event.x-offsetWidth/2
  }
}
</script>
<style>
input{border:1px solid #333333;color:#666666;background:#eeeeee;font:normal 12px Tahoma;height:18px}
</style>
<form method="post" action="" enctype="multipart/form-data">
<input id="f_file">&nbsp;<input type="button" onmouseover="fclick(t_file)" value="选择上传文件">
<input name="upload" type="file" style="position:absolute;filter:alpha(opacity=30);width:30px;" id="t_file" onchange="f_file.value=this.value" hidefocus>
<br><input type="submit" value="提交">
</form>

 

提示:要更精确的控制透明上传框的X坐标,可把脚本部分修改一下:

 

 

<script>
function fclick(obj){
  with(obj){
    style.posTop=event.srcElement.offsetTop
    var x=event.x-offsetWidth/2
    if(x<event.srcElement.offsetLeft)x=event.srcElement.offsetLeft
    if(x>event.srcElement.offsetLeft+event.srcElement.offsetWidth-offsetWidth)x=event.srcElement.offsetLeft+event.srcElement.offsetWidth-offsetWidth
    style.posLeft=x
  }
}
</script>
<style>
input{border:1px solid #333333;color:#666666;background:#eeeeee;font:normal 12px Tahoma;height:18px}
</style>
<form method="post" action="" enctype="multipart/form-data">
<input id="f_file">&nbsp;<input type="button" onmouseover="fclick(t_file)" value="选择上传文件">
<input name="upload" type="file" style="position:absolute;filter:alpha(opacity=30);width:30px;" id="t_file" onchange="f_file.value=this.value" hidefocus>
<br><input type="submit" value="提交">
</form>
 
<think>我们正在处理一个关于在JavaScript中模拟点击div元素内click事件的问题。根据提供的引用,我们可以总结出几种方法: 1. 使用原生JavaScript:获取元素后调用其click()方法。 2. 使用jQuery:使用$("#id").click()或$("#id").trigger("click")。 注意:引用[2]提到,对于非input/button元素,click方法的支持在同浏览器中有差异,但现代浏览器已经普遍支持。 因此,我们可以提供两种方法:原生JavaScript和jQuery。 另外,引用[3]和[4]提到了动态绑定事件的情况,如果元素是动态添加的,那么我们需要确保事件绑定正确(例如使用jQuery的on方法)。但模拟点击本身并涉及绑定,而是触发已经绑定的事件。 步骤: 1. 获取div元素(或内部需要模拟点击的元素)。 2. 调用click方法(原生)或使用jQueryclick/trigger方法。 示例: 假设我们有一个div,id为"myDiv",并且已经为它绑定了一个click事件处理函数(例如弹出警告框)。 原生JavaScript方法: ```javascript let div = document.getElementById('myDiv'); div.click(); ``` jQuery方法: ```javascript $("#myDiv").click(); // 或者 $("#myDiv").trigger("click"); ``` 如果div内的元素是动态生成的,我们需要确保在模拟点击之前,该元素已经存在于DOM中,并且事件已经绑定(比如通过事件委托或直接绑定)。 根据引用[4],如果是动态内容,绑定事件时应该使用事件委托(例如使用jQuery的on方法)。但是模拟点击的代码在元素存在后执行即可。 因此,我们可以这样写: 例如,在动态添加了一个类为"inner-button"的按钮后,我们想要模拟点击它: ```javascript // 假设我们动态添加了一个按钮 let button = document.createElement('button'); button.className = 'inner-button'; button.textContent = 'Click me'; document.getElementById('myDiv').appendChild(button); // 然后模拟点击(确保在元素添加到DOM后调用) // 原生 button.click(); // jQuery $(button).click(); ``` 但是,如果这个动态元素的事件是通过事件委托绑定的(比如绑定在父元素上),那么模拟点击该元素同样会触发事件,因为事件会冒泡到父元素。 所以,关键点: - 确保元素已经存在于DOM中。 - 确保事件已经绑定(无论是直接绑定还是通过事件委托)。 因此,我们可以给用户提供以下解答:</think>### 如何在 JavaScript 中模拟点击 div 元素内的 click 事件 在 JavaScript 中模拟点击事件有两种主要方式:**原生 JavaScript** 和 **jQuery**。以下是具体实现方法: --- #### 方法 1:原生 JavaScript 直接调用元素的 `click()` 方法: ```javascript // 获取 div 元素 const myDiv = document.getElementById('myDiv'); // 绑定 click 事件(实际场景需先绑定) myDiv.addEventListener('click', () => { alert('Div 被点击了!'); }); // 模拟点击(触发事件) myDiv.click(); // 自动执行点击事件 ``` **说明**: - `getElementById()` 获取目标元素 - `click()` 方法会触发元素上绑定的所有点击事件[^1][^5] - **兼容性**:现代浏览器(Chrome/Firefox/Edge)均支持非按钮元素的 `click()` 方法[^2] --- #### 方法 2:jQuery 实现 使用 `.click()` 或 `.trigger()` 方法: ```javascript // 绑定 click 事件 $("#myDiv").click(() => { alert('Div 被 jQuery 点击!'); }); // 模拟点击(两种等效方式) $("#myDiv").click(); // 方式 1 $("#myDiv").trigger("click"); // 方式 2[^1] ``` **动态元素处理**: 若元素是动态生成的,需通过**事件委托**绑定: ```javascript $(document).on("click", "#dynamicDiv", () => { alert('动态元素被点击!'); }); // 触发动态元素点击 $("#dynamicDiv").click(); [^4] ``` --- #### 注意事项 1. **执行顺序**:需确保元素已存在 DOM 中后再触发事件 2. **事件冒泡**:模拟点击会触发事件冒泡(父元素事件也会触发)[^3] 3. **兼容性**:低版本 IE 需用 `fireEvent()` 替代 `click()` > 示例:点击[此处测试](https://jsfiddle.net/6Lk9qhzo/) > 完整代码见 JSFiddle 链接 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值