jquery默认上下文

我想将一个页面(带有js,css)加载到同一文档中的DIV中,加载页面中的javascript不能应用于父页面内容。 是否可以在加载的页面上设置类似默认上下文的内容? 请看下面的基本示例

父页面:

normal

data $(document).ready(function () { $.ajax({ url: "/ajax/Index", success: function (data) { $(".externalpage").html(data); } }); })

/ ajax / Index“subpage” – 我不会改变此页面的内容。

 

ajax

$(document).ready(function () { $("h1").text("xxxxxxxxxxxxx"); })

从您的注释中,您希望加载的脚本在某种“部分”文档上下文中执行,仅限于您的externalpage元素的内容(即只有加载的

元素必须更改,而不是

之外的元素) 。

这可以通过暂时覆盖$.find() (而不是$ .fn.find() ,这不是同一件事)来实现,并且如果未指定或等于文档本身,则替换context参数中的externalpage元素:

 $(document).ready(function () { $.ajax({ url: "/ajax/Index", success: function(data) { var $root = $(".externalpage"); var realFind = $.find; $.find = function(query, context, extra, seed) { return realFind.apply(this, [ query, context && context !== document ? context : $root[0], extra, seed ]); }; $root.html(data); $.find = realFind; } }); }) 

jsFiddle提供了一个echo服务,我可以用来测试这个解决方案。 你可以在这里看到结果。

似乎没有办法在jQuery中轻松设置默认上下文。 但是,您可以通过缓存上下文来解决这个问题,并.find()调用.find()

 var $c = $('.externalpage'); $c.find('h1').text('xxxxxxxxxxxx'); 

它有点笨拙,你必须改变你编码的方式。

或者,您可以将其封装在一个函数中:

 var $j = function(a) { return $(a, '.externalpage'); }; // and then you can use that like $j('h1').text('xxxxxxxxxxxxx'); // if you want to revert to the global jQuery object, just use $ instead of $j 

这很粗糙但应该有效。 它将jQuery复制到另一个变量,然后用自定义函数替换$ ; 因此你可以做到你想要的。

 var $copy = $; // Original jQuery $ = function() { if(!(this instanceof $)) return new $(); }; // fake jQuery function $.prototype.ready = function(f) { f(); // fake ready, just execute function directly } $.prototype.text = function(t) { $copy(".externalpage h1").text(t); // set only the correct h1 to the text } 

现在,在获取的文件中:

 $(document).ready(function () { $("h1").text("xxxxxxxxxxxxx"); }) 

会发生什么,它将执行假的jQuery函数,如上所定义,它应该按你的意愿工作。

您必须在自己的文件中使用$copy作为真正的jQuery函数。

由于子页面已加载到主文档中并加载文档上下文,因此无法以任何不需要更改子页面的方式更改子页面使用的上下文。

一些可能的解决方法:

  1. 如果子页面是完整页面,请将其加载到iFrame中。

  2. 完全杀死加载的脚本:

     $.ajax ( { url: "/ajax/Index", success: function (data) { var safePage = $(data).find ("script"). Remove (); safePage.appendTo ".externalpage"); } } ); 

  3. 加载2个jQuery副本,只有第二个是你为此目的而攻击的副本。 也许喜欢: