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函数。
由于子页面已加载到主文档中并加载文档上下文,因此无法以任何不需要更改子页面的方式更改子页面使用的上下文。
一些可能的解决方法:
-
如果子页面是完整页面,请将其加载到iFrame中。
-
完全杀死加载的脚本:
$.ajax ( { url: "/ajax/Index", success: function (data) { var safePage = $(data).find ("script"). Remove (); safePage.appendTo ".externalpage"); } } );
-
加载2个jQuery副本,只有第二个是你为此目的而攻击的副本。 也许喜欢: