2010-07-10 88 views
72

假設我們將.click()處理程序附加到$(document).ready回調中的錨點(<a>)標記。此處理程序將取消默認操作(在href之後)並顯示警報。

我想知道的是回調的執行時間,用戶是否可以點擊錨點(文檔已顯示在瀏覽器中),但事件尚未附加。

以下是包含錨的不同HTML頁面,但包含腳本的順序不同。它們之間有什麼區別(如果有的話)?不同的瀏覽器會有不同的表現嗎?

第1頁:

<html> 
<head> 
    <title>Test 1</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> 
    <script type="text/javascript"> 
    $(function() { 
     $('a').click(function() { 
      alert('overriding the default action'); 
      return false; 
     }); 
    }); 
    </script> 
</head> 
<body> 
    <a href="http://www.google.com">Test</a> 
</body> 
</html> 

第2頁:

<html> 
<head> 
    <title>Test 1</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> 
</head> 
<body> 
    <a href="http://www.google.com">Test</a> 
    <script type="text/javascript"> 
    $(function() { 
     $('a').click(function() { 
      alert('overriding the default action'); 
      return false; 
     }); 
    }); 
    </script> 
</body> 
</html> 

第3頁:

<html> 
<head> 
    <title>Test 1</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 
<body> 
    <a href="http://www.google.com">Test</a> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> 
    <script type="text/javascript"> 
    $(function() { 
     $('a').click(function() { 
      alert('overriding the default action'); 
      return false; 
     }); 
    }); 
    </script> 
</body> 
</html> 

所以是有可能,用戶會獲得通過點擊錨和從未重定向到href看到警報(當然忽略javascript的情況)?這可能發生在我提供的任何示例中嗎?

我需要的只是確保click事件處理程序已附加到錨之前用戶有任何可能性點擊此錨點。我知道我可以提供一個空的href,然後在JavaScript中逐步增強它,但這是一個更普遍的問題。

如果HTML由服務器快速生成,但jQuery庫需要時間從遠端服務器獲取,會發生什麼情況?這會影響我的情況嗎?與加載DOM相比,包含腳本的順序是什麼?他們可以同時完成嗎?

回答

59

示例3 將有最高機會的用戶能夠點擊鏈接而不需要處理程序已經附加了自己。由於您在之後加載了jQuery庫,因此如果Google的服務器速度較慢(或DNS查找需要一秒左右),或者用戶計算機處理jQuery的速度較慢,則鏈接將不會顯示當用戶嘗試點擊它時,附加的點擊處理程序。

這可能發生的另一種情況是,如果您有一個非常大或緩慢的加載頁面,並且此鏈接位於頂部。然後當部分可見時,DOM可能沒有完全準備好。如果你正在運行到這樣的問題,最安全的做的是:在head

  1. 負荷的jQuery(例如1或2)
  2. <a>元素之後立即裝上單擊事件,但不在DOMReady回調中。這樣它將被立即調用,不會等待文檔的其餘部分。

一旦元素被渲染,它可以從DOM抓住,隨後jQuery的可以訪問它:

<a href="http://www.google.com">Test</a> 
<script type="text/javascript> 
    // No (document).ready is needed. The element is availible 
    $('a').click(function() { 
     alert('overriding the default action'); 
     return false; 
    }); 
</script> 

此外,建築上user384915的評論,如果動作是完全依賴於JavaScript,然後甚至不使其作爲HTML的一部分,將其添加後jQuery的準備:

<script type="text/javascript"> 
jQuery(function($){ 
    $("<a />", { 
     style: "cursor: pointer", 
     click: function() { 
     alert('overriding the default action'); 
     return false; 
     }, 
     text: "Test" 
    }).prependTo("body"); 
}); 
</script> 
15

正是當執行$(文件)。就緒 回調你有幾個不同的問題在這裏

