当前位置:编程学习 > C#/ASP.NET >>

如何在子页里面使用父页的jQuery?

页面 a.htm 里面有一个iframe,iframe指向 b.htm

a.htm 引用了jQuery.js。 b.htm 也想使用jQuery,但是我不想在 b.htm里加载一次jQuery.js,而是想直接使用父页(a.htm)里面的jQuery,他(a.htm)都已经加载好了,我(b.htm)为啥还有在加载一遍,虽然可以用缓存。


自己尝试了一下,可以使用 parent.$ 。但是发现了两个问题,第一个已经解决了,第二个还不知道怎么解决

第一个问题是要指定搜索范围 parent.$("",document),否则会在父页里面搜索。这个写个function就可以了

function $ (select){
   return parent.$(select,document);
}

第二个问题是,这种方式使用父页的jQuery,只能使用“基本功能”,扩展功能却无法使用。

所谓的扩展功能就是 使用 $.extend 方式的功能。

其实jQuery内部很多方法也都是 $.extend 的方式来实现的。怎么使用这种方法呢?



具体问题,当我使用easyUI的时候,本页面加载jQuery和easyUI,没有问题,但是按照我上面的方法,使用父页的jQuery的时候,出现js脚本错误,提示jQuery的某个函数没有定义。


--------------------编程问答-------------------- 还是多声明加载一次吧~
浏览器会判断是否已经引用的~

不要干奇怪的事情~,我最担心的还是各种浏览器对这种父子的实现不同~
那你的代码就悲惨了~

多声明一次,又不会怀孕~你说是不是~ 

不要把精力放在这种事情上~ 去研究更好的技术吧~ --------------------编程问答-------------------- --------------------编程问答-------------------- 帮顶! --------------------编程问答-------------------- 就算是你重复写1000次引用同一个js文件,就算你刷新页面1000次,也只有第一次实际会下载这个js文件的。

也就是说,浏览器是自动使用js文件的本地缓存的。

你何必舍不得写这一行代码代码呢? --------------------编程问答-------------------- 已经缓存到本地了  调用也只是调用缓存文件 除非你浏览器都没缓存文件 --------------------编程问答-------------------- 前端开发最注重的就是“独立性”。例如一个html不管放在frame中还是独立访问,其上面的js文件应用都是独立可用的。

那种刻意纠结的代码,找到一个特例就去破坏原本独立开发的js文件引用的做法,少做这类创意为好。 --------------------编程问答-------------------- 就是因为有缓存,所以才想用父页的,这样js文件有更新的话,我只需要更新父页的js文件就可以了。

虽然jQuery的更新频率不太快。

还有一个问题就是 js的加载和执行顺序,如果网速没啥问题的话,那就没啥说的了,但是如果网速太慢的话,jQuery.js还没加载完毕,就去执行 $(function (){})了,这个可不是理论上的猜测,而是在客户使用的时候,真实遇到的情况。

--------------------编程问答--------------------
引用 7 楼 u011043218 的回复:
就是因为有缓存,所以才想用父页的,这样js文件有更新的话,我只需要更新父页的js文件就可以了。

虽然jQuery的更新频率不太快。

还有一个问题就是 js的加载和执行顺序,如果网速没啥问题的话,那就没啥说的了,但是如果网速太慢的话,jQuery.js还没加载完毕,就去执行 $(function (){})了,这个可不是理论上的猜测,而是在客户使用的时候,真实遇到的情况。

$document.ready()//整个页面加载完后才运行
好好学学+系统地学习jQuery吧~

另外现在很多浏览器调试工具比如Chrome,按F12可以看每个文件加载顺序和时间... --------------------编程问答--------------------
引用 7 楼 u011043218 的回复:
就是因为有缓存,所以才想用父页的,这样js文件有更新的话,我只需要更新父页的js文件就可以了。

虽然jQuery的更新频率不太快。

还有一个问题就是 js的加载和执行顺序,如果网速没啥问题的话,那就没啥说的了,但是如果网速太慢的话,jQuery.js还没加载完毕,就去执行 $(function (){})了,这个可不是理论上的猜测,而是在客户使用的时候,真实遇到的情况。

啥叫缓存?看来你的概念跟 html 标准的技术概念不相同。

假设你写 <script type="text/javascript" src="http://csdnimg.cn/pub_topnav_2011.js"></script>,那么不管你是在几个页面写了,这个文件也就自动给这几个页面都缓存了(都提供了)。不可能再跑到子页面去下载一遍。

你的做法,反而不用缓存了。你嫌缓存不是缓存? --------------------编程问答-------------------- 如果你跟踪一下http请求,你会发现大量的js文件、图片文件等等,响应代码都是 304 而不是 200。也就说,服务器告诉网页“你的本地文件是新的,我不给你下载了”,于是浏览器就直接拿出本地缓存的js文件(或者图片文件)。

这就是一个缓存概念。不需要你自己发明纠结的缓存,已经有现成的东西了。重要地是你要能够懂得接受并利用。 --------------------编程问答-------------------- 多写一次吧,孩子,别折腾了

父子页面的js相互调用到时候很可能出现一些意向不到的情况,特别是在跨浏览器下
还有个人觉得如果应该js更新带来页面js不更新的问题的话,完全可以在js连接上加上版本号 --------------------编程问答-------------------- jQuery(parent.document).find() --------------------编程问答-------------------- 没有人知道吗?

通过这个可以透彻的了解jQuery的extend的原理。目前还没弄明白。 --------------------编程问答--------------------
引用 11 楼 yyl8781697 的回复:
多写一次吧,孩子,别折腾了

父子页面的js相互调用到时候很可能出现一些意向不到的情况,特别是在跨浏览器下
还有个人觉得如果应该js更新带来页面js不更新的问题的话,完全可以在js连接上加上版本号

恩恩,会出现很多,我就遇到过,老大说都是一样的,就调用,结果呢,调用时构造了三个窗口,一个现实的,两个隐藏的,搞得头大啊,建议还是老老实实的好啊 --------------------编程问答-------------------- 孩子,你可真是能异想天开啊

老夫见识了 --------------------编程问答-------------------- 这个不是啥异想天开,本来就是可以的。 --------------------编程问答-------------------- 多加一次又不会怀孕! --------------------编程问答-------------------- 纠结这个,你都不应该用iframe --------------------编程问答--------------------
引用 13 楼 u010793151 的回复:
没有人知道吗?

通过这个可以透彻的了解jQuery的extend的原理。目前还没弄明白。

http://www.css88.com/jqapi-1.9/jQuery.extend/
你的问题可能是加载顺序,不知道你子页面是何时使用$方法的,如果在父页面绑定之前就使用的话就会出错

--------------------编程问答--------------------

引用 18 楼 xcx573 的回复:
纠结这个,你都不应该用iframe


