我修改了代碼,check it out here。我相信這是你需要的,或者至少非常接近它,你應該能夠根據你的需求量身定製它。
爲了理解發生了什麼,首先您需要了解事件冒泡(或傳播)如何工作。我們使用的是jQuery,所以我只會解釋jQuery如何處理它(幾乎與大多數瀏覽器做的一樣)。
當某個事件發生在某個元素上時,該事件處理程序將被調用以用於該特定事件。但是(!)這個事件也會'冒泡'DOM樹並且執行附加到它發現的元素上的所有事件處理程序。例如fiddle here:
<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,點擊事件被稱爲,你會得到一個警告說「在中間人」。但是事件冒泡到外部div,並且發現附加到該外部div的點擊事件,所以另一個警告「外部」也會彈出。如果你點擊外面的那個,只有「外面」會被喊出來,而當點擊內部時,所有三個都會被警告。
現在回到你的問題。我之前給出的代碼(在this fiddle中)的問題在於,對於這個原則,它沒有很好地處理。現在採取的新小提琴看看上面的代碼,看看下面幾行:
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應該是零),或者如果目標本身擁有那個類。爲什麼?如果你點擊某個類別的「不要去家裏」的div,它的父母之一可能會執行事件處理程序。我們現在已經解決了這個問題。
唯一需要注意的是選擇器中的小snipper :not(.homepage)
。這將確保該事件附加到每個身體元素(其中只有一個),該類別不屬於homepage
。因此,在您的主頁上,請確保您的身體標記如下所示:<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/
只是不要在索引頁中包含腳本。 –
你應該使用'$('body')'而不是'$(body)'(否則'body'被解釋爲變量 – giorgio
你知道你的域名的www。版本不起作用嗎?) – giorgio