javascript - SyntaxError: '[object HTMLDocument]' är inte en giltig selektor i Firefox


Att ladda mitt lokala js-bibliotek och köra ett alert-kommando.

var jq = document.createElement('script');
jq.src = "http://127.0.0.1/js/jquery-3.3.1.min.js";
document.getElementsByTagName('head')[0].appendChild(jq);
$(document).ready(function(){
alert("hello world");
});

1.I Chromes inspektör--konsol
Popup-fönster med hellow world, inget problem.

2. i Firefoxs konsol.
Det stöter på ett fel enligt nedan:

SyntaxError: '[object HTMLDocument]' is not a valid selector

Varför kan inte kodsnutten köras i Firefoxs konsol?

Svar #1

Vid den tidpunkt då dessa kommandon matas in i konsolen är $ inte jQuery - det är snarare en hjälpfunktion som tillhandahålls av webbläsaren och som är mycket lik document.querySelector. Se dokumentationen om de inbyggda hjälpfunktioner som finns tillgängliga i vissa webbläsare.

Du kan se källkoden för Firefox $ här:

WebConsoleCommands._registerOriginal("$", function(owner, selector) {
  try {
    return owner.window.document.querySelector(selector);
  } catch (err) {
    // Throw an error like `err` but that belongs to `owner.window`.
    throw new owner.window.DOMException(err.message, err.name);
  }
});

Även om $ vore jQuery, raden

$(document).ready(function(){

skulle inte hänvisa till jQuery ännu, eftersom du just har infogat skriptet - det har nödvändigtvis inte hämtats och tolkats än. Så det kommer fortfarande att hänvisa till querySelector-aliaset, och

document.querySelector(document)

har ingen mening.

Den bästa lösningen skulle vara att bifoga en load-hanterare till det infogade skriptet, så att du kan köra en funktion när jQuery har laddats. Till exempel:

const jq = document.createElement('script');
jq.src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js";
document.head.appendChild(jq);
jq.addEventListener('load', () => {
  console.log("hello world");
  console.log($ === jQuery);
});

När jQuery har laddats kommer det att säkerställa att window.$ nu pekar på jQuery istället för querySelector-aliaset; utdraget ovan kommer att logga true efter en stund.