how to inject jQuery and use it in the same bookmarklet?

bookmarklet, javascript, jquery

Solution

Use `onload` callback of the new script element to initialize your own jQuery code

(function(doc) {

  function doStuff() {
    console.log('jQuery version ', $.fn.jquery, ' loaded')
    $('h1').text('Updated Title').css('color', 'red');
  }

  if (typeof jQuery == 'undefined') {
    var script_jQuery = document.createElement('script');
    script_jQuery.src = 'https://code.jquery.com/jquery-latest.min.js';

    // call doStuff() after jQuery.js loads
    script_jQuery.onload = doStuff;

    doc.body.appendChild(script_jQuery);
    console.log('script_jQuery appended to body');
    
  } else {
    console.log('jQuery already included ...');
    // initialize your code using existing version
    doStuff();
  }
})(document)
<h1>Blank</h1>

Problem

I can successfully inject jQuery to a page with the following bookmarklet: ``` javascript: void((function(doc) { if (typeof jQuery == 'undefined') { var script_jQuery = document.createElement('script'); script_jQuery.setAttribute('src', 'https://code.jquery.com/jquery-latest.min.js'); Node.prototype.appendChild.call(document.body, script_jQuery); console.log('jQuery included ^_^'); } else { console.log('jQuery already included ...'); } })(document)); ``` Is there a way to use the just injected jQuery within the same bookmarklet? I tried putting `console.log(jQuery.toString())` after the apend part, but it didn't work. It seems to me that jQuery is only available for using after the bookmarklet finishes.

Original source