您的位置:

首页 >

腾博会官网9888 >

引用jquery框架后出错的解决方法 >

引用jquery框架后出错的解决方法

2016-09-21 02:29:07

分类:腾博会官网9888

问题描述:当引用了jquery框架后,页面的js不能正常工作。后面我的解决办法:是因为在引用 jquery的框架时的代码为<script type="text/javascript" src="resources/js/jquery/jquery-1.9.1.min.js" /> 改为如下的引用方式<script type="text/javascript" src="resources/js/jquery/jquery-1.9.1.min.js"></script> 问题解决。以上这篇引用jquery框架后出错的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

使用 typeof 获取基本的类型看到题目的第一眼,有些同学可能会想到 typeof 运算符,在JavaScript语言中,给出了使用 typeof 运算符来获取基本的类型名.(注意不是基本类型)这是 typeof 的全部用法01-typeof.htmconsole.log('typeof of 10 ~~~~' +typeof 10);console.log('typeof of "a" ~~~~' +typeof 'a');console.log('typeof of true ~~~~' +typeof true);console.log('typeof of {} ~~~~' +typeof {});console.log('typeof of /123/ ~~~~' +typeof /123/);console.log('typeof of function(){} ~~~~' +typeof function(){});console.log('typeof of undefined ~~~~' +typeof undefined);console.log('typeof of null ~~~~' +typeof null);这是结果按照上面的打印结果,总结出下面要注意的几点typeof (引用类型) 除了函数, 都是 'object',比如 typeof /123/typeof null 为'object'typeof undefined 为 'undefined',通常, 如果使用两等号, null == undefined 为真.转换为数字的常见用法 "10"-0, 如果没有转换成功,返回NaN,由于NaN 的一个特性: NaN != NaN ,故判断转换成功与否的常见做法: (这也是我参见 jQuery的源码发现的,jQuery源码读100遍都不为过)("10x" - 0) == ("10x" - 0); // 结果为假! 使用jQuery中的方法$.type()现在看看jQuery是怎么做的// 先申明一个对象,目的是用来做映射var class2type = {};// 申明一个core_toString() 的方法,得到最原始的toString() 方法,因为在很多对象中,toStrintg() 已经被重写 var core_toString() = class2type.toString;// 这里为 toStrintg() 后的结果和类型名做一个映射,申明一个core_toString() 后的结果,而值就是类型名jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase();});因为 Object.prototype.toString() 方法调用结果如下var core_toString = {}.toString;console.log( core_toString.call(1) );console.log( core_toString.call("11") );console.log( core_toString.call(/123/) );console.log( core_toString.call({}) );console.log( core_toString.call(function(){}) );console.log( core_toString.call([]) );console.log( core_toString.call(true) );console.log( core_toString.call(new Date()) );console.log( core_toString.call(new Error() ));console.log( core_toString.call(null) );console.log( core_toString.call(undefined) );console.log( String(null) );console.log( String(undefined) );上面的打印结果与class2type[ "[object " + name + "]" ] = name.toLowerCase();不谋而合!这是jQuery.type 的核心方法type: function( obj ) { if ( obj == null ) { return String( obj ); } // Support: Safari <= 5.1 (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ core_toString.call(obj) ] || "object" : typeof obj;},注意,为什么把 null 或者 undefined 单独讨论呢,因为 在一些版本浏览器中console.log(core_toString.call(null));console.log(core_toString.call(undefined));这是会报错的!如果是对象类型,另:由于 在一些低版本的浏览器中,typeof /123/ 会返回的是 "function" 而不是 "object",所以这里要判断是否是函数,要明白 这里的 typeof obj === function 不是为了函数讨论的,因为函数本身就可以通过typeof 来得到类型.typeof obj === "object" || typeof obj === "function" ? class2type[ core_toString.call(obj) ]就直接返回class2type 中键值对的结果,,如果不是,那么一定就是基本类型, 通过 typeof 就可以啦.class2type[ core_toString.call(obj) ] || "object" :// 这是防止一些未知情况的,如果未取到,就返回object但是 jQuery.type 有一个很大的缺陷这是一个自定义类型function Person(){ this.name = 'pawn';}var p = Person.toString();// 注意,这里会打印 [object Object],通过上面的方法,无法得到精确的自定义类型这也是 它的一个大缺陷了!下面,我们通过构造函数的方式来获取精确类型通过构造函数来获取类型这种方式 是蒋坤老师( jk ) 教会我的,非常感谢他.在理解这个方法之前,需要理解两个点prorotype 原型属性我们知道,任何对象或者函数都直接或者间接的继承自Object 或者 Function, (其实最终Function 是继承自 Object 的,这属于原型链的知识了)。那么,任何一个对象都具有原型对象 __proto__ (这个对象只在chrome 和 firefox 暴露,但是在其他浏览器中也是存在的),这个原型对象就是这个对象的构造函数的原型属性(这里可能有点绕).​由于 任何函数都具有 原型属性prototype,并且这个原型属性具有一个默认属性 constructor,它是这个函数的引用,看下面的代码function Person(){ this.name = 'pawn'; } console.log(Person.prototype.constructor === Person);​发现,这两个东西其实一个东西但是,在某些情况下,需要这么写function Person(){ this.name = 'pawn'; } Person.protype = { XX: ... , xx: ... , ... }这么做,就会覆盖原本的 protype 方法,那么construcor 就不存在了,这是,必须要显示的申明这个对象Person.protype = { construction: Person, XX: ... , xx: ... , ... }在jQuery的中,就是这么做的,jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem;关于 jQuery对象封装的方式 也是非常值得研究Function.prototype.toString()注意,这里已经不是熟悉 [object Object],而是 已经重写了.也就是,如果调用一个函数的toString() 方法.那么就会打印这个函数的函数体.好了,经过上面两个步骤,你明白我要做什么了吗?如何通过构造函数来获得变量的类型?判断是否是基本类型var getType = function(obj){ if(obj == null){ return String(obj); } if(typeof obj === 'object' || typeof obj === 'fucntion'){ ... }else{ // 如果不是引用类型,那么就是基本类型 return typeof obj } }如果是对象或者函数类型function Person(){ this.name = 'pawn'; } var p = new Person(); console.log(p.constructor);现在要做的事 : 如何将Person 提取出来呢?毋庸置疑,字符串切割那一套肯定可以办到,但是太 low 啦!这里,我使用正则将Person提取出来var regex = /function\s(.+?)\(/function Person(){ this.name = 'pawn'; } var p = new Person(); var c = p.constructor var regex = /function\s(.+?)\(/; console.log('|' + regex.exec(c)[1] + '|');使用name 其实,除了上面的正则,每个函数还有一个name属性,返回函数名,但是ie8 是不支持的.因此上面的代码可以写为:var getType = function(obj){ if(obj == null){ return String(obj); } if(typeof obj === 'object' || typeof obj === 'function'){ var constructor = obj.constructor; if(constructor && constructor.name){ return constructor.name; } var regex = /function\s(.+?)\(/; return regex.exec(c)[1]; }else{ // 如果不是引用类型,那么就是基本;类型 return typeof obj; }};但是上面的代码太丑啦,将其简化简化var getType = function(obj){ if(obj == null){ return String(obj); } if(typeof obj === 'object' || typeof obj === 'function'){ return obj.constructor && obj.constructor.name.toLowerCase() || /function\s(.+?)\(/.exec(obj.constructor)[1].toLowerCase(); }else{ // 如果不是引用类型,那么就是基本类型 return typeof obj; }};还是比较麻烦,继续简化var getType = function(obj){ if(obj == null){ return String(obj); } return typeof obj === 'object' || typeof obj === 'function' ? obj.constructor && obj.constructor.name && obj.constructor.name.toLowerCase() || /function\s(.+?)\(/.exec(obj.constructor)[1].toLowerCase(): typeof obj;};好了,已经全部弄完了,写个代码测试一下:function Person(){ this.name = 'pawn';}var p = new Person();console.log(getType(p));console.log(getType(1));console.log(getType("a"));console.log(getType(false));console.log(getType(/123/));console.log(getType({}));console.log(getType(function(){}));console.log(getType(new Date()));console.log(getType(new Error()));console.log(getType( null));console.log(getType( undefined));总结好了,以上就是关于如何获取变量的类型名的全部介绍了,希望本文的内容能对你提供帮助。如果有疑问大家可以留言交流。

