如何将jQuery传递给eval'd代码?

时间:2011-10-06 22:14:27

标签: javascript jquery jsfiddle

首先,查看我的fiddle fiddle

jsFiddle很好,但有时它运行有点慢,所以我制作了这个简单的纯JS小提琴(可以在本地运行)

到目前为止工作得很好,但我希望能够在我的小提琴中使用jQuery。在左下角的框中键入alert(typeof $);,然后按“运行”查看我的意思(未定义)。

那么如何将jQuery传递给iframe并为其提供正确的上下文?我怀疑我可以设置doc.contentWindow.$=$或类似的东西,但我仍然需要提供正确的上下文,以便它知道在哪里找到元素。我该怎么做?


iframe.contentWindow.$ = $.proxy($,iframe.contentWindow);

这也不起作用。让我访问jQuery,但上下文仍然是错误的。


iframe.contentWindow.$ = function(s){return $(s,doc);};

那种作品......但它有点像黑客。

2 个答案:

答案 0 :(得分:1)

为什么不像jsfiddle那样做呢?它只是在head的{​​{1}}中包含jQuery(或您要求的任何框架)的脚本标记。

如果你查看......呃“外部”iframe(创建的一个jsfiddle)的head,你会看到他们只是把它扔进那里:

iframe

同样的事情适用于“on ready”和“on load”选项,jsfiddle只是在你的javascript中包含适当的调用,然后将其注入iframe。

稍微修改一下代码,您可以创建一个<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.4.js"></script> 元素:

script

然后将该元素附加到var doc = iframe.contentWindow.document; var jqueryTag = doc.createElement('script'); jqueryTag.type = 'text/javascript'; jqueryTag.src = 'http://code.jquery.com/jquery-1.6.4.js';

答案 1 :(得分:1)

我稍微调整了你的小提琴:http://jsfiddle.net/gilly3/XcSYz/3/

首先,你不能在主体的innerHTML中写一个doctype,并期望它为你做任何事情。与charset元标记相同。我把所有这些都移到了document.write电话。

您正在评估编辑器输入的脚本标记。首先,如果您在html框架中编辑脚本标记,则会抛出像疯了一样的错误。其次,如果在HTML窗格中的脚本标记中放置alert("hello"),那么每次按键时,都会收到警报。第三,您正在父窗口的上下文中评估脚本。我在单击运行并使用正确的上下文时更改了要评估的html脚本标记。

由于你不想每次都重写文档(你不能,例如doctype),我稍微修改它来做一些dom操作。它删除并替换样式标记,并仅将HTML窗格内容写入正文的innerHTML。

这是一个有趣的小项目,你正在尝试。 jsFiddle有缺陷,需要一些更新。我不知道你的纯粹的客户端小提琴是多么可行 - jsFiddle非常强大(尽管有它的错误),但是尝试一下你的方法是一个很好的练习。

修改this version中又包含一项更改:我修改了您的textareas以使用width: 50%; height: 50%;,而不是设置rightbottom。那些在IE或FF中无法正常工作。