2016-03-16 86 views
0
var i =1; 
function waitForElClass(data){ 
    var element = data.selected; 
    var index = data.index; 

    var findEl = document.getElementsByClassName(element)[index]; 
    console.log(i); 
    i++; 
    window.setTimeout(function(){ 
    if(!$(findEl).length){ 
     waitForElClass(data); 
    }else{ 
     console.log(findEl); 
     return findEl; 
    } 
    },500) 
} 

我試圖獲得一個元素(有時候帶有和ID,類或者一組類元素中的一個,這個例子是後者的)正在用JS加載到一個頁面上,這意味着我需要每隔幾毫秒就要等一下。等到元素存在,循環,然後存儲在變量中

我想那麼它存儲在一個變量,與

var data = {selected: 'new', index: 0}; 
var elem = waitForElClass(data); 

,它的發現元素,打印出來,而不是將其存儲在elem。有任何想法嗎?謝謝!

+0

嘗試從'elem'的聲明中去除'var'。這樣它應該是一個全局實例 –

+0

你的'setTimeOut'中的'return'語句是從匿名函數內部返回的。你的外部函數在第一次運行之前完成,因爲它可能不需要'500ms'並且返回null。研究這種行爲的承諾。 – CollinD

+0

這個元素是動態創建的? –

回答

1

當您執行異步任務時,我建議修改您的代碼以接受回調或返回承諾。這裏是一個回調修正:

var i =1; 
function waitForElClass(data, cb){ 
    var element = data.selected; 
    var index = data.index; 

    var findEl = document.getElementsByClassName(element)[index]; 
    console.log(i); 
    i++; 
    var to = window.setInterval(function(){ 
    if($(findEl).length){ 
     console.log(findEl); 
     cb(findEl); 
     window.clearInterval(to); 
    } 
    },500) 
} 

它可以被用來作爲如下:

var data = {selected: 'new', index: 0}; 
var element; 
waitForElClass(data, function(el) { 
    element = el; 
    //or something more meaningful here 
}); 
0

這些元素是如何進入DOM樹的?通過傳統的頁面加載?如果是這樣,您可以使用DOMContentLoaded事件來了解獲取所需元素的正確時機。

這裏是如何做到這一點很簡單的例子:

document.addEventListener("DOMContentLoaded", function(event) { 
    console.log(document.getElementsByClassName('youElementClassHere')); 
}); 

另一種簡單的選擇是簡單的引用在腳本的元素在你<body>標籤的底部。

+0

OP表示元素正在通過JS加載,所以我不認爲這個工作。 – CollinD

0

考慮到我們有async執行,你應該更好地介紹callbacks的用法如下:

var i = 1; 

function waitForElClass(data, callback) { 
    var element = data.selected; 
    var index = data.index; 

    var findEl = document.getElementsByClassName(element)[index]; 
    console.log(i); 
    i++; 
    window.setTimeout(function() { 
    if (!$(findEl).length) { 
     waitForElClass(data); 
    } 
    else { 
     callback(findEl); // executing callback 
    } 
    }, 500) 
} 

var data = {selected: 'new', index: 0}; 
var elem; 
waitForElClass(data, function(el) { // Callback 
    console.log(el); 
});