There are many solutions to the edit-in-place problem, but I wanted to make an easy solution that wasn’t as complicated as some of the other edit-in-place JavaScript scripts, like jEditable.
Features:
I want JavaScript to feel as smooth as a native application. I think scrolling is one of the largest issues, but this code snippet is more about aborting the jQuery AJAX event before it has a chance to complete.
There’s no good documentation in the jQuery docs about how to do this. other than to just use this command on an existing AJAX request:
var request = $.ajax('/url', data, callback);
request.abort();
That doesn’t work. Well, it does work, but if you try to run it again or synchronously with other requests, you’ll run into issues.
The issues are non-trivial, but avoidable. I’ll cut to the chase; I came up with a solution, then found that somebody did it better and more correct.
Rather than spreading incorrect (rather, incomplete) code, I’ll just show the proper way to do it and then link to the source.
_isAbort: function(xhr, o){
var ret = !!( o.abortIsNoSuccess
&& ( !xhr
|| xhr.readyState === 0
|| this.lastAbort === o.xhrID ) );
xhr = null;
return ret;
},
That’s a lot of work. Don’t bother, just use jquery.ajaxManager v.3.0: http://www.protofunc.com/scripts/jquery/ajaxManager3/
Note, however, that if you just google “jquery ajax manager” or some variant, you will end up at the old version, which is at: http://www.protofunc.com/scripts/jquery/ajaxManager/. They could do some work on their google juice pointing to the latest version.
Hope this helps somebody else, even if part of a google search for “jquery ajax stop request” someday.
One of the best ways to write code that you tend to have to re-use is to put it in the public domain. That way when you need it again, it's a Google search away from your own blog.
This is a rather simple working example of default text on an input field. Click on the field, the text disappears, only to reappear if the user clicks somewhere else on the page without typing. The input also has a special class signifying that it is empty, so you can style the empty input.
This Storybird is written by thesundaybest, found on twitter: @thesundaybest.
A Faulty Heist by thesundaybest on StorybirdStorybirds like this remind me why I love working with a community of artists and children's literature.
The wonderful django-mingus includes a few separate syntax highlighters, including one from django-sugar. However, the pygmentize template filter only works on <code> blocks and tries to guess the language.
A better syntax would be to include the language in the class of the code block, like so:
<code class="python">
import this
print [r for r in range(0,10,2)]
</code>
You can use this template filter, which is adapted from the Pygments Rendering Template Filter at Django Snippets.
import re
import pygments
from django import template
from pygments import lexers
from pygments import formatters
register = template.Library()
regex = re.compile(r'<code(.*?)>(.*?)</code>', re.DOTALL)
@register.filter(name='pygmentize')
def pygmentize(value):
last_end = 0
to_return = ''
found = 0
for match_obj in regex.finditer(value):
code_class = match_obj.group(1)
code_string = match_obj.group(2)
if code_class.find('class'):
language = re.split(r'"|\'', code_class)[1]
lexer = lexers.get_lexer_by_name(language)
else:
try:
lexer = lexers.guess_lexer(str(code_string))
except ValueError:
lexer = lexers.PythonLexer()
pygmented_string = pygments.highlight(code_string, lexer, formatters.HtmlFormatter())
to_return = to_return + value[last_end:match_obj.start(0)] + pygmented_string
last_end = match_obj.end(2)
found = found + 1
to_return = to_return + value[last_end:]
return to_return
This is a template filter, which can be applied like so:
You can read more about custom tempalte filters at the Django Project: Writing Custom Template Filters.