2013-05-21 51 views
4

我使用jQuery的AJAX从服务器获取新内容。数据加载中JSON:jQuery完全用另一个DOM替换元素的DOM - 更快的方式?

$.ajax({ 
    url: url, 
    data: { 
     'ajax': '1', 
    }, 
    dataType: 'json', 
    success: somefunction 
}); 

对于服务器端应用程序的限制,我不能设置更多的JSON变量里面,所以我要加载到的一切内容。这就是为什么我要加载结果到了jQuery,比搜索和替换网页的某些元素,像这样(在somefunction使用):

var somefunction = function(data) { 
    var con = $('<div></div>').html(data.content); // just $(data.content) is not working 
    $('div#mainContent').html(con.find('div#ajax-content').html()); 
    ... // same process with three more divs 
} 

编辑:请注意,我必须做同样的过程,以取代三个divs!

还有更多关于这个,但作为例子,它是足够的,我希望。我的问题:对于某种逻辑方式,我期望将结果加载到DOM($(data.content)),解析为html(con.find('dix#ajax-content').html())并返回到DOM($('div#mainContent').html())对我来说似乎失去了一些资源并降低了性能,所以我想知道是否有什么更快的方式做到这一点,直接加载DOM,如:

$('div#mainContent').dom(con.find('div#ajax-content').dom()); 

我试图谷歌,但也许我不知道在类型还jQuery的文档不会对我帮助很大。

一些事实:

  • 的jQuery 1.9.1
  • jQuery UI的1.10.3可

最后,我知道,这将是更加好做与服务器端的东西应用程序来提供更多的JSON变量,但是,我需要编写不那么容易的代码和平,这需要更长的时间来开发我现在没有的东西。在客户端执行它现在是暂时的解决方案,但是,我不想降低性能。

侧面的问题:

是正确使用find()功能在这种情况下,或有什么更好的呢?

EDIT 2(不工作解析字符串) 我期待这个工作,但它不是:

content = '<div id="ajax-title">Pečivo běžné, sladké, slané</div> 
<div id="ajax-whereami"><a href="/category/4">Chléba a pečivo</a> » Pečivo běžné, sladké, slané</div>'; 
$(content); 
+0

尝试data.content.toString() – basarat

+0

@BASarat我假设data.content是一个字符串。 – HMR

+0

@BASarat比我无法解析它并找到请求中特定div的内容。无论如何''data.content'是字符串。这对标记为“不起作用”的行没有帮助。 – tomis

回答

1

其实,$(data.content)应该工作得很好,但你要记住,顶层元素只能通过.filter(),而不是.find()到达。如果你想要的目标元素至少比根目录深一级,你应该使用.find();在下面的示例中,您可以在适当的位置替换.filter().find()

var $con = $(data.content); 
$('div#mainContent') 
    .empty() 
    .append($con.filter('div#ajax-content')) 
    .append($con.filter('div#another-id')) 
    .append($con.filter('div#and-another-id')); 

您还可以选择结合在一起:

.append($con.filter('div#ajax-content, div#another-id, div#and-another-id')); 

最后,由于标识应该只是一个文档中出现一次,你可以删除div部分:

.append($con.filter('#ajax-content, #another-id, #and-another-id')); 

更新

O凯,似乎jQuery不正确地评估data.content时有错误的地方换行;这应该适用于所有情况:

var wrapper = document.createElement('div'); 
wrapper.innerHTML = data.content; 

var $con = $(wrapper); 
+0

请看看我的编辑为'$(data.content)'really don' t工作 – tomis

+0

@tomis您没有正确阅读我的答案;它工作正常[在这里](http://jsbin.com/iluvus/1/)u唱'.filter()'而不是'.find()'。 –

+0

不,问题在解析,但我已经发现它:有经纪人这是经纪。删除换行符,它正常工作。 – tomis

0

你可以使用.load,但我相信它本质上只是同一事物的包装:

$("#mainContent").load(url + " #ajax-content", data); 

您可以通过发送只有特定的内容(Ajax)提高在服务器端性能(从低到下载和分析),虽然这可能是困难的。

除此之外,你最好的选择是使用vanilla JS over jQuery,至少为了追加(直接使用innerHTML)。

+0

也许,你会纠正我,但是我不能处理使用'.load()'的错误状态,我可能吗? ,我必须在不同的地方替换3个div的内容,以及页面标题(这很简单),但是三个请求是不可接受的(innerHTML解决方案,加载解决方案),但是无论如何谢谢 – tomis

+0

@tomis你仍然可以在三个单独的div上执行'innerHTML',它只需要一个循环 –

+0

'.load()'清除目标元素吗?我认为它只附加到它 –

2

我不知道它这将帮助:

$('div#mainContent').replaceWith(con.find('div#ajax-content')) 
.attr("id","mainContent") 

现在你不必设置元素的html和获得的的HTML您刚从JSON创建的元素。不知道这实际上是否更快,但它确实跳过了2个html()步骤。

+0

嘿,这可能会有所帮助...我可以在请求中替换ids,因此它会比看起来更容易: '$('div#mainContent')。replaceWith(con.find('div#mainContent'));'它会起作用吗?它是否有效?(我是个愚蠢的人,我自己没有找到) – tomis

+0

根据文档它应该工作replaceWith接受一个字符串,元素或jquery对象作为参数http://api.jquery.com/replaceWith/ – HMR

+0

这将保存一个'.find()'功能从我的脚本。将尝试,如果它会工作,你的答案是接受答案的候选人(也许一些编辑会适合未来的访客:-))。 – tomis