2013-05-02 108 views
0

我訪問與jQuery的一個網頁鏈接,用下面的代碼:無法更改href屬性與jQuery

$('a[href]').each(function() { 
    $(this).attr('class', 'visited'); 
    $(this).attr('href', '#'); 
}) 

鏈接的類將被改變,但在href不會。有什麼阻止我改變/改變href嗎?

編輯:

我的代碼更新到以下幾點:

$('a[href]').each(function() { 
     $(this).addClass('visited'); 
     this.href = '#'; 
     }) 

然而,儘管它適用於大多數網站,這是行不通的news.yahoo.com。任何原因爲何如此?

+3

似乎爲我工作:http://jsfiddle.net/PbC8y/ – 2013-05-02 18:35:20

+0

這個腳本里大多數網站上的工作:但是,例如,它似乎並沒有在http工作://新聞。 yahoo.com/。我使用每個@PSCoder的更新代碼: this.href =「#」 – user2344345 2013-05-02 19:10:45

+0

您是否試圖通過iframe訪問news.yahoo.com元素?這不應該工作 – 2013-05-02 19:36:09

回答

3

對於href,您可能需要使用.prop()而不是.attr()

對於類名,在大多數情況下,您希望使用.addClass()而不是覆蓋整個類屬性。

+1

爲什麼使用'.prop()'?這不是用戶通常像「checked」或「selected」那樣改變的東西。 '.attr()'在這種情況下使用是完全正確的。 – Blazemonger 2013-05-02 18:48:32

+0

@Blazemonger - 我認爲你是對的 - 我立場糾正。那麼,說'.prop()'還是'.attr()'對於這個用法同樣有效呢? (其實我很喜歡PSCoder的答案中的直接DOM屬性參考。) – 2013-05-02 19:04:03

+0

可以在不更改DOM的情況下更改複選框輸入的checked狀態,只需單擊複選框即可。在這種情況下,'.prop()'是正確的方法。然而,以某種方式直接修改DOM來改變錨的'href'是不可能的,所以'.attr()'是合適的方法。 – Blazemonger 2013-05-03 13:30:05

3

你並不需要使用jquery包裝過this做到這一點: - 你可以只訪問href作爲財產this本身,因爲它代表的DOM元素。

$('a[href]').each(function() { 
... 
    this.href ="#"; 
}) 
+1

但是$本身就是jQuery,並且每個都是jQuery的成員函數;) – OliverK 2013-05-02 18:40:49

+1

他的意思是你不需要使用jQuery設置'href'的代碼行;直接的DOM參考很容易或更容易使用。當然,你仍然在使用jQuery來處理代碼的其他部分。 – 2013-05-02 18:47:39

+0

@MichaelGeary感謝您向OlikerK澄清。我編輯了我的答案,使其更加清晰。 :) – PSL 2013-05-02 18:58:57