jkQuery

jkQuery库(模仿jQuery)

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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);
 }
 */