网站搜索

javascript - 语法错误:'[object HTMLDocument]' 在 Firefox 中不是有效的选择器


加载我的本地 js 库并运行一个 alert 命令。

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. 在 Chrome 的检查--控制台中
弹出一个带有 hellow world 的窗口,没有问题。

2. 在 Firefox 的控制台中。
它出现如下错误:

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

为什么这段代码无法在 Firefox 的控制台运行?

答案#1

在将这些命令输入控制台时,$ 不是 jQuery —— 相反,它是由 浏览器 提供的一个 辅助函数,与 document.querySelector 非常相似。请参阅某些浏览器提供的内置辅助函数的文档。

你可以在这里查看 Firefox 的 $ 源代码:

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);
  }
});

即使 $ 是 jQuery,这一行

$(document).ready(function(){

还不会引用 jQuery,因为你刚刚插入了脚本——它不一定已经被下载和解析完成。所以,它仍然会引用querySelector别名,并且

document.querySelector(document)

毫无意义。

最好的解决方案是为插入的脚本添加一个 load 处理程序,这样你就可以在 jQuery 加载完成后运行一个函数。例如:

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);
});

一旦 jQuery 加载,它将确保 window.$ 现在 指向 jQuery 而不是 querySelector 的别名;上述代码片段将在片刻后记录 true。