控制器在Angularjs中的作用是增强视图,它实际就是一个函数,用来向视图中的作用域添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为。当我们在页面上创建一个控制器时,Angularjs会生成并传递一个$scope给这个控制器,由于Angularjs会自动实例化控制器,所以我们只需要写构造函数即可。下面的例子展示了控制器初始化:function my Controller($scope){ $scope.msg="hello,world!"; }上面这个创建控制器的方法会污染全局命名空间,更合理的办法是创建一个模块,然后在模块中创建控制器,如下:var myApp=angular.module("myApp",[]);myApp.controller("myController",function($scope){ $scope.msg="hello,world!";})用内置指令ng-click可以将按钮、链接等其他任何DOM元素同点击事件进行绑定。ng-click指令将浏览器中的mouseup事件,同设置在DOM元素上的事件处理程序绑定在一起(例如,当浏览器在某个DOM元素上触发了点击事件,函数就会被调用)。和前面的例子类似,绑定看起来是这样的:<div ng-controller="FirstController"><h4>The simplest adding machine ever</h4><button ng-click="add(1)" class="button">Add</button><a ng-click="subtract(1)" class="button alert">Subtract</a><h4>Current count: {{ counter }}</h4></div>按钮和链接都被绑定在了内部$scope的一个操作上,当点击任何一个元素时AngularJS都会调用相应的方法。注意,当设置调用哪个函数时,会同时用括号传递一个参数(add(1))app.controller('FirstController', function($scope) {$scope.counter = 0;$scope.add = function(amount) { $scope.counter += amount; };$scope.subtract = function(amount) { $scope.counter -= amount; };});Angularjs与其他框架的最大区别在于,控制器并不适合来执行DOM操作、格式化或数据操作,以及除存储数据模型之外的状态维护操作,它只是视图和$scope之间的桥梁。控制器嵌套(作用域包含作用域)AngularJS应用的任何一个部分,无论它渲染在哪个上下文中,都有父级作用域存在。对于ng-app所处的层级来讲,它的父级作用域就是$rootScope。默认情况下,AngularJS在当前作用域中无法找到某个属性时,便会在父级作用域中进行查找。如果AngularJS找不到对应的属性,会顺着父级作用域一直向上寻找,直到抵达$rootScope为止。如果在$rootScope中也找不到,程序会继续运行,但视图无法更新。通过例子来看一下这个行为。创建一个ParentController,其中包含一个user对象,再创建一个ChildController来引用这个对象:app.controller('ParentController', function($scope) {$scope.person = {greeted: false};});app.controller('ChildController', function($scope) {$scope.sayHello = function() {$scope.person.name = 'Ari Lerner';};});如果我们将ChildController置于ParentController内部,那ChildController的$scope对象的父级作用域就是ParentController的$scope对象。根据原型继承的机制,我们可以在子作用域中访问ParentController的$scope对象。<div ng-controller="ParentController"><div ng-controller="ChildController"><a ng-click="sayHello()">Say hello</a></div>{{ person }}</div>以上就是本文的全部内容,希望对大家的学习有所帮助,帮助大家熟悉AngularJS控制器。

