Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 类似jQuery的内联语法而不使用jQuery?_Javascript_Syntax_Prototype - Fatal编程技术网

Javascript 类似jQuery的内联语法而不使用jQuery?

Javascript 类似jQuery的内联语法而不使用jQuery?,javascript,syntax,prototype,Javascript,Syntax,Prototype,在jQuery中,您可以调用如下函数,例如: $("id").someFunction(); 现在,在查看jQuery的代码库之后,它看起来像是使用$创建的对象修改了其原型,以返回通过.fn添加的函数,在我的应用程序中,我只希望使用相同的语法,而不需要jQuery 这种行为的另一个例子是Javascript的一些内置方法,如:.replace、.toLowerCase、.split、.toString等。我知道一些列出的方法在String.prototype对象上,扩展内置对象是一种不好的做法

在jQuery中,您可以调用如下函数,例如:

$("id").someFunction();
现在,在查看jQuery的代码库之后,它看起来像是使用$创建的对象修改了其原型,以返回通过.fn添加的函数,在我的应用程序中,我只希望使用相同的语法,而不需要jQuery

这种行为的另一个例子是Javascript的一些内置方法,如:.replace、.toLowerCase、.split、.toString等。我知道一些列出的方法在String.prototype对象上,扩展内置对象是一种不好的做法,所以我听说

我如何才能将函数添加到每个被分配的字符串或对象的原型中。我这样做的原因是我试图创建一个附加事件的跨浏览器实现,而不必一直执行if语句

因此,我不需要去:如果el.addEventListener或el.attachEvent,我希望能够去el.bindEvent,它在幕后将是一个原型方法,它将在幕后执行所有事件绑定的检查,等等


我在分配原型方法等方面的高级JS知识不是很好,因此非常感谢您帮助我理解和纠正我所说的任何内容。

如果我理解正确,您想知道如何向内置javascript对象添加方法,因此:

myObject.prototype.myMethod = function() {
  // whatever
}
因此,举例来说:

String.prototype.splice = function() {
// splice function for every string
}

如果我理解正确,您想知道如何向内置javascript对象添加方法,因此:

myObject.prototype.myMethod = function() {
  // whatever
}
因此,举例来说:

String.prototype.splice = function() {
// splice function for every string
}

扩展DOM元素的原型比扩展内置对象†更糟糕。请看一下这篇文章

jQuery提供的是一个围绕DOM API的简单包装器,这很好。扩展DOM的问题是

它们是宿主对象,其行为可能与ECMAScript规范和规范中定义对象的方式不同 旧的IE版本甚至不公开DOM节点的原型。 我这样做的原因是我试图创建一个附加事件的跨浏览器实现,而不必一直执行if语句

这本身并不是扩展DOM的理由。您可以定义自己的绑定事件处理程序的函数,甚至需要在页面加载时测试addEventListener或attachEvent是否只存在一次。这样的函数可以如下所示:

var bindEvent = (function() {
    if (document.addEventListener) {
        return function(element, event, handler) {
            element.addEventListener(event, handler, false);
        };
    }
    else {
        return function(element, event, handler) {
            element.attachEvent("on" + event, function() {
                handler.call(element, window.event);
            }
        };
    }
}());
您可以对这样的函数进行大量规范化。例如,当使用attachEvent时,它通常不引用处理程序绑定到的元素,而是引用窗口,这与addEventListener不同。此外,您可能知道,事件对象没有作为参数传递给IE中的处理程序。这两个问题都已通过以下行解决:

handler.call(element, window.event);
缺点是您不能简单地删除处理程序,因为您没有直接绑定处理程序,但是这些问题仍然存在

您可以在中找到有关这些浏览器差异的更多信息

†:由于浏览器提供了将属性标记为不可枚举的可能性,因此扩展内置对象不再那么糟糕,但如果库开始使用它,名称冲突、方法重写和不兼容的可能性会更高。
对于您自己的代码,它应该可以。DOM对象应该仍然是禁忌。

扩展DOM元素的原型比扩展内置对象更糟糕。请看一下这篇文章

jQuery提供的是一个围绕DOM API的简单包装器,这很好。扩展DOM的问题是

它们是宿主对象,其行为可能与ECMAScript规范和规范中定义对象的方式不同 旧的IE版本甚至不公开DOM节点的原型。 我这样做的原因是我试图创建一个附加事件的跨浏览器实现,而不必一直执行if语句

这本身并不是扩展DOM的理由。您可以定义自己的绑定事件处理程序的函数,甚至需要在页面加载时测试addEventListener或attachEvent是否只存在一次。这样的函数可以如下所示:

var bindEvent = (function() {
    if (document.addEventListener) {
        return function(element, event, handler) {
            element.addEventListener(event, handler, false);
        };
    }
    else {
        return function(element, event, handler) {
            element.attachEvent("on" + event, function() {
                handler.call(element, window.event);
            }
        };
    }
}());
您可以对这样的函数进行大量规范化。例如,当使用attachEvent时,它通常不引用处理程序绑定到的元素,而是引用窗口,这与addEventListener不同。此外,您可能知道,事件对象没有作为参数传递给IE中的处理程序。这两个问题都已通过以下行解决:

handler.call(element, window.event);
缺点是您不能简单地删除处理程序,因为您没有直接绑定处理程序,但是这些问题仍然存在

您可以在中找到有关这些浏览器差异的更多信息

†:由于浏览器提供了将属性标记为不可枚举的可能性,因此扩展内置对象不再那么糟糕,但如果库开始使用它,则 名称冲突、方法重写和不兼容性越来越高。
对于您自己的代码,它应该可以。DOM对象应该仍然是禁忌。

扩展DOM元素的原型比扩展内置对象更糟糕。看一看。附加事件的跨浏览器实现,无需始终执行if语句:只需创建一个函数bindEventelement,handler{…};并将元素和事件处理程序传递给函数。下面是一个示例:。因此,这被认为是不好的做法,除非您正在执行jQuery所做的操作,并在创建的jQuery对象上使用自定义方法返回原型,因为没有两个浏览器在IE中显示的方法是相同的,所以为了保证结果,建议您只使用函数?谢谢你的链接。总而言之:jQuery只是一个包装器,这很好。扩展DOM的问题在于a它们是主机对象,其行为可能与ECMAScript规范中定义对象的方式不同,b旧的IE版本没有公开DOM节点的原型。非常好,谢谢Felix。如果你有你的评论作为答案,我会接受的。我这么做了,并添加了更多的信息,希望能有所帮助:扩展DOM元素的原型比扩展内置对象更糟糕。看一看。附加事件的跨浏览器实现,无需始终执行if语句:只需创建一个函数bindEventelement,handler{…};并将元素和事件处理程序传递给函数。下面是一个示例:。因此,这被认为是不好的做法,除非您正在执行jQuery所做的操作,并在创建的jQuery对象上使用自定义方法返回原型,因为没有两个浏览器在IE中显示的方法是相同的,所以为了保证结果,建议您只使用函数?谢谢你的链接。总而言之:jQuery只是一个包装器,这很好。扩展DOM的问题在于a它们是主机对象,其行为可能与ECMAScript规范中定义对象的方式不同,b旧的IE版本没有公开DOM节点的原型。非常好,谢谢Felix。如果你有你的评论作为回答,我会接受。这样做了,并添加了一些信息,希望这是有益的:这是一个非常好的回答,谢谢菲利克斯。我相信这会帮助很多想要jQuery语法的人,希望能让他们像我一样三思而后行。这是一个非常好的答案,谢谢Felix。我相信这会帮助很多想要类似jQuery的语法的人,并希望让他们像我一样三思而后行。