Странный конфликт прототипа/jQuery Chrome

Если я правильно понимаю, это XPath и эквиваленты селекторов ( https://example.org/ имеет похожую структуру DOM):

'use strict';

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch();
    const [page] = await browser.pages();

    await page.goto('https://example.org/');

    const [elemByXPath] = await page.$x('//div[h1[contains(., "Example Domain")]]//a');

    const elemBySelector = await page.evaluateHandle(
      () => [...document.querySelectorAll('div')]
              .find(
                div => [...div.querySelectorAll('h1')]
                         .some(h1 => h1.innerText.includes('Example Domain'))
              )
              .querySelector('a')
    );

    console.log(elemByXPath.toString());
    console.log(elemBySelector.toString());

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

24
задан Rob W 27 December 2011 в 21:48
поделиться

2 ответа

From Core/jQuery.noConflict:

NOTE: This function must be called after including the jQuery javascript file, but BEFORE including any other conflicting library, and also before actually that other conflicting library gets used, in case jQuery is included last. noConflict can be called at the end of the jQuery.js file to globally disable the $() jQuery alias. jQuery.noConflict returns a reference to jQuery, so it can be used to override the $() alias of the jQuery object.

Maybe try changing it to:

<script language="javascript" type="text/javascript"
  src="jquery-1.3.2.js"></script> 
<script language="javascript" type="text/javascript">
    $j = jQuery.noConflict();
</script>
<script language="javascript" type="text/javascript"
  src="prototype-1.5.1.2.js"></script>
44
ответ дан 28 November 2019 в 23:01
поделиться

Я обнаружил, что корень этой проблемы заключается в следующем:

  1. Прототип загружается, и поскольку в WebKit отсутствует document.getElementsByClass () , прототип (коварно) создает его.

  2. Начинается инициализация jQuery. , и в самом верху он устанавливает window. $ на jQuery .

  3. Во время инициализации JQuery инициализируется механизм Sizzle (добавленный в 1.3.2?). В рамках своей интроспекции он проверяет, а затем тестирует функциональность document.getElementsByClass () . В результате он вызывает Prototype ' s реализация getElementsByClass () , которая зависит от окна . $ установлен на $ прототипа, а не на jQuery.

В конечном итоге, это должно быть исправлено в jQuery (см. билеты http://bugs.jquery.com/ticket/4365 и 5027 ). Мой быстрый патч состоял в том, чтобы удалить назначение окну . $ в верхней части инициализации jQuery.

10
ответ дан 28 November 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: