我想弄清楚我一直有这个奇怪的问题,根本原因是现场点击之间的区别和触发.click()
我不会进入细节问题,但基本上当你点击输入按钮,它工作正常(有一个onclick
事件)。 但是,如果我打电话.click()
从别的地方(而不是物理单击该按钮)它不能正常工作。
我的问题是 - 有没有办法真正复制按钮上的实际点击?
编辑
问题:我打开一个加载PDF内嵌一个新窗口(aspx页面)。 如果我实际上点击链接,打开窗口罚款和PDF负荷。 如果我使用.click()
窗口打开,提示我下载的PDF文件。 我已经通过Adobe阅读器的设置,浏览器设置,以及有关提示注册表设置 - 据我所知,这些都可以因素对大画面,但现在我很担心,为什么鼠标点击。点击的行为( )正在做什么不同的。
我用这个功能来真正模拟鼠标点击:
function clickLink(link) {
var cancelled = false;
if (document.createEvent) {
var event = document.createEvent("MouseEvents");
event.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0,
false, false, false, false,
0, null);
cancelled = !link.dispatchEvent(event);
}
else if (link.fireEvent) {
cancelled = !link.fireEvent("onclick");
}
}
阅读下面的,它讨论了如何绕过这个问题之前,让我来回答更充分为什么你不得不开始与问题:
现代浏览器采取基于之类的东西的鼠标按钮,您点击,无论你持有移位 / 按Ctrl / ALT等环节不同的动作。 作为一个例子,在Chrome中,如果你中间点击一个链接,而不是左键点击后,浏览器会自动在新标签中打开窗口。
当您使用.click()
,jQuery有使有关您点击“办法”的假设-你得到违约行为-而你的情况,是不正确的行为。 你需要指定的“正确”设置的形式浏览器MouseEvents
为了解决该问题的设置。
现在,就来的方式来解决它一个简短的讨论:
当您使用jQuery的.click()
事件不带参数,这实际上不是“伪造点击”有问题的元件。 相反,根据在jQuery文档http://api.jquery.com/click/ :
......当.click()
是不带参数调用,它是.trigger快捷方式(“点击”)
这意味着,当你火$('#div1').click()
-如果在没有实际的jQuery处理'click'
事件,你会得到默认处理。 所以,请考虑以下两种情况:
案例1:
<a id='myLink' href='/some/link/'>Click me!</a>
<script type='text/javascript'>
$('#myLink').click();
</script>
在第一个场景中, .click()
调用不起任何作用,因为没有处理程序。 该事件触发,但并没有什么抓住它,并回应-这样的a
使用标签的默认处理,并且,用户被引导到/some/link/
-因为你没有指定哪一个鼠标按键或任何其它参数-这是真正的默认值。
案例2:
<a id='myLink' href='/some/link/'>Click me!</a>
<script type='text/javascript'>
$('#myLink').bind('click', function (ev) {
ev.preventDefault();
ev.stopPropagation();
alert('you clicked me!');
}).click();
</script>
在这种情况下,因为click
处理程序创建的,当用户点击该链接-在ev.preventDefault()
和ev.stopPropagation()
调用将停止默认从发生的历史处理,并警告将被解雇。
在这一点上,但是,你有一个ev
它代表了对象MouseEvents
-如果你想要的,你可以更改设置。 例如,你可以做到以下几点:
ev.altKey = true; // Held Alt
ev.button = 1; // Middle Mouse Button
这些设置将改变处理事件的默认方法。
另类,非jQuery的解决方案
您也可以通过真正适合下列代码模拟按钮点击。
function fakeClick(event, anchorObj) {
if (anchorObj.click) {
anchorObj.click()
} else if(document.createEvent) {
if(event.target !== anchorObj) {
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
var allowDefault = anchorObj.dispatchEvent(evt);
// you can check allowDefault for false to see if
// any handler called evt.preventDefault().
// Firefox will *not* redirect to anchorObj.href
// for you. However every other browser will.
}
}
}
(对于更全面落实,看原帖在: ?我如何模拟点击一个锚标记 -并期待在选择的答案)
这实际上假的浏览器相信通过从头开始以同样的方式,浏览器的默认处理程序做建筑时,你的鼠标点击的锚/ SPAN /等等 - 但您可以覆盖某些设置。 我不建议这种方法,但是,由于它的很多更容易打破跨浏览器的应用程序,你必须弄清楚所有的参数映射到。
$('img').click(function(event){
console.log(event.hasOwnProperty('originalEvent')); // output : true
});
$('img').trigger("click",function(event){
console.log(event.hasOwnProperty('originalEvent')); // output : false
});
文章来源: Difference between .click() and actually clicking a button? (javascript/jQuery)