2012-03-28 40 views
1

我想選擇所有內部鏈接,這些鏈接位於我的文檔中,但不包括位於特殊div中的鏈接。jQuery - 無法過濾div的鏈接

以下所示爲我的網站佈局的例子:

<div id="toppanel"> 
    <a href="test.php">Test</a> 
</div> 
<div id="page"> 
    <div id="content"></div> 
    <div id="menu"> 
     <a href="menu1.php">Menu1<a> 
     <a href="menu2.php">Menu2<a> 
    </div> 
</div> 
<div id="footer"> 
    <ul> 
     <li><a href="index.php">Startseite</a></li> 
     <li class="sep">|</li> 
     <li>Datenschutz</li> 
     <li class="sep">|</li> 
     <li>Impressum</li> 
    </ul> 
</div> 

我的jQuery代碼如下:

$("a[target!='_blank']").not('#toppanel').live("click", function(event) { 
    event.preventDefault(); 

    var href = $(this).attr('href'); 
    $.get(href, function(data) { 
     $('#content').html(data); 
    }); 
}); 

的問題是,這種沒有任何鏈接的正常工作。如果我使用沒有使用not()語句的jQuery代碼,所有工作正常的鏈接,但也是#toppanel-div中的一個,我想阻止它,因爲這些鏈接以另一種方式使用。

回答

1

嘗試查看點擊的父元素,看它是否是#toppanel孩子:

$("a[target!='_blank']").live("click", function(event) { 
    if (!$(this).closest("#toppanel").length) { 
     event.preventDefault(); 

     var href = $(this).attr('href'); 
     $.get(href, function(data) { 
      $('#content').html(data); 
     }); 
    } 
}); 

Example fiddle

+0

不錯的解決方案有一點缺陷:event.preventDefault()會有效地取消事件。因此,'#toppanel'內部的鏈接根本不起作用(不管你是否返回true來讓事件冒泡,它已經被取消)。 – vzwick 2012-03-28 09:07:18

+0

謝謝,好點 - 修正。 – 2012-03-28 09:09:23

+2

從jQuery 1.7開始,建議不要使用live,因爲它已被棄用,並且會在下一個版本中刪除。相反,你應該使用'$( '身體')上( '點擊', '一[TARGET = 「_空白」!]',函數(E){...});' – iMoses 2012-03-28 09:14:53

2

可能與此有關:

不支持鏈接方法。例如,$(「a」)。find(「。offsite,.external」)。live(...);無效並且不按預期工作。

從這裏:

http://api.jquery.com/live/

它可能是值得使用的新事件連接方法之一。

+0

尼斯指針 - 感謝你使我今天學到新的東西! – vzwick 2012-03-28 09:28:20

1

你的意思是:


$("a").live("click", function(event) { 
    event.preventDefault(); 
    if($(this).parent("div").attr("id") != "toppanel") { 
     var href = $(this).attr('href'); 
     $.get(href, function(data) { 
     $('#content').html(data); 
     }); 
    } 
}); 

+0

只有當鏈接是'#toppanel'的直接子節點時才能工作 - 更好地使用'nearest()','parentsUntil()'或類似的東西。 – vzwick 2012-03-28 09:05:46

2

下面就來構建你要找的選擇的一種方式 - working jsfiddle here

$my_elements = $("a[target!='_blank']") 
    .not(function(){ return !$(this).closest('#toppanel').length }); 

你的整個片段是這樣的:

$("a[target!='_blank']") 
.not(function(){ return !$(this).closest('#toppanel').length }) 
.live("click", function(event) { 
    event.preventDefault(); 

    var href = $(this).attr('href'); 
    $.get(href, function(data) { 
     $('#content').html(data); 
    }); 
}); 

另外,由於Evert mentio ned,live()不支持鏈接正確。您應該使用on()或者,如果您使用的是jQuery < 1。7,delegate()附上您的活動:

$("a[target!='_blank']") 
.not(function(){ return !$(this).closest('#toppanel').length }) 
.on("click", function(event) { 
    event.preventDefault(); 

    var href = $(this).attr('href'); 
    $.get(href, function(data) { 
     $('#content').html(data); 
    }); 
}); 

另一種解決方案,甚至是一個更優雅的一個,將過濾<div>!而非將<a> S的:

$('a[target!="_blank"]', 'div:not("#toppanel")').on('click', function(event){ /* ... */ }); 

同,利用selector自變量on()

$('div').not('#toppanel').on('click', 'a[target!="_blank"]', function(event){ /* ... */ }); 

編輯:取代closest()parentsUntil()由於性能方面的原因 - 看到jsperf test comparison

+0

我使用你的第二個解決方案,因爲這是我的初步嘗試,但我不知道有這件事:沒有;) – 2012-03-28 09:35:46

+0

嗯,你的解決方案似乎是一個我一直在爲鎖定,但它不能正常工作。如果我使用解決方案Rory McCrossan,所有工作。似乎.not()功能不會過濾鏈接。 – 2012-03-28 11:10:56

+0

@Develman我的解決方案是在jsfiddle中工作 - 我懷疑'live()'是責任;比照Evert的帖子。 – vzwick 2012-03-28 17:51:56