2010-07-13 97 views
6

我設計了一個網站,其中一個菜單最初是不可見的。當用戶點擊一個按鈕時,菜單變得可見。有兩種方式供用戶隱藏現在可見的菜單:移動Safari事件問題

  1. 點擊造成的菜單變得可見網頁上
  2. 任意位置單擊該按鈕,是不是菜單

我編寫第二個選項的方式是將onclick事件綁定到窗口元素,並將其與用戶點擊菜單位置的位置進行比較,以確定菜單是否應隱藏。這在Firefox和Safari中非常適用,但在Mobile Safari中失敗。

我注意到,窗口 onclick事件只有當我點擊另一個元素與已分配的onclick事件觸發。如果我點擊一個沒有分配事件的元素,那麼窗口的onclick事件不會觸發。如果我點擊顯示菜單的按鈕,它會與按鈕相關的事件一起觸發。

是否可以將事件分配給移動Safari中的窗口元素?

回答

0

您可以將onclick="void(0);"添加到涵蓋整個頁面的某些<div>,以便無論如何,您總是單擊具有onclick事件的元素。雖然不是一個好的解決方案。我不希望onclick事件與窗口綁定。你爲什麼不創建一個容器<div>,它有這個事件。然後像現在一樣處理它。

7

我已經遇到了同樣的問題。這是對我有用的東西。 (注意:我在Modernizr和jQuery環境下工作)

首先,我使用Modernizr's addTest Plugin API添加一個自定義的Modernizr類來測試iOS,它將相應地添加類appleiosno-appleios

因爲在我的研究中,body似乎是在自己的議程上觸發事件,所以我採取了一些預防措施,將所有文檔的內容用元素包裝在iOS上下文中。然後我添加一個事件處理程序到這個元素。

$(".appleios body").wrapInner('<div id="appleios-helper" />'); 
$("#appleios-helper").bind("mouseup", function(){return;}); 

本文前面提出的建議是使用void(0)。我做了一些快速測試,發現void(0)作爲事件剛剛沒有觸及身體被識別。當我以function(){return;}的形式插入自己的「空」功能時,事情就開始奏效。

這一切都取決於移動Safari中沒有事件觸發的事實,除非該元素顯式地觸發了事件(Safari Web Content Guide。)。通過在包裝器中插入這個空事件,事情會冒泡到正文。

如果你正在做的有沒有這些庫的兩岸的JavaScript,同樣的效果可以在HTML標記

<html> 
... 
<body> 
<div id="appleios-helper" onmouseup="function(){return;}"> 
... 
</div> 
</body> 
</html> 

這個工作對我的文檔的身體的任何部位接觸時,隱藏工具提示來實現。你的旅費可能會改變。

1

簡單地增加虛擬onclick處理程序的HTML 作品對我來說:

<body onclick="void(0)"> 

請注意,我用通常的現場事件處理程序,如下圖所示:

function liveHandler(event) { 
    var target = event.target; ...} 

window.addEventListener(evtype, liveHandler, true); 
// evtype such as 'mousedown' or 'click' 
// we use the capturing mode here (third parameter true) 
1

這是一個這是一個老問題,但我今天在同樣的事情上掙扎。

我發現使用touchstart事件起作用。

我解決了它這樣的:

var isTouchDevice = 'ontouchstart' in document.documentElement; 
if (isTouchDevice) { 
    // Do touch related stuff 
    $(document).on('touchstart', function (event) { 
    // Do stuff 
    }); 
} else { 
    // Do non-touch related stuff 
    $(document).on('click', function() { 
    // Do stuff 
    }); 
} 
0

你還可以:

$('body').css('cursor', 'pointer'); 

不知道那些 「工程師」 在蘋果公司正在做的。大聲笑。

雖然這有問題。你不想在每個觸摸設備上都這樣做。只觸摸沒有定點設備的設備(例如,帶有觸摸屏的筆記本電腦)。

來源:http://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html

文章的結論是這樣的:

所以我不明白爲什麼這一切是這樣,但它肯定是這樣。如果遇到冒泡問題,只需在body和元素之間的任意位置添加一個空函數事件處理函數,然後就可以開始了。但它不應該是必要的。