Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 26.06.2012, 12:41
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от HelpeR
Т.е. говоря иначе. Если в консоле ФФ набрать $('#someID') то до версии 1.4.1 результат был jQuery{.....} а с версии 1.4.1 и выше результат [tag#someID]
да все очень просто, видимо более поздние джуквери доавляют метод toString который возвращает последний использованный селектор, тоесть примерно так:
function jQuery( selector, context ) {
    return new jQuery.prototype.init( selector, context );
}
 
jQuery.prototype = {
    constructor: jQuery,
    init: function( selector, context ) {
        this.selector = selector;
        return this;
    },
    length: 0,
    selector: "",
    toString: function() {
        return "[" + this.selector + "]"; // вот это ФФ наверно и считывает при выводе в консоль
    }
}
 
jQuery.prototype.init.prototype = jQuery.prototype;
 
console.log( jQuery("#someID") );
alert( jQuery("#someID") );
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #12 (permalink)  
Старый 26.06.2012, 16:16
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от 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 работает именно так ?
документацию. Если не понятно - могу разжевать.


=======================
Подробно :
=======================


$.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 уморился.

Последний раз редактировалось melky, 26.06.2012 в 17:12.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамически загружаемая jQuery и jQuery-функции в одном файле 67bytes Общие вопросы Javascript 6 06.03.2013 09:01
По формированию селектора jquery из строки и переменной bartonom jQuery 1 14.02.2012 11:18
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 23:30
jQuery Ajax Rater Plugin и массив POST - Нужна помощь TROODON jQuery 12 30.12.2009 22:44