`
jkfzero
  • 浏览: 102821 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

原帖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>
 
分享到:
评论

相关推荐

    使用jquery模拟a标签的click事件无法实现跳转的解决

    问题描述 最近在使用jquery模拟a标签的click事件,无法触发其默认行为。...jquery内部实现click或trigger方法时,并未真正模拟用户点击事件,只是模拟了事件对象及冒泡的触发。(最后附有jquery实现源

    jQuery中值得注意的trigger方法浅析

    介绍 trigger方法的功能是在所选择的元素上触发指定...在jquery中可以使用trigger完成。 $(#btn).trigger(click)//触发id为btn的click事件 $(#btn).click()//简写 触发自定义事件 trigger不仅能触发浏览器支持的这些

    jQuery详细教程

    jQuery详细教程,讲解很透彻, 一. jQuery 语法实例 $(this).hide() 演示 jQuery hide() 函数,隐藏当前的 HTML 元素。 $("#test").hide() 演示 jQuery hide() 函数,隐藏 id="test" 的元素。 $("p").hide() ...

    Jquery 模拟用户点击超链接或者按钮的方法

    代码如下: //Jquery 模拟用户点击超链接或者按钮 $(“#a”).trigger(“click”);

    jQuery中trigger()与bind()用法分析

    本文实例讲述了jQuery中 trigger()与bind()用法。分享给大家供大家参考,具体如下: trigger(type) 在每一个匹配的元素上触发某类事件。 返回值:jQuery 参数: type (String): 要触发的事件类型 示例: 复制代码 代码...

    jQuery 1.4.1 中文参考

    8.2.3 trigger(type, [data]) 123 8.2.4 triggerHandler(type, [data]) 124 8.2.5 unbind([type], [fn]) 125 8.3 事件委派 127 8.3.1 live(type, [data], fn) 127 8.3.2 die([type], [fn]) 130 8.4 事件切换 131 ...

    jQuery[1].Switchable-1.0.rar_Trigger Effect_switchable

    jQuery.Switchable是一款整合了Tabs、Slide、Scrollable等常见UI组件的jQuery插件。它有简单易用的API、可灵活配置的Configuration,支持自定义Effect,支持自主开发Plugin。  几个亮点:  在当前 trigger 中 ...

    jquery trigger伪造a标签的click事件取代window.open方法

    主要介绍了使用jquery trigger 触发a标签的click事件取代window.open方法,需要的朋友可以参考下

    jquery中trigger()无法触发hover事件的解决方法

    今天做一个项目,遇到了一个问题,是以前没有遇到过的,就此记上一笔。 1、trigger方法解释 官方是这么解释的: 代码如下: Description: Execute all handlers and behaviors attached ...$('#foo').bind('click', f

    jQuery select下拉框单选和多选插件.zip

    js代码 [removed][removed] [removed] ... $('a.search-choice-close[data-option-array-index="' $(this).data('option-array-index') '"]').trigger('click'); }); } }); [removed]

    基于jquery trigger函数无法触发a标签的两种解决方法

    起因:点击icon图标后要触发a标签的链接转跳动作,但是用 JQ 的 $(‘#a’).trigger(‘click’) 居然不起作用,遂百度之,总结两种方法如下: (原因:JQ 的 trigger() 方法确实无法触发 a 标签的转跳动作。) 1:JQ ...

    jquery需要的所有js文件

    jquery需要的所有js文件 /*! * jQuery UI 1.8.18 * * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * ...

    jQuery 1.5 API 中文版

    IE用户无法在线查看本文档,请下载jQuery API Version1.5 中文版AIR客户端查看,或者使用chrome,safari,firefox,opera等浏览器查看!!! jQuery 1.5 API Cheat Sheet来源 Selectors Basics #id element .class, ...

    jQuery 1.3 API 参考文档中文版 html

    * trigger 进一步说明 2009-01-17 22:37:11 +0800 * live() - 与bind()不同的是,live()一次只能绑定一个事件。 * [attribute!=value] jQuery 1.3中意义改变 * load 的data参数在jQuery 1.3中也可以接受String + ...

    jQuery第一次运行页面默认触发点击事件的实例

    //默认第一个点击(例如UL的LI有多个可以点击的用于默认点击第一个用) 注意: 要放在函数外面, 不然不起效果的 以上这篇jQuery第一次运行页面默认触发点击事件的实例就是小编分享给大家的全部内容了,希望能给大家一...

    JQuery自动触发事件的方法

    在JQuery中,可以使用trigger()方法完成模拟操作。例如可以使用下面的代码来触发id为btn的按钮的click事件。 $(‘#btn’).trigger(“click”); 这样,当页面加载完毕后,就会立刻输出想要的效果。也可以直接简写...

    jquery翻书效果

    prev: $bttn_prev, // selector for element to use as click trigger for previous page menu: null, // selector for element to use as the menu area, required for 'pageSelector' pageSelector: false, // ...

    jQuery滑动门切换标签插件,多款tab选项卡效果.rar

    基于JQuery的一款滑动切换插件,就是大家熟悉的滑动门和选项卡,也称为Tab标签,不过本插件内含有多款标签,有的带有动画效果,带有注释,不熟悉网页的也可轻松上手。一些代码注释: * defaultIndex - 默认选中的...

    JavaScript 模拟用户单击事件

    一开始,我想到了用jQuery的click()事件来触发超链接的单击事件(与trigger(“click”)一样的效果)。结果发现不如人意。 实例如下: 效果图 IE: FireFox: 代码如下: 请单击”Click Me”。测试提交按钮与超链接是否...

Global site tag (gtag.js) - Google Analytics