之前有个一直做前端开发的朋友,问我一个问题,说去面试一家NB的公司,问一个看似很简单的问,一时却不知道如何实现,虽然对jquery使用的很多,其实如果没看过jQuery的源码,相信一时很多人都会尴尬,这里我简单的做个案例,便于大家参考,当然jQuery会写的比这个复杂很多,判断部分有很多内容,这里我只是把他简单化了,提供给不会的朋友参考思路。
首先一个页面上有这些元素
1 2 <div id ="iddv" class ="myclass" > my name is allen zhang</div > <div id ="dv" class ="dvcs" > i was from guizhou province</div >
我们的目的是用原生态的JS实现类似于JQuery 的$(“#id”)、$(“#id”).size()功能
1. 实现 $(“#id”) / $(“#class”) / $(“div”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 $ = function (str ) { return new JQuery (str);} JQuery = function (str ) {if (str.indexOf ("#" ) == 0 )this .dom = document .getElementById (str.substring (1 ));else if (str.indexOf ("." ) == 0 )this .dom = getElementsByClassName (str);else this .dom = document .getElementsByTagName (str);return this .dom ;} function getElementsByClassName (str ) {var elements = document .getElementsByTagName ('*' );if (!elements) {for (var i = 0 ; i <= elements.length ; i++) {if (elements[i].className == str.substring (1 )) {return elements[i];} } } return "undefined" ;} $("#iddv" ); $(".myclass" ); $("div" );
2. 为了实现 $(“#id”).size(),在上面的基础上改了一下,同过继承的方式来实现的,如果你对js的继承方式不大了解,可以在网上搜一下,并于更好的理解以下方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 $ = window .JQuery = function (str ) { return new JQuery .prototype .init (str);} JQuery .prototype = {name : "JQuery" ,version : "1.71" ,init : function (str ) {if (str.indexOf ("#" ) == 0 ) {this .dom = document .getElementById (str.substring (1 ));this .length = 1 ;} else if (str.indexOf ("." ) == 0 ) {this .dom = getElementsByClassName (str.substring (1 ));this .length = this .dom .length ;} else {this .dom = document .getElementsByTagName (str);this .length = this .dom .length ;} }, size : function ( ) {if (this .dom )return this .length ;} } function getElementsByClassName (str ) {var elements = document .getElementsByTagName ('*' );if (!elements) {for (var i = 0 ; i <= elements.length ; i++) {if (elements[i].className == str.substring (1 )) {return elements[i];} } } return "undefined" ;} JQuery .prototype .init .prototype = JQuery .prototype ; $("#iddv" ).size (); $(".myclass" ).size (); $("div" ).size ();