简单的使用没啥问题,比如$("div).html("a");

但是涉及到extend的就不行了。 --------------------编程问答-------------------- 沉了。不要沉呀。 --------------------编程问答--------------------
引用 9 楼 sp1234 的回复:
Quote: 引用 7 楼 u011043218 的回复:

就是因为有缓存,所以才想用父页的,这样js文件有更新的话,我只需要更新父页的js文件就可以了。

虽然jQuery的更新频率不太快。

还有一个问题就是 js的加载和执行顺序,如果网速没啥问题的话,那就没啥说的了,但是如果网速太慢的话,jQuery.js还没加载完毕,就去执行 $(function (){})了,这个可不是理论上的猜测,而是在客户使用的时候,真实遇到的情况。

啥叫缓存?看来你的概念跟 html 标准的技术概念不相同。

假设你写 <script type="text/javascript" src="http://csdnimg.cn/pub_topnav_2011.js"></script>,那么不管你是在几个页面写了,这个文件也就自动给这几个页面都缓存了(都提供了)。不可能再跑到子页面去下载一遍。

你的做法,反而不用缓存了。你嫌缓存不是缓存?
那整站都用到jquery这个文件的话,意思整站在服务端也就下载了一次jquery文件,其余的都是本地缓存的文件是吧?????? --------------------编程问答-------------------- 我是来学习的。。。 --------------------编程问答--------------------
引用 22 楼 hky19880824 的回复:
Quote: 引用 9 楼 sp1234 的回复:

Quote: 引用 7 楼 u011043218 的回复:

就是因为有缓存,所以才想用父页的,这样js文件有更新的话,我只需要更新父页的js文件就可以了。

虽然jQuery的更新频率不太快。

还有一个问题就是 js的加载和执行顺序,如果网速没啥问题的话,那就没啥说的了,但是如果网速太慢的话,jQuery.js还没加载完毕,就去执行 $(function (){})了,这个可不是理论上的猜测,而是在客户使用的时候,真实遇到的情况。

啥叫缓存?看来你的概念跟 html 标准的技术概念不相同。

假设你写 <script type="text/javascript" src="http://csdnimg.cn/pub_topnav_2011.js"></script>,那么不管你是在几个页面写了,这个文件也就自动给这几个页面都缓存了(都提供了)。不可能再跑到子页面去下载一遍。

你的做法,反而不用缓存了。你嫌缓存不是缓存?
那整站都用到jquery这个文件的话,意思整站在服务端也就下载了一次jquery文件,其余的都是本地缓存的文件是吧??????



缓存是缓存,但是无法控制,我想更新怎么更新?修改应用地址?还是修改参数(v=123)?

那么是不是每个页面都要修改一遍 <script type="text/javascript" src ???

另外子页面是使用缓存了,但是并不意味着就不会向服务器提交申请。

你们当 304 是空气吗?而且不同的浏览器有不同的处理方法,而且还有不同的选项(缓存还是不缓存)。
有办法针对所有浏览器都做相同处理吗?要缓存就缓存,要更新就更新?


304 Not Modified
如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。 --------------------编程问答-------------------- 引用错了,抱歉呀。 --------------------编程问答-------------------- 还不如丢掉iframe 呢, 直接div搞定,iframe 本来就不是一个很好的东西。 --------------------编程问答-------------------- 多引用一次吧,除第一次请求外,其他的都是本地缓存. --------------------编程问答--------------------
引用 26 楼 blue_apple2006 的回复:
还不如丢掉iframe 呢, 直接div搞定,iframe 本来就不是一个很好的东西。


一个页面里实现n个表的增删改查,用iframe可以指向单独的页面去处理。都用div的话,复杂度直线上升。

--------------------编程问答-------------------- iframe 可以通过 parent.window.$("#dialogid");得到父窗口的Jquery 对象。我通过这种方法关闭 Jquery dialog 都没问题,dialog 也算是 扩展吧。
实在不行就在 父窗口写 function,然后 iframe 通过 parent.window.function() 调用,效果跟 直接在父窗口调用function()一样。 --------------------编程问答--------------------
引用 4 楼 sp1234 的回复:
就算是你重复写1000次引用同一个js文件,就算你刷新页面1000次,也只有第一次实际会下载这个js文件的。

也就是说,浏览器是自动使用js文件的本地缓存的。

你何必舍不得写这一行代码代码呢?


多一句又不会怀孕 --------------------编程问答--------------------
引用 28 楼 u010793151 的回复:
Quote: 引用 26 楼 blue_apple2006 的回复:

还不如丢掉iframe 呢, 直接div搞定,iframe 本来就不是一个很好的东西。


一个页面里实现n个表的增删改查,用iframe可以指向单独的页面去处理。都用div的话,复杂度直线上升。


不用啊,你只用把iframe指向的页面填充到div里就行了
我就是这么干的,一个页面实现所有功能,页面按需加载到不同div --------------------编程问答--------------------
引用 31 楼 xcx573 的回复:
Quote: 引用 28 楼 u010793151 的回复:

Quote: 引用 26 楼 blue_apple2006 的回复:

还不如丢掉iframe 呢, 直接div搞定,iframe 本来就不是一个很好的东西。


一个页面里实现n个表的增删改查,用iframe可以指向单独的页面去处理。都用div的话,复杂度直线上升。


不用啊,你只用把iframe指向的页面填充到div里就行了
我就是这么干的,一个页面实现所有功能,页面按需加载到不同div


因为我是做 tab标签的,可以同时加载多个表的增删改查,如果只是单纯的加载到div里面的话,id名称会冲突。

比如第一个表的增删改查里面的显示数据的<table> id 是 "grid",那么第二个表的增删改查的<table> id 还是 "grid",这样就乱套了,还得给他们起不同的名称。

--------------------编程问答--------------------
引用 10 楼 sp1234 的回复:
如果你跟踪一下http请求,你会发现大量的js文件、图片文件等等,响应代码都是 304 而不是 200。也就说,服务器告诉网页“你的本地文件是新的,我不给你下载了”,于是浏览器就直接拿出本地缓存的js文件(或者图片文件)。

这就是一个缓存概念。不需要你自己发明纠结的缓存,已经有现成的东西了。重要地是你要能够懂得接受并利用。

大哥,很想知道您这跟踪HTTP请求怎么搞?
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,