2017-05-31 178 views
0

我是jQuery的新手,現在我陷入了一段時間的問題。我試圖發現所有到外部頁面的鏈接,併爲它們添加一個target =「_ blank」屬性。到目前爲止,我已經創建了下面的腳本:動態添加元素添加目標

​​

這正常上加載的頁面上一審的元素,但是當新的元素被動態地添加它不會再次觸發添加目標屬性。我試圖將「就緒」功能更改爲「開啓('加載')」,但沒有成功。

任何幫助非常感謝,我很感激那些花時間回答這些愚蠢問題的人。

編輯: 我創建並通過AJAX調用加載更多元素的無限滾動腳本。這些元素包含「a」標籤,我希望腳本能夠爲他們再次運行。

+1

你是什麼意思的是ADDE元素動態地?你如何添加這些?當文檔準備就緒或加載時,加載和就緒函數都會運行一次,因此您的函數只能運行到第一次加載到DOM的元素。如果以某種方式你可以通過Jquery或JS添加新的鏈接,你需要再次添加屬性空白。從這個意義上來說更明確,我想我可以正確回答。 – DanielPanic

+0

最好的解決方案將是*突變觀察者* https://stackoverflow.com/questions/13277212/mutation-observer-for-creating-new-elements –

回答

1

我想包在一個函數你的鏈接,更改代碼,你可以調用a)onload和b)當你的內容改變時。

$(document).ready(function() { 
    linkChanger(); 
}); 

function linkChanger() { 
    $('a').each(function() { 
     if (location.hostname !== this.hostname) { 
      $(this).attr('target', '_blank'); 
     } 
    }); 
} 

那麼如果以後添加內容/鏈接,你可以調用linkChanger()來檢查/再次轉換你的頁面:

$('#something').click(function() { 
    // code that gets more content, if async provide a callback that calls linkChanger() 
    linkChanger(); 
}); 
+0

我試過「on('load')」,但似乎是在加載元素之前觸發,因爲它不會影響任何「a」標記 – Mipod

+0

我將「on('load')」更改爲「ready」,並在加載新元素後將該函數添加到無限滾動腳本中它的工作。非常感謝 – Mipod

+0

是的,它應該已經'.ready'更新了答案。 – James

1

無論何時添加新元素,您都必須觸發該功能。因爲您是知道何時添加新鏈接的最佳人選,所以您必須以這種方式設置腳本。

function setTargetBlank() { 
    $('a').each(function() { 
    if (location.hostname !== this.hostname) { 
     $(this).attr('target', '_blank'); 
    } 
    }); 
} 

// On load 
$(function() { 
    setTargetBlank(); 
    loadSomeContent(function() { 
    // And after it is loaded, trigger again the function 
    setTargetBlank(); 
    }); 
}); 

如果你無法控制這些,你可以簡單地設置一個計時器,將始終觸發每隔幾秒鐘即功能:

// This is not really good for performance, but it will work 
// It will trigger the function every 3 seconds 
setInterval(setTargetBlank, 3 * 1000); 
0

很可能是因爲您之前的新的針對A鏈接元素已創建,請嘗試在setTimeout函數中運行代碼。例如

$(document).on('load',function() {

setTimeout(function(){ $('a').each(function() { if (location.hostname !== this.hostname) { $(this).attr('target', '_blank');
} }); }, 5000);

});