require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 exports 和 module.exports 的关系,我们先来巩固下 js 的基础。示例:app.jsvar a = {name: 'nswbmw 1'};var b = a;console.log(a);console.log(b);b.name = 'nswbmw 2';console.log(a);console.log(b);var b = {name: 'nswbmw 3'};console.log(a);console.log(b);运行 app.js 结果为:{ name: 'nswbmw 1' }{ name: 'nswbmw 1' }{ name: 'nswbmw 2' }{ name: 'nswbmw 2' }{ name: 'nswbmw 2' }{ name: 'nswbmw 3' }解释一下:a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一个对象,即 a 和 b 指向同一块内存地址,所以前两个输出一样。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三、四个输出一样。当对 b 完全覆盖时,b 就指向了一块新的内存地址(并没有对原先的内存块作修改),a 还是指向原来的内存块,即 a 和 b 不再指向同一块内存,也就是说此时 a 和 b 已毫无关系,所以最后两个输出不一样。明白了上述例子后,我们进入正题。我们只需知道三点即可知道 exports 和 module.exports 的区别了: exports 是指向的 module.exports 的引用 module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {} require() 返回的是 module.exports 而不是 exports所以:我们通过var name = 'nswbmw';exports.name = name;exports.sayName = function() { console.log(name);}给 exports 赋值其实是给 module.exports 这个空对象添加了两个属性而已,上面的代码相当于:var name = 'nswbmw';module.exports.name = name;module.exports.sayName = function() { console.log(name);}我们通常这样使用 exports 和 module.exports一个简单的例子,计算圆的面积:使用 exportsapp.jsvar circle = require('./circle');console.log(circle.area(4));circle.jsexports.area = function(r) { return r * r * Math.PI;}使用 module.exportsapp.jsvar area = require('./area');console.log(area(4));area.jsmodule.exports = function(r) { return r * r * Math.PI;}上面两个例子输出是一样的。你也许会问,为什么不这样写呢?app.jsvar area = require('./area');console.log(area(4));area.jsexports = function(r) { return r * r * Math.PI;}运行上面的例子会报错。这是因为,前面的例子中通过给 exports 添加属性,只是对 exports 指向的内存做了修改,而exports = function(r) { return r * r * Math.PI;}其实是对 exports 进行了覆盖,也就是说 exports 指向了一块新的内存(内容为一个计算圆面积的函数),也就是说 exports 和 module.exports 不再指向同一块内存,也就是说此时 exports 和 module.exports 毫无联系,也就是说 module.exports 指向的那块内存并没有做任何改变,仍然为一个空对象 {} ,也就是说 area.js 导出了一个空对象,所以我们在 app.js 中调用 area(4) 会报 TypeError: object is not a function 的错误。所以,一句话做个总结:当我们想让模块导出的是一个对象时,exports 和 module.exports 均可使用(但 exports也不能重新覆盖为一个新的对象),而当我们想导出非对象接口时,就必须也只能覆盖 module.exports。我们经常看到这样的用写法:exports = module.exports = somethings;上面的代码等价于module.exports = somethings;exports = module.exports;原因也很简单,module.exports = somethings 是对 module.exports 进行了覆盖,此时 module.exports 和 exports 的关系断裂,module.exports 指向了新的内存块,而 exports 还是指向原来的内存块,为了让 module.exports 和 exports 还是指向同一块内存或者说指向同一个 “对象”,所以我们就 exports = module.exports。以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

