Сообщение от devote
|
да все очень просто, видимо более поздние джуквери доавляют метод toString который возвращает последний использованный селектор
|
нет
<script src="http://code.jquery.com/jquery-1.7.2.js"></script>
<script>
alert( $().toString );
</script>
Сообщение от HelpeR
|
Честно говоря не смог разобраться как это они реализовали.
|
всё до безобразия просто :
=======================
Кратко
=======================
Смешивает список найденных элементов с текущим (
возвращаемым) объектом jQuery.
- Либо делает это через Array.push
- Либо через простой проход (обычное копирование свойств с одного объекта\массива в другой)
К первому немного кода:
var current_jq = { };
var finded_elemenets = document.getElementsByTagName("div");
// т.к. nodelist - живой массив, замораживаем его, с помощью превращения в обычный массив.
finded_elements = [].slice.call(finded_elements, 0);
// переносим значения из результатов поиска в текущий экз.
// так работает Array.prototype.push
for(var i = 0; i < finded_elements.length; i++) {
// узкий момент. тут не по документации, я просто сократил несколько вызовов до одного.
if (!isNumeric(current_jq.length)) {
current_jq.length = +0;
}
current_jq[i] = finded_elements[i];
current_jq.length++;
}
function isNumeric(variable) {
return !isNaN(parseFloat(variable, 10)) && isFinite(variable);
}
*к коду сверху*
С чего ты взял, что push работает именно так ?
Cм
документацию. Если не понятно - могу разжевать.
=======================
Подробно :
=======================
$.fn.init (
она вызывается при $(), знаем же?) вызывает поиск Sizzle (
эта штучка ищет элементы по селектору, если кто не в курсе), указывая помимо всего аргумент с именем "extra" - это объект, куда Sizzle подмешает в конце результаты поиска.
Sizzle живёт в самой jQuery с именем find. (
вызвать можно так : jQuery.find(bla bla bla))
В конце своём сиззл вызывает функцию makeArray, передавая ей такие аргументы : первый - NodeList найденных элементов, второй - объект (тот самый extra).
её исходный код :
// array - найденные элементы
// results - jQuery объект, который будет возвращён.
var makeArray = function( array, results ) {
array = Array.prototype.slice.call( array, 0 );
if ( results ) {
results.push.apply( results, array );
return results;
}
return array;
};
что за метод push у объекта jQuery ? да самый обычный пример заимствования методов - т.е. это метод не самописный, а взятый у массивов.
<script src="http://code.jquery.com/jquery-1.7.2.js"></script>
<script>
alert( $().push );
</script>
можем убедиться в коварстве сиззла, подсунув ему что-нибудь своё :
<script src="http://code.jquery.com/jquery-1.7.2.js"></script>
<p>SAMPLE</p><div>LOL</div>
<script>
var extra = {
push: function(/*elements*/) {
for(var i = 0, args = arguments; i in args; i += 1) {
alert("Push добавляет : "+args[i]+"\n\nСтарая длина : "+this.length);
this[this.length++] = arguments[i];
}
},
length: 0,
context: document
}
jQuery.find("p, div", document, extra);
</script>
PS уморился.