2010-07-29 70 views
1

我已经有一组函数用于扩展文档(即绑定/解除绑定)。所以,我可以做的东西,如:document.bind('load',someAction,{})为iframes扩展文档DOM

但如果我这样做不工作:$('some_iframe').contentWindow.document.bind(...) 而显然,$('some_iframe').contentWindow.document.prototype不存在。

编辑: 以下是代码故障:

//the eggplant library 
eggp = { 
    extend: function(dest, source){ 
     for(var prop in source) 
      dest.prototype[prop] = source[prop]; 
     return dest; 
    }, 
    //other functions below... 
    bind{}, 
    unbind{} 
} 
//extend the DOM 
eggp.extend(Document, eggp); 
//extending the iframe document DOESN'T WORK 
eggp.extend(someiframe.contentWindow.document, eggp); 

我检查,看看是否someiframe.contentWindow.document是不确定的,但它返回object HTMLDocument

+0

您可以提供扩展文档的代码吗? – 2010-07-29 00:38:30

+0

与实际问题没有直接关系,但是当您承认自己基本上正在复制Prototype时,为什么要使用自己的库? – 2010-07-29 00:54:22

+0

我使用我自己的库有很多原因:我不能让自己在不理解的情况下使用别人的代码;我无法理解jQuery或原型,所以我开始写我自己的;我正在设计图书馆的功能,用于我正在编程的网络建筑软件......等。 我并不完全复制原型,因为我无法弄清楚他们在做什么(因为我不是在JavaScript中足够好)。所以,我想我只是在做任何事情。 – Azmisov 2010-07-29 04:06:03

回答

1

你不能这样做,至少不能以跨浏览器的方式。理想情况下,您可以扩展HTMLDocument对象的prototype,但当然,IE首先不具有此对象。作为一种解决方法,您可以创建一个函数来创建一个IFrame并自动扩展它的document对象,并专门使用该函数来创建IFrame,但是如果这些帧已经在页面上,那么您可以做的并不多没有循环遍历每一个并手动扩展它。

$('iframe').each(function() { 
    MyLibrary.extend(this.contentWindow.document, MyDocumentPrototype); 
}); 

(假设jQuery的,插入自己的库代码在这里得到所有的IFrame。)

在一般情况下,虽然,扩展内置DOM对象是bad idea,所以你应该拿出另一种方式做你想做的事。

+0

是的,我开始意识到扩展DOM的问题,但我认为我会继续使用它,直到我学会了足够的知识,以便能够创建更好的界面。无论如何... 在这段代码中,类似于你的例子,使用我的库: 'eggp.extend(someiframe.contentWindow.document,eggp);' 将返回'dest.prototype is undefined' – Azmisov 2010-07-29 04:16:16

+0

@Azmisov:' document'没有'prototype'对象。你必须直接扩展它:'document.property1 =“blah”'等 – 2010-07-29 04:28:21

+0

谢谢,这就是我需要知道的。 – Azmisov 2010-07-30 04:04:11

0

你是如何开始延伸document?难道你不需要扩展HTMLDocument.prototype而不是document.prototype,因为后者不是构造函数?

意思是你在iframe中扩展了错误的东西?如果我错了,请告诉我你最初如何扩展它。

+0

我的扩展函数需要参考目标和来源。然后遍历所有源函数并扩展目标。所以它是:dest.prototype [prop] = src [prop],模拟我相信prototype.js所做的。所以,为了用我的函数库扩展文档,我说:library.extend(Document,library);它适用于执行document.bind(...),但不适用于iframe.contentWindow.document。 那么,我应该改用HTMLDocument吗? – Azmisov 2010-07-29 00:50:00

+0

我检查了HTMLDocument,并没有改变。 – Azmisov 2010-07-29 04:22:01

-1

我猜“some_iframe”是一个ID。要通过jQuery选择对象,您需要使用#,就像在CSS中一样。所以它应该是$('#some_iframe').eq(0).contentWindow.document.prototype

如果您不使用#用于通过TAG名称进行选择。

因此$('p')会选择页面上的所有<p>标签。

+0

不知道为什么downvote。但我很确定我说的正确。 – Strelok 2010-07-29 00:43:56

+0

与问题无关。 (我没有降低你的纪录。) – 2010-07-29 00:46:13

+0

我没有downvote你的答案,但我使用我自己的图书馆。 – Azmisov 2010-07-29 00:52:01