2012-07-26 99 views
1

JQuery + HTML + CSSJQuery/HTML鏈接不加載第一次點擊

我想獲得導航欄上的鏈接來更新我有一個「div」標記。我得到了它的工作,但我必須點擊每個超鏈接兩次,然後在主瀏覽器上加載頁面。爲什麼?只需點擊一次,我如何加載它?

test.js:

function onScreen(id){ 
    $("a#" + id).click(function(){$("div#viewer").load(id + '.html')}); 
} 

main.html中:

<a href="#" id="about" onclick="onScreen('about')">About Us</a> 
<a href="#" id="account" onclick="onScreen('account')">My Account</a> 

<div class ="article" id="viewer"> 
    <p>welcome to this awesome site! </div> 

有一個 「about.html」 文件(以及其他所有必需的文件)在同一個文件夾中。再次,代碼的功能,只是不像它應該的。

回答

5

第一次點擊執行onScreen,它將加載函數關聯到click事件。 加載功能因此在您第二次點擊時觸發。

編輯

一個解決辦法是,以消除你的<a href=#>標籤

$(function(){ 
    $("a[href='#']").click(function(){$("div#viewer").load(this.id + '.html')}); 
}) 
+0

是 - 這非常精確說明問題。那麼解決方案呢? :) – Lix 2012-07-26 22:09:16

+1

的確,我只回答了第一部分的問題,編輯 – 2012-07-26 22:17:36

+0

謝謝!今天我會嘗試一下! – Jeff 2012-07-27 15:26:38

2

更改屏幕到

function onScreen(id){ 
    $("div#viewer").load(id + '.html'); 
} 

說明:

什麼你沒有之前click事件附加到鏈接時點擊。這意味着,當您第一次點擊時,它會啓用鏈接加載您的內容以進行下一次點擊,因此只能在第二次點擊。

2

onclick屬性你只是有一些多餘的代碼存在。您附加了兩個點擊事件。

  1. 內嵌在onClick屬性的標記中。
  2. onScreen()函數中帶有.click()

只有在您單擊鏈接後,纔會創建實際的.click()處理程序。所以你必須點擊一次來創建一個處理程序,然後第二次點擊會觸發回調函數。

您可以刪除.click(),並將代碼保留在該函數中。所以,你的onScreen()功能應該是這樣的 -

function onScreen(id){ 
    $("div#viewer").load(id + '.html'); 
} 

您還可以通過使用此語法,而不是提高代碼 -

$('a.internalLink').on('click',function(
    $("div#viewer").load($(this).id + '.html'); 
)); 

這是假設你給你的所有<a>標記你想要像這樣的行爲屬性internalLink。它更容易給類似的元素相同的類名,以便您可以輕鬆地將它們與jQuery選擇器進行分組。

較新的.on() function因爲jQuery的1.7+

+0

非常感謝。我今天晚些時候測試後會接受! – Jeff 2012-07-27 15:18:24

1

看到的是優選的,因爲你正在使用jQuery,溝在線onclick並綁定來代替。這使得你的代碼更清晰,並且更容易理解&修改。

<a href="#" id="about" class="viewer">About Us</a> 
<a href="#" id="account" class="viewer">My Account</a> 
<div class ="article" id="viewer"> 
    <p>welcome to this awesome site!</p> 
</div> 
​<script> 
$(function(){ 
    $("a.viewer").click(function(){ 
     alert($(this).attr('id') + '.html'); 
     $("div#viewer").load(this.id + '.html') 
    }); 
})​; 
</script> 

Working JSFiddle

+1

在你的小提琴例子中,你使用jQuery 1.7 - 爲什麼不移動到'.on()'函數? – Lix 2012-07-26 22:07:14

+0

也缺少分號... – Lix 2012-07-26 22:14:13

+0

@Lix re:'on'你是對的。 re:分號,這裏不需要。 http://mislav.uniqpath.com/2010/05/semicolons/ – 2012-07-26 23:24:47

0

嘗試

$(document).ready(function(){ 
    $("a").click(function(){ 
    $("div#viewer").load(this.id + '.html') 
    }); 
}); 
2

嗯......首先,這是不是最好的解決方案。一個更好的解決辦法是:

<a href="about.html" class="scriptable" id="about">About Us</a> 
<a href="account.html" class="scriptable" id="account">My Account</a> 

$(document).ready(function(){ 
    function displayScreen(screenname){ 
     var url_to_load = screenname + '.html'; 
     $('#viewer').load(url_to_load); 

    } 
    $('.scriptable').live("click", function(ev){ 
     var screenname = $(this).attr('id'); 
     displayScreen(screenname); 
     ev.preventDefault(); 
    }); 
}); 

Facebook並類似的解決方案,儘管他們使用rel =「ajaxify」屬性做到這一點,但原理是一樣的。

(下一步:使用某種歷史的API,使網址遵循用戶導航)

+0

任何關於特定歷史API的推薦? – Jeff 2012-07-27 20:51:41

+0

https://github.com/balupton/History.js/ - 對不起,有一些奧運比賽的儀式正在進行中:) – Aadaam 2012-07-28 01:45:58

相關問題