Search code examples
javascriptjquerybookmarklet

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


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.


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>