为什么没有消耗活动?

时间:2016-12-12 16:35:18

标签: javascript events click

我有一个带有菜单+子菜单的网页,其中包含一堆<a>个锚点。单击任何这些锚点时,将在iframe中打开一个页面。它工作正常,但在移动浏览器中,子菜单即使在单击后仍保持打开状态,因此事件不会被“消耗”。为什么呢?

我用以下方法做到这一点。首先,我设置了onclick函数:

var anchors = MyMethodGetElementByClassName('loadt');
for(var i = 0; i < anchors.length; i++) {
 anchors[i].onclick = function(e) {
  loadthis(e,this.href);
 }
}

在方法loadthis中,我这样做:

function loadthis(e,pg)
 var evt = e || window.event;
 if (evt != 88 && evt !== "null") {
  evt.preventDefault();
 }
 frame.src = pg;
 $('html').trigger('click');
 return false;
}

loadthis的最后两行是通过触发文档中的单击并返回false来尝试使用该事件。然而,子菜单仍然开放。

在智能手机中查看here(例如,点击“Software&gt; Ave”)。

1 个答案:

答案 0 :(得分:1)

您的处理程序未返回任何值。它调用的函数(loadthis)是,但事实并非如此。 (但继续阅读。)

要让处理程序返回值,请返回调用loadthis的结果:

var anchors = MyMethodGetElementByClassName('loadt');
for(var i = 0; i < anchors.length; i++) {
 anchors[i].onclick = function(e) {
  return loadthis(e,this.href);
//^^^^^^^
 }
}

此外,您似乎支持旧浏览器。如果是这样,你需要在你的preventDefault电话上放一个警卫(虽然你实际上并不需要它;你联系事件的方式,return false就足够了; {{3 }})。 E.g:

function loadthis(e,pg)
 var evt = e || window.event;
 if (evt != 88 && evt !== "null" && evt.preventDefault) {
// -----------------------------^^^^^^^^^^^^^^^^^^^^^^
  evt.preventDefault();
 }
 frame.src = pg;
 $('html').trigger('click');
 return false;
}

最后:evt始终为!= 88,并始终为!== "null",因此您可以并且可能应删除这些内容。

但是,您似乎正在使用jQuery,来自$('html').trigger('click');行。如果是这样,这一切都可以明显简化:

$(".loadt").on("click", function() {
    $('html').trigger('click');
    return false;
});

...因为无论如何evt != 88 && evt !== "null"总是真的......这也会阻止传播(而不仅仅是阻止默认),这可能会有所帮助。