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