Ленивая загрузка addthis сценария? (или ленивое загружающееся внешнее js содержание, зависящее от уже запущенных событий)

Я столкнулся с случаем, когда это было полезно совсем недавно, поэтому я решил опубликовать его.

Предположим, вы хотите проверить несколько условий в одном if, и если какое-либо из условий выполняется, вы хотите сгенерировать сообщение об ошибке. Если вы хотите включить в свое сообщение об ошибке, какое конкретное условие вызвало ошибку, вы можете сделать следующее:

std::string e;
if( myMap[e = "ab"].isNotValid() ||
    myMap[e = "cd"].isNotValid() ||
    myMap[e = "ef"].isNotValid() )
{
    // here, e has the key for which the validation failed
}

Так что, если второе условие является тем, которое оценивается как true, e будет равно " CD". Это связано с поведением короткого замыкания в ||, которое предписано стандартом (если не перегружено). См. этот ответ для более подробной информации о коротком замыкании.

9
задан Brian Tompsett - 汤莱恩 22 August 2019 в 16:57
поделиться

3 ответа

Этот код решает проблему и экономит время загрузки, которое я искал.

После прочтения этого сообщения о том, как большинство современных библиотек js реализуют тесты для dom загруженное событие. Я потратил некоторое время на обфусцированный код и смог определить, что addthis использует комбинацию упомянутого метода doscroll, таймеров и события DOMContentLoaded для различных браузеров. Поскольку только те браузеры, которые зависят от события DOMContentloaded, в любом случае будут нуждаться в следующем коде:

if( document.createEvent ) {
 var evt = document.createEvent("MutationEvents"); 
 evt.initMutationEvent("DOMContentLoaded", true, true, document, "", "", "", 0); 
 document.dispatchEvent(evt);
}

, а остальное зависит от таймеров, проверяющих наличие определенных свойств, мне нужно было приспособить только этот один случай, чтобы иметь возможность лениво загружать это внешнее содержимое JS вместо использования статических тегов сценария, что сэкономило время, на которое я надеялся. :)

8
ответ дан 4 December 2019 в 10:05
поделиться

Изменить: если цель состоит в том, чтобы сначала загрузить другой ваш контекст, попробуйте поместить теги