JQ中为什么方法svgFun函数写在$(function())中就报js文件jq未定义义,但是提出来就正确了?

jq中两个$(function()}函数冲突有关问题 - 编程当前位置:& &&&jq中两个$(function()}函数冲突有关问题jq中两个$(function()}函数冲突有关问题&&网友分享于:&&浏览:294次jq中两个$(function()}函数冲突问题
在同时使用日历控件和jq表格排序发生冲突问题解决
在jq中如果使用两个如下函数,会造成冲突问题,一个可用另一个失去效果
$(function()
$("table").tablesorter({debug: true});
可把上面方法中的一个改为:
var jq = jQuery.noConflict();
jq(function()
jq("table").tablesorter({debug: true});
这样问题就解决了
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有jQuery()中,on()方法_百度知道
jQuery()中,on()方法
on的用法:.on( events [, selector ] [, data ], handler(eventObject) )描述: 在选定的元素上绑定一个或多个事件处理函数。events类型: String一个或多个空格分隔的事件类型和可选的命名空间,或仅仅是命名空间,比如&click&, &keydown.myPlugin&, 或者 &.myPlugin&。selector类型: String一个选择器字符串,用于过滤出被选中的元素中能触发事件的后代元素。如果选择器是 null 或者忽略了该选择器,那么被选中的元素总是能触发事件。data类型: Anything当一个事件被触发时,要传递给事件处理函数的event.data。handler(eventObject)类型: Function()事件被触发时,执行的函数。若该函数只是要执行return false的话,那么该参数位置可以直接简写成 false。.on()方法事件处理程序到当前选定的jQuery对象中的元素。在jQuery 1.7中,.on()方法 提供绑定事件处理的所有功能。要删除的.on()绑定的事件,使用.off()。要绑定一个事件,并且只运行一次,然后删除自己, 使用.one()
其他类似问题
70人觉得有用
为您推荐:
提问者采纳
)$(& id=&#39,function(){});click&#39.
});p&p就是父节点;#logout&p&#39。$('p&#count'【退出】&lt?当然有。$('/也是可以的;a href='function code here.on(';&;a&/click'#count&#39.on(');;);function code here.
})。&lt,不能是后期动态添加的节点;click'#logout有父节点嘛。如果像表格里动态添加的行;);, function() {
&#47, '&#&#39,就要用下面你说的方法。不过有个限制.on(&#39,你的这个$(&, '&logout'&#47,要使用事件;#Grid1Table'&#47, function() {
/#logout&quot
提问者评价
多谢!!!
jquery的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁为什么jQuery的构造方法要放在jQuery.fn.init里? - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
如题,为什么要这么做呢?为了配合上面的语句,还得加上下面这句很绕的语句:
jQuery.fn.init.prototype = jQuery.
为什么不能这么干呢?
(function(){
var jQuery = function(){
return new F();
var F = function(){
F.fn = F.prototype = {
jquery : 1.0,
test : function(){
console.log('test');
jQuery.fn = jQuery.prototype = F.
window.jQuery = window.$ = jQ
a = $('body').test('li');
console.log('');
$.fn.extend = function(){console.log('extended');}
a.extend();
这样层次清晰,而且兼顾到插件扩展,求大神赐教。
把你的这个定义里面的F换成jQuery.fn.init,不就等价了吗?
我的代码结构可以实现jQuery的要求了啊,为什么要把F换成jQuery.fn.init呢?这样多不直观啊
两者的效果区别只在于,jquery多做了把F挂到$.fn上。所以你的代码加一句jQuery.fn.init = F;如楼上说,就等价了。这样的好处是在访问不到F的地方,可以调用jQuery.fn.init。
我也一直有这疑问 同求
但是没有必要访问F啊,要扩展有两种,意识jQuery.extend;二是jQuery.fn.extend。现在两者都可以被扩展啊。
当然,如果要扩展jQuery,必须加上jQuery.extend = F.extend = F.fn.extend = function extend(){};如果是为了避免还有可能出现的这种情况,那么可以解释为什么要把F挂到jQuery.fn上
其实楼主的F和jQuery.fn.init是相等的; 实现功能是和jq一样的, 只是jq的把构造函数放进原型;
如果非要说原因, 个人理解jq这样写整体结构清晰, 先是入口构造函数,紧跟着是原型部分(原型里面init是初始化), 但是不好理解;
乍一看确实挺绕, 我也是看了好久才明白怎么回事
jQuery = function( selector, context ) {
return new jQuery.fn.init(
jQuery.fn=JQuery.prototype = {
init: function() {},
最后重置原型, 和楼主的 jQuery.prototype = F.一个意思
jQuery.fn.init.prototype = jQuery.
其实我也明白我的代码和jQuery的代码其实是相同的,只是把F替换成了jQuery.fn.init,但是疑问的是为什么要这么干,因为这样看起来很绕。
我的理解是为了extend方法的代码层次清晰,因为现在没办法在外面访问F,所以,要达到扩展jQuery本身的目的,需要添加这么一句:
jQuery.extend = F.extend = F.fn.
但是这样做破坏了原本代码的层次,把jQuery和F混合了,所以直接吧F挂到jQuery.fn.init上
将F的引用挂在fn上,也就是间接地挂在$这个对外暴露的变量上。那么在外部就可以访问到并使用F,比如F.apply(obj),或者obj instance of F,总之,这个函数作为jQuery中重要的一个函数(所有jQuery对象的constructor),大量重要逻辑在其中,将其暴露出来是可能发挥出一些作用的。以上为个人理解。
你后面的话我没看懂…
jq要扩展方法直接这样也不麻烦:
jQuery.extend = jQuery.fn.extend=function(){
jQuery.extend是扩展到jquery上,
jQuery.fn.extend扩展到jquery实例上,也就是原型上面的
而你的也跟jq一样:
jQuery.extend = jQuery.fn.
不需要这样:
jQuery.extend = F.extend = F.fn.
这样就可以了
其实jQuery.extend = F.这样就可以对外暴露F这个变量了吧。你要对F做的扩展都可以通过jQuery.extend实现啊。
我后面那句话是想说,如果有大量的需要在内部扩展F的语句,比如:
F.extend({
F.extend({
F.extend({
three: ...
那为了把这些方法暴露出来,需要同时扩展jQuery和F:
var one = {
three: ...
jQuery.extend(one);
F.extend(one);
jQuery.extend(two);
F.extend(two);
jQuery.extend(three);
F.extend(three);
其实就是怎么暴露F的问题,jQuery是把F通过jQuery.fn.init暴露了,依我现在的实现,每一次扩展F,必须同时扩展jQuery。其实也可以这么做吧:
F.fn.extend = function(){
// 现在jQuery的extend方法
jQuery.extend = function(){
F.fn.extend.apply(F, arguments.slice);
我觉得你说的方法也不对,因为这样的话你调用$.extend() 其实扩展的是jQuery,而不是F,我觉得更好的方法是:
F.fn.extend = function(){
// 现在jQuery的extend方法
jQuery.extend = function(){
F.fn.extend.apply(F, arguments.slice);
这样一来,所有对jQuery的扩展,实质上是对F的扩展
其实jQuery.extend = F.这样就可以对外暴露F这个变量了吧。你要对F做的扩展都可以通过jQuery.extend实现啊。
做不到吧,比如我在外部(jQuery使用者角度)这样用:
var a = jQuery.fn.init.apply({});
如果没挂在jQuery.fn上,怎么拿得到这个函数啊。
另外,我还是没理解你的意思,jQuery里边现在有三个东西:jQuery(即$,返回值为一个Constructor的实例的函数), Constructor(jQuery对象的构造函数,记为Constructor,即F,亦即jQuery.fn.init),jQuery.fn(是Constructor的prototype)。
jQuery的主要扩展就两个地方:
往jQuery上挂
jQuery.extend({
xxx: function(){}
使用方式:$.xxx()()
往jQuery.fn上挂
jQuery.fn.extend({
xxx: function(){}
使用方式:$(‘div’).xxx()
并没有需要扩展F(Constructor)的场景啊。
不知道prototype除了写这么大的东西,还在其他地方用的到么?
其实jQuery.extend = F.这样就可以对外暴露F这个变量了吧。你要对F做的扩展都可以通过jQuery.extend实现啊。
这里是我想错了。
但是,从框架提供者的角度,更应该避免用户以下面这种方式调用的情况吧:
var a = jQuery.fn.init.apply({});
jQuery 需要扩展两个地方我理解,现在jQuery的代码是通过jQuery.extend和jQuery.fn.extend方式实现。
那么,要达到这个目的,我可以在我的代码里这么写:
jQuery.extend = F.fn.extend = function(){
// current jquery 'extend' method
这样,在外部,我既可以通过$.extend 来扩展jQuery,也可以通过$.fn.extend来扩展jQuery对象。
至于我说的要扩展F的情况,我的想法是这样的,可能有点洁癖的感觉:
我最开始定义的jQuery变量只是暴露给外部的一个接口,而我真正的jQuery对象是通过new F() 生成的,而且所有的jQuery对象的方法都是定义在F.prototype里面。所以像需要对外暴露的jQuery方法,比如:$.ajax, $.data 这些方法,我希望他们是定义在内部的F下,而不是定义在对外暴露的jQuery变量下,因此我希望调用$.extend()的时候,他是对F进行扩展,而不是对jQuery进行扩展。不知道这样的解释你能明白吗?
你平时用prototype么?
要明白jQuery和jQuery.fn的区别
你上面jQuery.extend = function(){} 扩展的当然是jQuery,
你要扩展jqeury的实例(也就是F)就必须这样
jQuery.fn.extend=function(){…}; // 认真看,中间多了个fn
用你的代码:
同时扩展到jquery和jquery实例(即F)上面
$.extend=$.fn.extend = function(){
console.log(this);
console.log(‘extended’);
$(‘body’).extend();,是F.fn上面的
this的结果是:
$.extend();
this的结果是:
其实上面就对应了我们jquery中不同类型的api
比如: $.ajax() 和 $(’#id’)的区别,
前者对应的是jquery.extend, 后者对应jquery.fn.extend
,首先,我明白$和$.fn的区别,也明白$.extend和$.fn.extend的区别。你的这段代码:
jQuery.fn.extend=function(){…}; // 认真看,中间多了个fn
等同于我写的:
F.fn.extend = function(){
// 现在jQuery的extend方法
因为在jQuery.fn = F.fn。
而我要同时满足$.extend和$.fn.extend,我可以这么实现:
jQuery.extend = F.fn.extend = function(){};
这样,在外部,我既可以$.extend({‘ajax’: function(){}})来扩展jQuery实现$.ajax,也可以$.fn.extend({‘some’:function(){}})来扩展jQuery.fn实现$(’#id’).some();
但是这么做,当我们调用$.extend的时候,实际上是扩展的内部的jQuery这个变量,而我觉得更合理的代码实现应该做到这样:在外部调用$.extend的时候,不应该是对内部jQuery变量的扩展,而是对F的扩展。所以才有了这段代码:
jQuery.extend = function(){
F.fn.extend.apply(F, arguments.slice);
还有,下面这段代码中的this分别是F和jQuery是正确的逻辑啊:
$.extend=$.fn.extend = function(){
console.log(this);
console.log('extended');
$('body').extend();//这个方法是jqeury的实例,是F.fn上面的
this的结果是:
$.extend();//这个方法是jquery本身
this的结果是:
prototype用来实现继承啊
额,平时用到多么?
多啊,你要写一个类,把这个类的非公有属性放在自己的属性中,把公有的方法和属性放在prototype对象中啊
你看看jquery的源码就知道了,不太了解你要达到什么效果
你说的公有,是子类可继承的意思吧?
其实我只是单纯的不明白为什么jQuery要把用这么绕的方式实现:
new jQuery.fn.init();
jQuery.fn.init.prototype = jQuery.
子类可继承是一方面。另一方面是,定义一个Man类,每个Man实例都会有自己的名字,年龄,性别,这些属性对每个Man实例都是不同的,不能公用。但是像run(), eat()这些方法,可以是每个Man实例都共享的。
理解为你是要禁用扩展jquery本身的功能, 如果别人真要扩展在jquery上面, 不用你的
jQuery.extend({aa:function(){...}})
这个方法,直接向下面这样扩展呢
$.aa=function(){...}
prototype里面可以放公共变量,类似于静态变量?
其实你的方式实现了和jquery差不多的功能, 同时扩展插件方面也是和jq一样的效果的.
, 只是解决方式不一样而已
还有本来人家jq中
$.extend就是扩展jquery本身, $.fn.extend就是扩展jquery实例,
而我只是不理解你干嘛要禁用掉扩展jq本身, 两个都留着多好, 想扩展哪个就扩哪个 :)
恩,好像这个解释比较说的通,如果用这样的方法扩展$:
`$.extend({‘a’:function(){}});
$.b = function(){
//这里访问不到this.a
在b里就访问不到this.a 了,因为这里的this是jQuery,而用extend扩展的是F。
但是我也可以这么干啊:
jQuery.extend = F.fn.extend = function(){}
这样,扩展jQuery就可以了,可以用$.extend 也可以用$.newMethod。
但是你要知道fn是jquery下面的属性,在外部是可以访问得到的, 而你的F是内部的, 在外面是没法访问到的,
如果我外部扩展类库的方法是可以的
$.fn.extend({a:function(){...}})
F.fn.extend(a:function(){...})
你外面根本不能这样调,会报错的,因为F是内部的变量
你的类库总不能每次人家要扩展插件了,都要在你内部扩展吧
对的,比如计数器
js的实现好蛋疼,还是Java的直观:)
内部有一句话
jQuery.fn = jQuery.prototype = F.
所以在外面我可以通过$.fn.extend(a:function(){…})来扩展F.fn
还有本来人家jq中
$.extend就是扩展jquery本身, $.fn.extend就是扩展jquery实例,
而我只是不理解你干嘛要禁用掉扩展jq本身, 两个都留着多好, 想扩展哪个就扩哪个 :)
我的想法是内部的jQuery这个变量是暴露给外面的桥梁,也就是说这个jQuery变量可以随便取什么名字,比如cQuery,而jQuery对象其实是F的实例,所有实例的方法代码其实都在F.fn下,所以我这里的F其实应该就是John大神代码里的jQuery变量,所以我想让所有对jQuery本身的扩展放在F下面 :)
感觉有点代码洁癖的样子,恩,是这样的 LOL
对的,这就是js神(dan)奇(teng)的地方。
js没有接口的概念吧?要实现复杂模式,就变成天书了:(
也就是说本来就已经实现了的功能, 像jq那样
$.fn.extend({a:function(){...}}); 扩展实例
$.extend({a:function(){...}}); 扩展本身
那你还什么不满足,你这是要闹那样呢?
我只是想知道jQuery为什么不像我这么干,要把F放到jQuery.fn.init下
尼玛又见到你了…真水啊…
最近我也在读jquery源码,也思考了这个问题。这个实现方式感觉很晦涩。 我也百度了不少文章没有找到讲的特别清楚的。
从这个问题还可以引申出 为什么不用 jQuery.init = function(){ },应该可以实现相同的功能。并且同样可以暴露到全局作用域。
大家应该知道js中的prototype 主要是为了实现继承。那么jQuery.fn.init可以被所有的jQuery实例对象调用。
另外 我在这个地址找到了正确答案:
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的上篇文章讲到了事件绑定的3中常用方法:传统绑定、W3C绑定方法、IE绑定方法。但是,在实际开发中对于我们来讲重要的是需要一个通用的、跨浏览器的绑定方法。如果我们在互联网上搜索一下会发现许多方法,一下是比较知名的几种方法:
在开始学期下面几种方法之前,应当讨论一下,一个好的addEvent()方法应当达到哪些要求:
   a、支持同一元素的同一事件句柄可以绑定多个监听函数;
   b、如果在同一元素的同一事件句柄上多次注册同一函数,那么第一次注册后的所有注册都被忽略;
   c、函数体内的this指向的应当是正在处理事件的节点(如当前正在运行事件句柄的节点);
   d、监听函数的执行顺序应当是按照绑定的顺序执行;
   e、在函数体内不用使用 event = event || window. 来标准化Event对象;
一、John Resig 所写的 addEvent() 函数:
&& &function&addEvent(&obj,&type,&fn&)&{&&&&&&&&if&(&obj.attachEvent&)&{&&&&&&&&&&&&obj['e'+type+fn]&=&&&&&&&&&&&&&obj[type+fn]&=&function(){obj['e'+type+fn](&window.event&);}&&&&&&&&&&&&obj.attachEvent(&'on'+type,&obj[type+fn]&);&&&&&&&&}&else&&&&&&&&&&&&obj.addEventListener(&type,&fn,&false&);&&&&}&&&&function&removeEvent(&obj,&type,&fn&)&{&&&&&&&&if&(&obj.detachEvent&)&{&&&&&&&&&&&&obj.detachEvent(&'on'+type,&obj[type+fn]&);&&&&&&&&&&&&obj[type+fn]&=&null;&&&&&&&&}&else&&&&&&&&&&&&obj.removeEventListener(&type,&fn,&false&);&&&&}
这个函数如此简单易懂,的确非常令人惊讶。那么我们还是要看看上面的五点要求:
   对于第一点满足了;
   对于第三点和第五点,肯定也满足了;
   对于第二点,并没有满足,因为addEventListener()会忽略重复注册,而attachEvent()则不会忽略;
   但是第四点,并没有满足,因为Dom标准没有确定调用一个对象的时间处理函数的顺序,所以不应该想当然的认为它们以注册的顺序调用。
但是这个函数仍然是一个非常优秀的函数。
二、Dean Edward 所写的 addEvent() 函数 :
function&addEvent(element,&type,&handler)&{&&&&if&(!handler.$$guid)&handler.$$guid&=&addEvent.guid++;&&&&if&(!element.events)&element.events&=&{};&&&&&&&&var&handlers&=&element.events[type];&&&&if&(!handlers)&{&&&&&&&&handlers&=&element.events[type]&=&{};&&&&&&&&if&(element["on"&+&type])&{&&&&&&&&&&&&handlers[0]&=&element["on"&+&type];&&&&&&&&}&&&&}&&&&handlers[handler.$$guid]&=&&&&&element["on"&+&type]&=&handleE}addEvent.guid&=&1;&&&&function&removeEvent(element,&type,&handler)&{&&&&if&(element.events&&&&element.events[type])&{&&&&&&&&delete&element.events[type][handler.$$guid];&&&&}}function&handleEvent(event)&{&&&&var&returnValue&=&true;&&&&event&=&event&||&fixEvent(window.event);&&&&var&handlers&=&this.events[event.type];&&&&for&(var&i&in&handlers)&{&&&&&&&&this.$$handleEvent&=&handlers[i];&&&&&&&&if&(this.$$handleEvent(event)&===&false)&{&&&&&&&&&&&&returnValue&=&false;&&&&&&&&}&&&&}&&&&return&returnV};&&&&function&fixEvent(event)&{&&&&event.preventDefault&=&fixEvent.preventD&&&&event.stopPropagation&=&fixEvent.stopP&&&&return&};fixEvent.preventDefault&=&function()&{&&&&this.returnValue&=&false;};fixEvent.stopPropagation&=&function()&{&&&&this.cancelBubble&=&true;};
该函数使用了传统的绑定方法,所以它可以在所有的浏览器中工作,也不会造成内存泄露。
&&&&&&& 但是对于最初提出的5点,该函数只是满足了前四点。只有最后一点没有满足,因为在JavaScript中对for/in语句的执行顺序没有规定是按照赋值的顺序执行,尽管大部分时刻是按照预期的顺序执行,因此在不同的JavaScript版本或实现中这一语句的顺序有可能不同。
三、Dean Edward 的 addEvent() 函数的改进
CodeArray.prototype.indexOf&=&function(&obj&){&&&&var&result&=&-1&,&length&=&this.length&,&i=length&-&1;&&&&for&(&;&i&=0&;&i--&)&{&&&&&&&&if&(&this[i]&==&obj&)&{&&&&&&&&&&&&result&=&i;&&&&&&&&&&&&break;&&&&&&&&}&&&&}&&&&return&}Array.prototype.contains&=&function(&obj&)&{&&&&return&(&this.indexOf(&obj&)&&=0&)}Array.prototype.append&=&function(&obj&,&nodup&)&{&&&&if&(&!(nodup&&&&this.contains(&obj&))&)&{&&&&&&&&this[this.length]&=&&&&&}}Array.prototype.remove&=&function(&obj&)&{&&&&var&index&=&this.indexOf(&obj&);&&&&if&(&!index&)&return&;&&&&return&this.splice(&index&,&1);};function&addEvent(element&,&type&,&fun){&&&&if&(!element.events)&element.events&=&{};&&&&&&&&&&&&&&&&var&handlers&=&element.events[type];&&&&if&(!handlers)&{&&&&&&&&handlers&=&element.events[type]&=&[];&&&&&&&&if(element['on'&+&type])&{&&&&&&&&&&&&&&&&&&&&handlers[0]&=&element['on'&+&type];&&&&&&&&}&&&&}&&&&handlers.append(&fun&,&true)&&&&element['on'&+&type]&=&handleE}function&removeEvent(element&,&type&,&fun)&{&&&&if&(element.events&&&&element.events[type])&{&&&&&&&&element.events[type].remove(fun);&&&&&}}function&handleEvent(event)&{&&&&var&returnValue&=&true&,&i=0;&&&&event&=&event&||&fixEvent(window.event);&&&&var&handlers&=&this.events[event.type]&,&length&=&handlers.&&&&for&(&;&i&&&length&;&i++)&{&&&&&&&&if&(&handlers[i].call( this , event)&===&false&){&&&&&&&&&&&&returnValue&=&false;&&&&&&&&}&&&&}&&&&return&returnV}function&fixEvent(event)&{&&&&event.preventDefault&=&fixEvent.preventD&&&&event.stopPropagation&=&fixEvent.stopP&&&&return&}fixEvent.preventDefault&=&function()&{&&&&this.returnValue&=&false;};fixEvent.stopPropagation&=&function()&{&&&&this.cancelBubble&=&true;};
该函数是本人对Dean Edward 的 addEvent() 函数的改进,完全满足了最初提出的5点要求。如果大家有更好的方法,期待分享!
阅读(...) 评论()

我要回帖

更多关于 function 未定义 的文章

 

随机推荐