jquery - llamar - pasar funcion como parametro javascript
jQuery Uncaught TypeError: no se puede leer la propiedad ''fn'' de undefined(función anónima) (10)
Todo, recibo un error de parte de mi código que descargué. Aquí está el código:
/*----------------------------------------------------------------------*/
/* wl_Alert v 1.1
/* description: Handles alert boxes
/* dependency: jquery UI Slider, fadeOutSlide plugin
/*----------------------------------------------------------------------*/
$.fn.wl_Alert = function (method) {
var args = arguments;
return this.each(function () {
var $this = $(this);
if ($.fn.wl_Alert.methods[method]) {
return $.fn.wl_Alert.methods[method].apply(this, Array.prototype.slice.call(args, 1));
} else if (typeof method === ''object'' || !method) {
if ($this.data(''wl_Alert'')) {
var opts = $.extend({}, $this.data(''wl_Alert''), method);
} else {
var opts = $.extend({}, $.fn.wl_Alert.defaults, method, $this.data());
}
} else {
$.error(''Method "'' + method + ''" does not exist'');
}
if (!$this.data(''wl_Alert'')) {
$this.data(''wl_Alert'', {});
//bind click events to hide alert box
$this.bind(''click.wl_Alert'', function (event) {
event.preventDefault();
//Don''t hide if it is sticky
if (!$this.data(''wl_Alert'').sticky) {
$.fn.wl_Alert.methods.close.call($this[0]);
}
//prevent hiding the box if an inline link is clicked
}).find(''a'').bind(''click.wl_Alert'', function (event) {
event.stopPropagation();
});
} else {
}
//show it if it is hidden
if ($this.is('':hidden'')) {
$this.slideDown(opts.speed / 2);
}
if (opts) $.extend($this.data(''wl_Alert''), opts);
});
};
$.fn.wl_Alert.defaults = {
speed: 500,
sticky: false,
onBeforeClose: function (element) {},
onClose: function (element) {}
};
$.fn.wl_Alert.version = ''1.1'';
$.fn.wl_Alert.methods = {
close: function () {
var $this = $(this),
opts = $this.data(''wl_Alert'');
//call callback and stop if it returns false
if (opts.onBeforeClose.call(this, $this) === false) {
return false;
};
//fadeout and call an callback
$this.fadeOutSlide(opts.speed, function () {
opts.onClose.call($this[0], $this);
});
},
set: function () {
var $this = $(this),
options = {};
if (typeof arguments[0] === ''object'') {
options = arguments[0];
} else if (arguments[0] && arguments[1] !== undefined) {
options[arguments[0]] = arguments[1];
}
$.each(options, function (key, value) {
if ($.fn.wl_Alert.defaults[key] !== undefined || $.fn.wl_Alert.defaults[key] == null) {
$this.data(''wl_Alert'')[key] = value;
} else {
$.error(''Key "'' + key + ''" is not defined'');
}
});
}
};
//to create an alert box on the fly
$.wl_Alert = function (text, cssclass, insert, after, options) {
//go thru all
$(''div.alert'').each(function () {
var _this = $(this);
//...and hide if one with the same text is allready set
if (_this.text() == text) {
_this.slideUp($.fn.wl_Alert.defaults.speed);
}
});
//create a new DOM element and inject it
var al = $(''<div class="alert '' + cssclass + ''">'' + text + ''</div>'').hide();
(after) ? al.appendTo(insert).wl_Alert(options) : al.prependTo(insert).wl_Alert(options);
//return the element
return al;
};
¿Alguien ha visto este tipo de error antes? ¿Cómo resolvería algo como esto? ¡Gracias por cualquier consejo que tengas!
Este error también puede ocurrir si tiene requirejs ( requirejs ) implementado y no requirejs alguna lib que está usando dentro
define([''jquery''], function( jQuery ) { ... lib function ... });
NOTA: no tiene que hacer esto si esta lib tiene soporte de AMD. Puede comprobar rápidamente esto abriendo esta lib y simplemente ctrl + f "amd" :)
Estoy de acuerdo con MarsPeople en cuanto a cargar bibliotecas en el orden incorrecto. Mi ejemplo es trabajar con owl.carousel.
Obtuve el mismo error al importar jquery después de owl.carousel:
<script src="owl.carousel.js"></script>
<script src="jquery-3.1.1.min.js"></script>
y lo arregló importando jquery antes de owl.carousel:
<script src="jquery-3.1.1.min.js"></script>
<script src="owl.carousel.js"></script>
Importe el jquery CDN como una primera
(p.ej)
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
Prueba esto:
(function ( $ ) {
// put all that "wl_alert" code here
}( jQuery ));
Entonces, la variable $
está aparentemente dañada, pero la variable jQuery
todavía debería referirse al objeto jQuery. (En circunstancias normales, las variables $
y jQuery
referencia al (mismo) objeto jQuery).
En lugar de tener que reemplazar el nombre $
con el nombre jQuery
en todo su código, puede simplemente usar un IIFE para alias el nombre manualmente. Entonces, la variable externa jQuery
tiene un alias con la variable $
dentro de la función.
Aquí hay un ejemplo simple para ayudarlo a entender este concepto:
var foo = ''Peter'';
(function ( bar ) {
bar // evaluates to ''Peter''
}( foo ));
Puede usar la función noConflict:
var JJ= jQuery.noConflict();
JJ(''.back'').click(function (){
window.history.back();
});
Cambiar todos $ a JJ.
Si obtiene No se puede leer la propiedad ''fn'' de undefined , el problema puede ser que cargue las bibliotecas en orden incorrecto.
Por ejemplo:
Debería cargar bootstrap.js primero y luego cargar las bibliotecas de bootstrap.js .
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap3-dialog/1.34.7/js/bootstrap-dialog.min.js"></script>
También encontré este problema cuando tengo el mismo JavaScript que la secuencia del problema a continuación.
Luego lo he arreglado agregando el jquery.slim.min.js después del jquery.slim.min.js , como la Secuencia de Solución.
Secuencia de problemas
<script src="./vendor/jquery/jquery.min.js"></script>
<script src="./vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
Secuencia de solución
<script src="./vendor/jquery/jquery.min.js"></script>
<script src="./vendor/jquery/jquery.slim.min.js"></script>
<script src="./vendor/jquery-easing/jquery.easing.min.js"></script>
Tuve el mismo problema cuando usé bootstrap-datewidget y cargué jquery en el encabezado en lugar de cargarlo al final del cuerpo y funcionó.
Yo también tenía el "Unkeught TypeError: no se puede leer la propiedad ''fn'' de undefined" con:
$.fn.circleType = function(options) {
CODE...
};
Pero lo arreglé envolviéndolo en una función lista para documentos:
jQuery(document).ready.circleType = function(options) {
CODE...
};
intenta llamar a la biblioteca de jQuery antes de bootstrap.js
<script src="js/jquery-3.3.1.min.js"></script>
<script src="js/bootstrap.min.js"></script>