我已经修改了代码,在这里查看。我相信这就是您所需要的,或者至少非常接近它,您应该能够根据您的需要对其进行定制。
要了解发生了什么,首先您需要了解事件冒泡(或传播)是如何工作的。我们使用的是 jQuery,所以我只会解释 jQuery 是如何处理它的(顺便说一句,它几乎与大多数浏览器一样)。
当某个元素上发生事件时,将为该特定事件调用事件处理程序。但是(!)该事件还会“冒泡”DOM 树并执行附加到它在途中找到的元素的所有事件处理程序。示例小提琴在这里:
<div class="outer">
<div class="in-the-middle">
<div class="inner">
</div>
</div>
</div>
<script type="text/javascript">
$('div').on('click', function(e) {
alert($(this).attr('class');
});
</script>
现在,如果你点击中间的 div,点击事件就会被调用,你会得到一个提示“in-the-middle”的提示。但是该事件会冒泡到外部 div,并找到一个附加到该事件的点击事件,因此也会弹出另一个警告说“外部”。如果点击外层,只会喊出“外层”,点击内层时,三个都会被提醒。
现在回到你的问题。我之前给出的代码(在这个小提琴中)的问题是它没有很好地处理这个原则。现在看看上面新小提琴中的代码,看看以下几行:
var target = $(e.target);
var find = target.parents('.do-not-go-to-home');
if(!target.hasClass('do-not-go-to-home') && find.length <= 0) {
...
}
在您看到的第一行e.target
中。变量e
只是事件,传递给事件处理程序。目标是事件第一次发生或触发事件的 DOM 元素。现在我正在做的是一直遍历到文档本身(从目标到它的父级,到它的父级,等等,将正文传递给文档)。当一路上找到一个具有类 '.do-not-go-to-gome' 的元素时,它会存储在 find 参数中。
现在在 if 子句中,您可以检查是否在找到此类的过程中(find.length 应该为零),或者目标本身是否具有该类。为什么?如果您单击某个具有“do-not-go-to-home”类的 div,它的父母之一可能正在执行事件处理程序。我们现在已经解决了这个问题。
唯一需要注意的是:not(.homepage)
选择器中的小狙击手。这将确保事件附加到每个不属于 class 的homepage
body 元素(其中只有一个) 。所以在你的主页上,确保你的 body 标签看起来像这样<body class="homepage">
:将主页与任何其他页面区分开来的其他方法当然也是可能的。
玩得开心!
原始答案
好吧,只需将点击事件附加到正文。并添加一个类或做其他事情来确定它是否是主页。做类似的事情:
$('body').on('click', function(e) {
e.preventDefault();
if(!$(this).hasClass('homepage')) {
window.location.href = 'http://myhomepage.com';
}
} );
编辑
啊哈!你的问题只是有点扩展。所以你希望用户点击任何地方回家,除了某些 div(例如你的图像)。在这种情况下,只需添加一个过滤器。
<div class="do-not-go-home">content</div>
$('body').on('click', 'div:not(.do-not-go-home)', function(){});
在这里查看小提琴:http: //jsfiddle.net/KKY4T/1/