。点击()和实际点击一个按钮之间的区别是什么? (JavaScript的/ jQuery的)(D

2019-06-25 15:29发布

我想弄清楚我一直有这个奇怪的问题,根本原因是现场点击之间区别和触发.click()

我不会进入细节问题,但基本上当你点击输入按钮,它工作正常(有一个onclick事件)。 但是,如果我打电话.click()从别的地方(而不是物理单击该按钮)它不能正常工作。

我的问题是 - 有没有办法真正复制按钮上的实际点击?


编辑

问题:我打开一个加载PDF内嵌一个新窗口(aspx页面)。 如果我实际上点击链接,打开窗口罚款和PDF负荷。 如果我使用.click()窗口打开,提示我下载的PDF文件。 我已经通过Adobe阅读器的设置,浏览器设置,以及有关提示注册表设置 - 据我所知,这些都可以因素对大画面,但现在我很担心,为什么鼠标点击。点击的行为( )正在做什么不同的。

Answer 1:

我用这个功能来真正模拟鼠标点击:

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");
    }
}


Answer 2:

阅读下面的,它讨论了如何绕过这个问题之前,让我来回答更充分为什么你不得不开始与问题:

现代浏览器采取基于之类的东西的鼠标按钮,您点击,无论你持有移位 / 按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 /等等 - 但您可以覆盖某些设置。 我不建议这种方法,但是,由于它的很多更容易打破跨浏览器的应用程序,你必须弄清楚所有的参数映射到。



Answer 3:

  $('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)