def bagfactor sleep(2) rand(50) / 10.0 end
| Up to... | User response |
|---|---|
| 0.1 second | instantaneous |
| 1 second | responsive |
| 10 seconds | slow |
| > 10 seconds | gone |
– About Face 3
http://dbdb.local/
class DbsController < ApplicationController
def show
@db = Db.find(params[:id])
respond_to do |format|
format.html
format.js do
render :partial => "profile",
:locals => { :db => @db }
end
end
end
end
$(".db-list a").click(function() {
link = $(this);
$.ajax({url: $(this).attr("href"),
success: function(src) {
link.parents("dt").after("<dd>" + src + "</dd>");
link.unbind('click').click(function() {
$(this).parents("dt").next("dd").toggle();
return false;
})
}
});
return false;
});
$(".db-list a").click(function() {
link = $(this);
link.parents("dt").after('<dd class="spinner"></dd>')
.next("dd").hide().slideDown("slow");
link.unbind("click").click(function() {
$(this).parents("dt").next("dd").slideToggle();
return false;
});
$.ajax({url: link.attr("href"),
success: function(src) {
link.parents("dt").next("dd").html(src)
.removeClass("spinner");
}
});
return false;
});
jQuery.fn.loadContentInOrder = function() {
return this.each(function() {
link = $(this);
$.ajax({url: link.attr("href"),
success: function(src) {
display = link.parents("dt").next("dd").html(src)
.removeClass("spinner")
.next("dt").find("a").loadContentInOrder();
}
});
});
};
$(".db-list a").each(function() {
$(this).parents("dt").after("<dd class=\"spinner\"></dd>")
.next("dd").hide();
});
$(".db-list a").click(function() {
$(this).parents("dt").next("dd").slideToggle();
return false;
});
$(".db-list a:first").loadContentInOrder();
{ "db": {
"id": 13,
"name": "Tyler Hansbrough",
"occupation": "UNC Basketball Player",
"bagfactor": 1.3,
"avatar_id": 61
}
}
class DbsController < ApplicationController
def show
@db = Db.find(params[:id])
respond_to do |format|
format.html
format.js { ... }
format.json do
render :json => { :bagfactor => @db.bagfactor }
end
end
end
end
jQuery.fn.loadBagfactor = function() {
img = $(this);
$.ajax({url: this.parents("dd").prev("dt")
.find("a").attr("href"),
data: { format: "json" }, dataType: "json",
success: function(db) {
img.replaceWith(db.bagfactor);
$("img.spinner:first").loadBagfactor();
}
});
};
$("img.spinner:first").loadBagfactor();
http://dbdb.local/dbs/new
<% form_for @avatar, :html => { :multipart => true } do |f| %>
<%= f.file_field :image %>
<% end %>
<% javascript_tag do %>
$("input").change(function() {
$(this).hide().after('<%= image_tag "spinner.gif" %>');
$(this).parents('form').submit();
});
<% end %>
<%= image_tag @avatar.image.url(:thumb) %>
<% javascript_tag do %>
$("form", top.document).append(
'<%= hidden_field_tag "db[avatar_id]", @avatar.id %>');
<% end %>
$("input[type=file]").replaceWith(
'<iframe src="/avatars/new"></iframe>');
(It doesn't matter)
“At least 80 percent of the time it takes to display a web page happens after the HTML document has been downloaded.”
— Steve Souders, High Performance Web Sites
expires headerlink_to_remote Helper
<%= link_to_remote @db.name, :url => db_url(@db),
:method => :get %>
# <%= link_to_remote @db.name, :url => db_url(@db),
# :method => :get %>
<a href="#" onclick="$.ajax({data:'authenticity_token=' +
encodeURIComponent('2b79b50423e099...'),
dataType:'script', type:'get',
url:'http://dbdb.local/dbs/13'}); return false;">
Tyler Hansbrough
</a>
# <%= link_to_remote @db.name, :url => db_url(@db), # :method => :get %> <a href="/dbs/13" data-remote="true" data-method="get"> Tyler Hansbrough </a>
# <%= link_to_remote @db.name, :url => db_url(@db),
# :method => :get %>
# <a href="/dbs/13" data-remote="true" data-method="get">
# Tyler Hansbrough
# </a>
$("a[data-remote=true]").click(function() {
$.ajax({url: $(this).attr("href"),
method = this.dataset.method,
success: function(src) {
link.parents("dt").after("<dd>" + src + "</dd>");
}
});
});
<a href="/dbs/13" class="remote">
Tyler Hansbrough
</a>
<!--
$("a.remote").click(function() {
$.ajax({url: $(this).attr("href"),
...
});
});
-->