一般情况下网页中的图片都是随文档流依次加载的,什么时候用到则什么时候加载,但是有些时候这样的加载方式往往会影响用户体验,比如鼠标hover变换背景图片的时候,只有鼠标移入才会对变换的图片进行加载,这样就可能会出现片刻的加载空白现象;又比如图片显示后隐藏再显示网站内容等也是同样的道理。为了在必要的时候增加用户体验,提高网页的交互逼格,这里不得不介绍下图片预加载的艺术啦。那么什么是图片预加载呢?道理很简单啦,虽然某些图片一时半会我用不到,但是为了避免使用时出现的措手不及的现象,我还是乖乖把它们先准备好,在某些时候悄悄的把它们加载进来,以防一时之需。ok,那么怎么才能实现这样的功能呢?其实很简单啦,这里呢就介绍一个jquery库的preLoadImages()函数,使用这个函数呢就可以轻松实现图片预加载了,下面来一睹为快吧,代码如下:$(function(){ var cache=[]; //编写一个预加载图片的jQuery函数 $.preLoadImages = function(){ //获取函数体的参数个数 var args_len = arguments.length; //反向循环参数个数,创建img元素 for(var i = args_len ; i--;) { var cacheImage = document.createElement(‘img'); //指定img元素的src属性为数组元素的值 cacheImge.src = arguments[i]; //将HTML元素加入到数组中 cache.push(cacheImage); } } });ok,注释都写的十分清楚了吧,还是没看懂?好吧那么我们先不管代码了,其实只要通过下面一步就可以完成函数的调用,如下: //预加载图片 $.preLoadImages('images/sample1.jpg','images/sample2.jpg','images/sample3.jpg');其中的'images/sample1.jpg','images/sample2.jpg','images/sample3.jpg'就是图片的路径,预加载多张图片就用逗号分隔啦,这样在网页上的任何位置引用图片时,将从缓存中获取所需的图片,从而提升用户的体验,使网站获得更好的流畅性哦。那么还没完,有人可能会问万一图片路径失效加载出错了咋办?呵呵,再教你一招,出错就出错了呗,我们有plan B,针对出错的图片显示另一张我们事先准备好的图片,用这张图片来替换所有无法显示的图片,那么怎样才能做到呢,方法也十分简单,代码如下:$(function(){ $("img").error(function(){ $(this).prop("src","images/planB.jpg"); });});搞定,这下我们做的万无一失了,这里主要介绍下error()事件,它的定义和用法为:  当元素遇到错误(没有正确载入)时,发生 error 事件。  error() 方法触发 error 事件,或规定当发生 error 事件时运行的函数。很好理解吧,至此我们的图片预加载的方法就介绍完了。本文部分代码及写作思路参考于《超实用的JQuery代码段》一书,欢迎大家积极尝试、评论及指正。以上就是本文的全部内容,希望对大家有所帮助,同时也希望多多支持脚本之家!

焦点访谈

最新最热的文章

更多 >

COPYRIGHT (©) 2017 Copyright ©2017 腾博会官网 网站地图

联系我们

827570882

扫描二维码分享到微信