Есть ли способ повторно инициализировать jQuery?Jquery

Программирование на jquery
Ответить
Anonymous
 Есть ли способ повторно инициализировать jQuery?

Сообщение Anonymous »

Вопрос
JQuery инициализируется при import. Если window и window.document существуют, JQuery сохраняет ссылку и использует ее в дальнейшем.

Есть ли способ «повторно инициализировать» или «сбросить» JQuery после его импорта, чтобы дать ему другую ссылку на window и document< /код>?
Неудачный тестовый пример Структура проекта . ├── .eslintrc.json ├── .prettierrc ├── index.spec.js ├── package.json ├── README.md ├── спецификация/ │ └── поддержка/ │ ├── jasmine-spec.json │ ├── logger.js │ ├── медленный-spec-reporter.js │ └── type-check.js ├── template1.html └── template2.html ./index.spec.js
import { JSDOM } из 'jsdom'; описать('jquery', () => { it('использует доступный в данный момент документ', async () => { const {документ: template1Document, jquery: template1Jquery } = ждут parseHtml('template1.html'); ожидать(template1Document.querySelector('p').textContent).toEqual( 'Привет, мир' ); ожидаем(template1Jquery.find('p').text()).toEqual('Привет, мир'); const {документ: template2Document, jquery: template2Jquery} = ждут parseHtml('template2.html'); ожидать(template2Document.querySelector('p').textContent).toEqual( 'Прощай мир' ); ожидаем(template2Jquery.find('p').text()).toEqual('Прощай, мир'); // !!! // Ожидается, что «Привет, мир» будет равно «Прощай, мир». }); }); асинхронная функция parseHtml(fileName) { const dom = ожидание JSDOM.fromFile(fileName, { URL: 'http://localhost', runScripts: 'опасно', ресурсы: «пригодные к использованию», притворятьсяToBeVisual: правда, }); константное окно = dom.window; константный документ = окно.документ; globalThis.window = окно; globalThis.document = документ; const DynamicImport = ждут импорта ('jquery'); const $ = DynamicImport.default; возвращаться { документ: документ, jquery: $(`html`), }; } ./template1.html template1.html Привет, мир
./template2.html
template2.html Прощай, мир

Это фрагмент кода, но полный репозиторий GitHub вы можете найти здесь.
Контекст
Я работаю над проектом одностраничного приложения, предназначенного только для внешнего интерфейса. Несмотря на то, что проект выполняется исключительно в браузере, автоматические тесты выполняются в Node.JS. Тесты загружают HTML в JSDOM и выполняют части рабочего кода.1

При создании JSDOM возвращает API DOM, который работает в Node.JS, включая объект window. Без этого jQuery выдаст ошибку при импорте, поскольку в современных версиях есть такой код:

(function(global, Factory) { «используйте строгий»; if (typeof Module === "объект" && typeof Module.exports === "объект") { // Для CommonJS и CommonJS-подобных сред, где правильное `окно` // присутствует, запускаем фабрику и получаем jQuery. // Для сред, в которых нет `окна` с `документом` // (например, Node.js), выставляем фабрику как модуль.exports. // Это подчеркивает необходимость создания настоящего «окна». // например вар jQuery = require("jquery")(окно); // Дополнительную информацию смотрите в билете trac-14549. модуль.экспорт = глобальный.документ? фабрика (глобальная, правда): функция (ш) { если (!w.document) { throw new Error("jQuery требует окно с документом"); } вернуть завод(ш); }; } еще { фабрика (глобальная); } // Передаем это, если окно еще не определено })(typeof window !== "не определено" ? window : this, function(window, noGlobal) { console.log(`окно`, окно); console.log(`noGlobal`, noGlobal); })

Как видите, это выполняется как побочный эффект импорта jQuery. Это вызвало значительную головную боль, поскольку не всегда просто создать JSDOM перед импортом jQuery.

Например, если рабочий код импортирует jQuery, а тест импортирует рабочий код, JSDOM (и, следовательно, window) еще не будет существовать. Это вызывает ошибку.

Но есть более важный вариант использования: я хочу иметь возможность использовать разные HTML-файлы в своих тестах, но это ограничивает меня одним файлом для каждого запуска теста.
Примечания
Для справки: я использую jQuery 3.7.1, но фрагменты кода stackoverflow не дают мне возможности выбрать эту версию. Я думаю, это нормально, потому что, насколько я могу судить, этот код в обоих случаях один и тот же.

1: К сожалению, это означает идти вразрез с официальными рекомендациями JSDOM. Но в этом контексте я не вижу способа обойти эту проблему.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Jquery»