2016-05-06 47 views
3

隨着jQuery.each()應用功能的元件,我可以迭代通過陣列的成員:jQuery的:在同一時間

// This is NOT what I am looking for. 
$('.example a').each(function() { 
    // do a lot of things here 
    $(this).css('color', 'red'); 
}); 


然而,我需要一個函數應用於jQuery的數組本身,而不是其成員。所以我寫了一個小插件來做到這一點:

$.fn.all = function(callback) { return callback.call(this); } 

$('.example a').all(function() { 
    // do a lot of things here 
    $(this).css('color', 'red'); 
}); 


請注意,在上面的功能,this將被設置爲元素的集合 - 這正是我需要。
現在我確信jQuery應該有一個優雅的方式來做到這一點,但我還沒有找到任何文檔或谷歌搜索。

是否有可能,如果是的話,如何在不使用自定義插件的情況下實現這一目標?

更新:我不能直接做$('.example a').css('color', 'red');。我在函數中有數十個計算,所以我必須使用類似於我寫的插件的東西。 我要求回電。正確的答案必須提供類似於自定義函數的回調。

+0

什麼是「應用功能,jQuery的數組本身」的意思是,到底是什麼? – Oriol

+0

@Oriol他可能意味着整體而不是一個一個。 –

+0

.each通過迭代將回調應用於數組中的每個成員,所以「this」將是該數組的成員。 我需要的是「this」將是數組本身,而不是其成員。請閱讀更新後的問題。 –

回答

2

你並不需要一個插件,你可以直接使用call

(function() { 
    // do a lot of things here 
    this.css('color', 'red'); 
}).call($('.example a')); 

或者考慮通過數組類對象作爲參數

(function(arrayLike) { 
    // do a lot of things here 
    arrayLike.css('color', 'red'); 
})($('.example a')); 

或者如果你喜歡一個jQuery的方式

$.each([$('.example a')], function(){ 
    // do a lot of things here 
    this.css('color', 'red'); 
}); 
+0

這是一個非常優雅的方式,我喜歡它。但是,我非常寧願使用'$(...)。something'格式,因爲它是當前格式化的。 –

+2

然後將該方法添加到'$ .fn'似乎是正確的方法。 – Oriol

2

不應該

$('.example a').css('color', 'red'); 

夠嗎?

+0

它應該,除了那裏,我有超過一個.css()在那裏,他們都需要是)在一個函數b)在同一時間完成 –

+0

@DRSDavidSoft,這是不可能在JS中執行一次超過一個命令/功能;所以呢? – Thomas

+0

我覺得我有點不清楚。正如我所說的,我想對數組本身執行這個動作,而不是一次執行所有成員的動作。 jQuery本身允許在選定的元素上執行某個動作,例如'$('a')。hide()'的確具有與$('a')完全相同的結果。 $(this).hide()})',但後者會更慢。但正如你所看到的,一次只對所有鏈接執行'.hide()',而不是遍歷所有成員並逐個執行操作。我希望這很清楚。 –

0

$('.example a') 

收益匹配的元素集合。而這

$('.example a').css('color', 'red'); 

設置顏色紅色集合中的所有元素。

這就是jQuery的工作原理。

+0

對不起,我忘記提及,我不只是在那裏做一個.css()。請閱讀更新後的問題。 –

0

我認爲不可能在同一時間獲得所有計算,您應該使用線程或webWorker。你可以在mdn得到更多關於這方面的信息。

+0

謝謝,但實際上我需要回調是線性的。你的回答並不能解決我的問題,但這是一篇很棒的文章。 –

+0

不客氣:) –

+0

我不使用foreach,因爲它應用了「for each」元素的函數。例如:'$ els [0] .doFunc(); $ ELS [1] .doFunc(); $ ELS [2] .doFunc(); ...' 但我要求函數同時應用於所有元素:'$ els.doFunc();' –

0

您可以緩存選擇器,利用$.queue()

var elems = $(".example a"); 
 
$.queue(elems, "q", function() { 
 
    $(this).css("color", "red"); 
 
    console.log(this) 
 
}); 
 
$.dequeue(elems, "q")
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> 
 
</script> 
 
<div class="example"> 
 
    <a href="#">a</a> 
 
    <a href="#">b</a> 
 
    <a href="#">c</a> 
 
</div>

+0

雖然不是我所要求的,但這是定義隊列的一個非常有用的方法,我很高興今天學到了它。謝謝! –

+0

@DRSDavidSoft _「雖然不是我直接要求的」_爲什麼包含引用'$ .when()','.then()'的註釋。不確定什麼_「我有幾十個函數的計算」_是? – guest271314

+0

但是,這是使用映射,它遍歷元素作爲foreach,所以你不處理數組,只與內部的元素。或者我錯了嗎?(這很有可能) –

2

這將是直線前進(jQuery的去年秋季)的方式做你想要什麼:

var $collection = $('.example a'); 
$collection.each(function() { 
    // do a lot of things here 
    $collection.css('color', 'red'); 
}); 

//而另一個原因,我不喜歡jQuery的實施each()
//但最重要的是,錯誤的參數順序和this通過當前值/節點的濫用

在這裏我最喜歡的實現。主要像Array.prototype.forEach(),以及$.each()的好的部分。

$.fn.forEach = function(fn, scope){ 
    if(scope != null) fn = fn.bind(scope); 
    for(var i = 0, len = this.length; i < len; ++i) 
     if(false === fn(this[i], i, this)) break; 
    return this; 
} 

,你的代碼將是這樣的:

$('.example a').forEach(function(node, index, $collection){ 
    //and don't use `$(this)`, since `this` most of the time references `window` 
    //unless you've bound the function to a scope, or passed one to forEach 

    var $node = $(node); 

    $collection.css('color', 'red'); 
}); 
+0

雖然仍然使用自定義的「$ .fn」方法,但這是迄今爲止我所見過的最好且最詳細的forEach實現。另外,對於「*'這個'濫用*」部分+1,無法表達我同意多少! –