Вопрос
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. Но в этом контексте я не вижу способа обойти эту проблему.
Есть ли способ повторно инициализировать jQuery? ⇐ Jquery
Программирование на jquery
-
Anonymous
1701923096
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 выдаст ошибку при [b]импорте[/b], поскольку в современных версиях есть такой код:
(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); })
Как видите, это выполняется как побочный эффект [b]импорта[/b] jQuery. Это вызвало значительную головную боль, поскольку не всегда просто создать JSDOM перед импортом jQuery.
Например, если рабочий код импортирует jQuery, а тест импортирует рабочий код, JSDOM (и, следовательно, window) еще не будет существовать. Это вызывает ошибку.
Но есть более важный вариант использования: я хочу иметь возможность использовать разные HTML-файлы в своих тестах, но это ограничивает меня одним файлом для каждого запуска теста.
Примечания
Для справки: я использую jQuery 3.7.1, но фрагменты кода stackoverflow не дают мне возможности выбрать эту версию. Я думаю, это нормально, потому что, насколько я могу судить, этот код в обоих случаях один и тот же.
1: К сожалению, это означает идти вразрез с официальными рекомендациями JSDOM. Но в этом контексте я не вижу способа обойти эту проблему.
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия