jkQuery

jkQuery库(模仿jQuery)

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

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

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

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