pedro ferreira
Contexto:
Estoy usando barba js para hacer algunas transiciones de página en un sitio web de wordpress, y tengo que cargar algunos scripts cada vez que cambia la página, principalmente algunos archivos js/css de un complemento de wordpress para que funcione la búsqueda ajax. Creé un método que recibe el script src/href y luego agrega el elemento al encabezado. el problema podría deberse a mi estructura de código deficiente o a la biblioteca que no sé para ser honesto.
Problema:
El código solo ejecuta el primer script al que llamo, y como dije anteriormente, ¡no sé si es de mi código o de la biblioteca!
Código:
Al principio pensé que necesitaba algún tipo de tiempo de espera para que el código funcionara, así que hice esto
{
namespace: 'product',
beforeEnter(data) {
//loads styles
setTimeout(reloadStyles('ivory-search-styles-css', 'wp-content/plugins/add-search-to-menu/public/css/ivory-search.css?ver=4.4.7'), 500)
//loads javascript files.
setTimeout(reloadScripts('wp-content/plugins/add-search-to-menu/public/js/ivory-ajax-search.js?ver=4.4.7'), 800)
setTimeout(reloadScripts('/wp-content/plugins/add-search-to-menu/public/js/ivory-search.js?ver=4.4.7'), 1000)
setTimeout(reloadScripts('/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=5.1.7'), 1200)
searchTranslations()
// refresh breadcrumbs
let documentAjax = (new DOMParser()).parseFromString(data.next.html, 'text/html');
let breadcrumbsAjax = documentAjax.querySelector('.breadcrumbs')
let breadcrumbs = document.querySelector('.breadcrumbs')
breadcrumbs.innerHTML = breadcrumbsAjax.innerHTML;
logoPath.style.fill = "black"
}
},
Este es el código original (sin los tiempos de espera):
{
namespace: 'product',
beforeEnter(data) {
reloadStyles('ivory-search-styles-css', '/wp-content/plugins/add-search-to-menu/public/css/ivory-search.css?ver=4.4.7')
reloadScripts('/wp-content/plugins/add-search-to-menu/public/js/ivory-ajax-search.js?ver=4.4.7')
reloadScripts('/wp-content/plugins/add-search-to-menu/public/js/ivory-search.js?ver=4.4.7')
reloadScripts('/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=5.1.7')
searchTranslations()
// refresh breadcrumbs
let documentAjax = (new DOMParser()).parseFromString(next.html, 'text/html');
let breadcrumbsAjax = documentAjax.querySelector('.breadcrumbs')
let breadcrumbs = document.querySelector('.breadcrumbs')
breadcrumbs.innerHTML = breadcrumbsAjax.innerHTML;
logoPath.style.fill = "black"
}
},
Gracias por adelantado !
Editar: Este es el método.
const reloadScripts = (scrpSrc) => {
console.log("Script loaded: " + scrpSrc)
var wpcf7 = { "apiSettings": { "root": "/wp-json\/contact-form-7\/v1", "namespace": "contact-form-7\/v1" } };
let head = document.getElementsByTagName('head')[0]
let script = document.createElement('script')
script.src = scrpSrc;
if (script != undefined || script != null) {
head.removeChild(script)
head.appendChild(script)
}
else head.appendChild(script)
}
tstrand66
Intente hacer las enmiendas a continuación. el cambio principal sería que está verificando la variable incorrecta antes de eliminar y agregar el script. Compruebe si el encabezado contiene un script y elimínelo. Después de eso, hice algunos cambios para ayudar a que el código sea más legible y un poco más seco.
const reloadScripts = (scrpSrc) => {
console.log("Script loaded: " + scrpSrc)
const wpcf7 = {
"apiSettings": {
"root": "/wp-json\/contact-form-7\/v1",
"namespace": "contact-form-7\/v1"
}
};
let head = document.querySelector('head'),
headScript = head.querySelector('[src="https://stackoverflow.com/questions/62060629/="+ scrpSrc +'"]'),
script = document.createElement('script');
//checking if head already has a script
if (headScript != undefined || headScript != null) {
head.removeChild(headScript);
}
//then always do this piece. not DRY to have it inside and outside the if stmt
script.src = scrpSrc;
head.appendChild(script)
}
-
gracias, lo único que no entendí es por qué está seleccionando una etiqueta de secuencia de comandos en esta línea `headScript = head.querySelector(‘script’),` porque eso seleccionará la primera etiqueta de secuencia de comandos, y no quiero eso :/
– Pedro Ferreira
29 de mayo de 2020 a las 17:47
-
@PedroFerreira originalmente lo tenía verificando si la variable de secuencia de comandos que acababa de definir estaba definida y, de ser así, la eliminaba y la leía. Supuse que quería eliminar la etiqueta de secuencia de comandos existente y cargar la nueva. si ese no es el caso, explique cuál es su objetivo final.
– tstrand66
29 de mayo de 2020 a las 18:13
-
Lo principal es que quiero cargar un nuevo script usando el src que proporciono en los argumentos, la variable del script que tengo es el equivalente del headScript que crearon. El código que escribiste está bien, pero el hecho de que uses el selector de consultas, selecciona la primera etiqueta de script del encabezado y la elimina, la reemplaza con la que estamos creando.
– Pedro Ferreira
29 mayo 2020 a las 18:47
-
Para hacerlo corto, lo siento por ser tan confuso. Estoy cargando una nueva etiqueta de secuencia de comandos, y la etiqueta if solo verifica si la secuencia de comandos que creé ya existe, ¡así que no carga muchas secuencias de comandos como esta!
– Pedro Ferreira
29 de mayo de 2020 a las 18:49
-
@PedroFerreira he modificado mi respuesta para comprobar si el headScript coincide con el src pasado. si no no quita nada
– tstrand66
29 mayo 2020 a las 20:50