jkQuery

jkQuery库(模仿jQuery)

// ==UserScript==
/*
远程调用代码 :  	https://greasyfork.org/scripts/441600-jk/code/jk.user.js
php <script src="https://greasyfork.org/scripts/441600-jk/code/jk.user.js<?php echo "?v=".rand(1,10000);?>"></script>
js:
     var url='https://greasyfork.org/scripts/441600-jk/code/jk.user.js';
     el=document.createElement('script');
     el.src=url+'?rnd='+Math.random();
     document.getElementsByTagName("head")[0].appendChild(el); 
*/
//  
// @name            jkQuery
// @namespace       moe.canfire.flf

// @description     jkQuery库(模仿jQuery)
// @author          jk
// @license         MIT
// @match           *

// @grant           GM_setValue
// @grant           GM_getValue
// @grant           GM_deleteValue
// @grant           GM_setClipboard
// @grant           GM_xmlhttpRequest
// @grant           GM_info
// @grant           GM_getResourceText
// @grant           GM_addStyle
// @grant           unsafeWindow
// @run-at          document-start
// @connect         *
// @version 0.0.1.20240905080805
// ==/UserScript==
 
 
        //jk模拟jQuery,
        
        //:内部要用的jkQuery合并数组的方法
        function merge(first, second) {
            var l = second.length,
                i = first.length,
                j = 0;
            if (typeof l === "number") {
                for (; j < l; j++) {
                    first[i++] = second[j];
                }
            } else {
                while (second[j] !== undefined) {
                    first[i++] = second[j++];
                }
            }
            first.length = i;
            return first;
        }


        (function (window, undefined) {
            var core_version = "spring v.1",
                core_deletedIds = [],
                core_push = core_deletedIds.push,
                core_slice = core_deletedIds.slice;
            var jkQuery = function (selector) {
                return new jkQuery.fn.init(selector);
            };
            jkQuery.fn = jkQuery.prototype = {
                jkQuery: core_version,//jkQuery版本
                constructor: jkQuery,//覆盖构造函数防止被外部改变
                init: function (selector) {//context,rootjkQuery不传了,稍微看看就懂了
                    //针对不同参数类型进行不同处理方式,如果$("")$(null就直接返回)
                    if (!selector) {
                        //参数不对直接将this返回,想想现在this的值是什么,提示:new init();=>jkQuery.fn.init[0]
                        return this;
                    } else {
                        //如果是字符串juqery会调用查询方法进行查询dom元素(jkQuery调用sizzle专门进行dom解析)
                        var nodes = document.querySelectorAll(selector);//getElementsByName(selector);
						alert(nodes.length);
                        var arr = [];
                        for (var i = 0; i < nodes.length; i++) {
                            arr.push(nodes[i]);
                        }
                        //如果传递了Context上下文,则在context中寻找元素。这里指定位document
                        this.context = document;
                        this[0] = document;
                        //把selector存到jkQuery中
                        this.selector = selector;
                        //jkQuery的合并方法,直接拿出来就能用,合并查询结果
                        var result = merge(this, arr);//this 默认的选择器的一个数组
                        //对处理过的this进行封装返回,注意为了链式调用,都需要返回this
                        return result;
                    }
                },
                selector: "",
                length: 0,
                toArray: function () {
                    return core_slice.call(this);
                },
                get: function (num) {
                    return num == null ?
                        this.toArray() :
                        (num < 0 ? this[this.length + num] : this[num]);
                },
                //这里要注意,想要长得像jkQuery.fn.jkQuery.init[0],并且init方法中的this值为数组就必须加下面这三个字段
                push: core_push,
                sort: [].sort,
                splice: [].splice
            }
            jkQuery.fn.init.prototype = jkQuery.fn;
            if (typeof window === "object" && typeof window.document === "object") {
                window.jkQuery = window.jk = jkQuery;
            }
        }(window));
/*
jk本身是一个对象
jk("selector")其实得到是一个对象数组,本身,也可增加方法
for(let i=0;this.length()
jk.fn.可对选择对象数组处理增加方法

*/
//扩展选择器方法 jk.fn,是一个json, jk.fn['attr']或jk.fn.attr, $(".cls").attr();
jk.fn.each = function ( func ) { 
    for (var i = 0; i < this.length; i++) { //nodes
        func( this[i] ); //HTMLElement
    }
    return this;
};
 
jk.fn.attr = function (name, value) { 
    for (var i = 0; i < this.length; i++) {
        var item = this[i];
        if (name && value) {
            item.setAttribute(name, value);
        } else if (name && !value) {
            return item.getAttribute(name); //带取值
        }
    }
    return this;
};
jk.fn.css= function (json_or_str ) { 
    //css({display:'none',height:20px;})   css("display:'none';height:20px;")
    for (var i = 0; i < this.length; i++) {
        if(typeof(json_or_str)=='object'){
            for(var x in json_or_str)  this[i].style[x]=json_or_str[x];
        }
        if(typeof(json_or_str)=='string'){
           this[i].cssText += " ;"+json_or_str; 
        }   
    }
    return this;
};
/*
jk(".test").attr("style","border:1px solid red;")
jk(".test").each(function (){
    this.onclick=function(){alert(1)}
});
//$(".test").attr("value","xxx");
/// alert($(".test").attr("value"));
//=================================================
//jk是一个json,扩展其静态方法	jk.ajax 或 jk['ajax']
jk.ajax2=function(){
    alert("ajax");
}
jk.ajax2();
 
jk('.test')[0].onclick=function(){
   alert(this);
 }
 */