只要DOM完全加載,它就會執行。不是當一切(如圖像)完成下載像.load()那樣。這是(一般)之前,基本上是當它自己建立的頁面。

我想知道是什麼時候當點擊 正好回調將執行

有可能是用戶點擊 的錨(該文件已經在瀏覽器中顯示 ),但該事件 尚未連接。

是的,這是可能的。但將它放入.ready()會給你最好的機會。只有兩種方法可以做到「更確定」,而不是。這些實際上是在自己的鏈接上使用'onclick',並將javascript直接放在鏈接之後(而不是放在.ready()中),以便在鏈接創建後立即執行。

此外,您提供的2個代碼示例的工作方式之間沒有區別。但是,在第二個中,您不需要將代碼放在.ready()中,因爲它存在於鏈接之後,它將始終在鏈接創建後執行。如果你從.ready()中刪除它,它將是我上面描述的兩種方法中的第一種。

另外,不要把'返回false'在你的回調中,最好使用.preventDefault()和.stopPropagation(),這樣可以讓你指定是否想阻止默認動作或者停止冒泡事件,或者兩者兼有。

+0

所以你說的唯一方法來實現我正在尋找的東西(保證用戶在重定向之前看到警報)是使用'onclick'或者在鏈接之後附加'click'處理程序(不使用'$(document).ready')? – 2010-07-10 18:07:33

+0

這些示例根據是否啓用輸出緩衝或使用分塊編碼而有所不同。 – galambalazs 2010-07-10 18:08:56

+0

假設啓用緩衝,這三個例子中的哪一個最適合我的目標?分塊編碼呢? – 2010-07-10 18:11:50

2

這取決於很多事情。例如,如果您有分塊編碼,那麼用戶可能會得到一個塊,但是由於文檔尚未準備好,偵聽器將不會被連接。

jQuery的ready事件是DOMContentLoaded事件在W3C標準的瀏覽器(在HTML5規範標準化),以及一些替代這個在別人(如在readyState的IE)。

DOMContentLoaded(MDC)

文檔的解析當在頁面的文檔對象 燃燒是 結束。在此事件 觸發時,頁面的DOM已準備就緒。

因爲這使得它會是一個堅實的假設,即該事件後執行的回調將能夠防止未就緒頁面上的用戶交互之前發生。

但正如Peter Michaux在his article中指出的那樣,由於瀏覽器實現此事件的差異「在四大瀏覽器中,早期活躍的強大技術是不可能的」。

所以我會說,你不能在jQuery的ready事件100%依靠,但大部分時間它會工作就好了。

0

肯定有可能「欺騙」警報警告(即使Javascript已啓用)。嘗試在url字段中拖動鏈接,您將看到它將在沒有該警告的情況下執行。如果鏈接觸發了刪除操作,這尤其成問題。

關於document.ready回調 - 我也有這樣的問題。讓我解釋。我們正在做一個項目,其中所有表單都以彈出窗口顯示(jQuery窗口)。所以當彈出窗口被關閉時(現在)頁面被重新加載,並且當我被重定向到另一個屏幕而不是打開一個新的彈出窗口時,我遇到了情況。

完全同意user384915關於將javascript直接放在onClick事件上,或者甚至更好地放到href標記中。

1

你的第三個例子爲用戶提供了集團公司的最大機會國王沒有覆蓋處理程序已被連接。瀏覽器在下一步之前通常會下載並解析每個<script>。您從外部來源(Google)獲取jQuery - 雖然可能可靠,但可能無法使用或加載速度較慢。在文檔<body>的末尾有兩個<script>塊,因此在處理最後兩個腳本時,頁面的以前區域可能已經被下載並渲染到屏幕。雖然這種方法主張向用戶呈現響應式頁面加載體驗,但他們可以在這個不確定時期點擊,當然,覆蓋處理程序還沒有被附加。

在腳本和加載順序here上有一篇有趣的YUI博客文章。

相關問題