In CoffeeScript, though this code is almost identical to JavaScript:
tabs_html = "<div id='nm-container'><ul><li><a href='#tabs-1'>Guidelines</a></li><li><a href='#tabs-2'>Test</a></li></ul>
<div id='tabs-1'><p>something1</p></div><div id='tabs-2'><p>something2</p></div></div>"
$("#nm-toolbar").append(tabs_html)
$("#nm-container").tabs()
It doesn't work. Funny thing is it does work when trying the last line: $("#nm-container").tabs()
from the console. I'm attaching the full code below. Note that I'm using CoffeeMarklet to generate the bookmarklet which seems to work only on chrome.
s1 = window.document.createElement('script')
s1.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js'
window.document.body.appendChild(s1)
$ ->
s2 = window.document.createElement('script')
s2.src = 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js'
window.document.body.appendChild(s2)
jqueryUIcss = window.document.createElement('link')
jqueryUIcss.rel = 'stylesheet'
jqueryUIcss.type = 'text/css'
jqueryUIcss.href = 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/themes/blitzer/jquery-ui.css'
window.document.head.appendChild(jqueryUIcss)
if $("#nm-toolbar").length == 0
toolbar = "<div id='nm-toolbar'></div>"
$("body").append(toolbar)
$("#nm-toolbar").css({
'background': '#fafafa',
'height': '500px',
'width': '400px',
'position': 'fixed',
'bottom': '0px',
'right': '20px',
'padding': '5px'
})
tabs_html = "<div id='nm-container'><ul><li><a href='#tabs-1'>Guidelines</a></li><li><a href='#tabs-2'>Test</a></li></ul>
<div id='tabs-1'><p>something1</p></div><div id='tabs-2'><p>something2</p></div></div>"
$("#nm-toolbar").append(tabs_html)
$("#nm-container").tabs()
This should work:
You'd want to uncheck the "add jQuery" option on the CoffeeMarklet page to if using the above code
Update: Added checking for presence of jQuery and jQuery UI so it isn't loaded unnecessarily.
Although it could be improved by checking to see if the correct version of jQuery is already present as Ben Almans code does.Attribution:
Beygi gave a lovely snippet for loading javascript resources one after another.
I suspect that the problem is that you're loading jQuery UI asynchronously. The line
starts loading jQuery UI, but your code continues before jQuery UI has necessarily been loaded. That would explain why the
tabs()
call in your code fails, but it succeeds when you do it from the console, after the script has had time to load.You should be able to fix this by making the rest of your code run from the callback
Edit: And for that matter, you really should do the same thing with
s1
, or else the$ ->
call could fail. The fact that it's succeeding suggests that either you have jQuery cached in your browser, or the page already has jQuery on it. You should also usenoConflict
to avoid overwriting the page's existing jQuery version. The Run jQuery Code Bookmarklet that Acorn linked to does all of these things (and in a more cross-browser manner than the code in this answer).