子页面引用父页面的jQuery时使用字符串选择符的问题

1,如果有父子两个页面,一个是顶端页面,一个是iframe中的页面。
有时候我们希望从子页中引用父页中的函数,通常可以这样来引用:window.top.myFunctionName.
正常情况下这是没问题的,比如父页中有一个

function sayHello(name){
  alert("good day "+name);
}


IFrame子页中就可以这样使用:

var sayHello=window.top.sayHello;
sayHello("wzy");

 


2,如果是jQuery呢,比如我们父页中引入了jquery.js,iFrame子页中不想重复引用,
我们可能希望能通过如下代码来使用jQuery

var $ = window.top.jQuery;
$("#mybutton").click(
  function(){alert('hi');}
);


事实上这样是不行的。通过研究jquery.js的源码,我们发现了如下代码:

(function( window, undefined ) {
  var     //。。。。这里省略了很多,
    document = window.document;
  //....这里省略了很多。

  jQuery.fn = jQuery.prototype = {
    constructor: jQuery,
    init: function( selector, context, rootjQuery ) {
   //。。。。这里省略了很多
   if ( typeof selector === "string" )
    //。。。。这里省略了很多
    elem = document.getElementById( match[2] );
   //。。。。这里省略了很多
  }

  //。。。。这里省略了很多

)(window);

看明白了吗
引用jquery.js时,执行了一个自执行函数,把当前的运行页面window传了进去。
然后执行$(selector)时,就用那个window的document来进行相关对象查找。
所以对我们的例子,在iframe子页面中执行$(stringSelector),实际上查找的是父页面的对象!

那如果想查找本页面的对象应该怎么写呢,
可以这样写

var $ = window.top.jQuery;

function $s(strSelector) {
    return $(document).find(strSelector);
}

$s("#mybutton").click(
  function(){alert('hi');}
);

当然,写法有点怪。
如果觉得没必要这样,那还是在iframe页面也老老实实引用jQuery.js吧。

 

posted @ 2017-04-01 15:31  wzy77cn  阅读(657)  评论(0)    收藏  举报