其实使用php也可以判断ip所在的城市是哪里,不过如果只能使用js呢?那也可以实现,只要使用 其他网站提供的js ip数据库就可以了

http://pv.sohu.com/cityjson?ie=utf-8 这是 搜狐的ip数据库

打开可以看到 一下内容

var returnCitySN = {"cip": "116.23.98.75", "cid": "440100", "cname": "广东省广州市"};
那接下来就简单了,调用对象的属性就可以了

<script type=”text/javascript” src=”http://pv.sohu.com/cityjson?ie=utf-8″></script>
<script type=”text/javascript” >
document.write(returnCitySN.cname);
</script>

这样就可以出现你当前ip所在的城市了。

还有其他网站的ip数据库

http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 这是新浪的

打开出来的是:

var remote_ip_info ={"ret":1,"start":"116.21.0.0","end":"116.23.255.255","country":"\u4e2d\u56fd","province":"\u5e7f\u4e1c","city":"\u5e7f\u5dde","district":"","isp":"\u7535\u4fe1","type":"","desc":""};

使用方法跟上面一样 改下对象名称和相应的属性就好了 .

 

在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$(‘#msg’)等同于JQuery(‘#msg’)的写法。然而,当我们引入多个js库后,在另外一个js库中也定义了$符号的话,那么我们在使用$符号时就发生了冲突。下面以引入两个库文件jquery.js和prototype.js为例来进行说明。
第一种情况:jquery.js在prototype.js之后进行引入,如:

<script src=”prototype.js” type=”text/javascript”/>
<script src=”jquery.js” type=”text/javascript”/>

在这种情况下,我们在自己的js代码中如下写的话:

$(‘#msg’).hide();

$永远代表的是jquery中定义的$符号,也可以写成JQuery(‘#msg’).hide();如果想要使用prototype.js中定义的$,我们在后面再介绍。

第二种情况:jquery.js在prototype.js之前进行引入,如:

<script src=”jquery.js” type=”text/javascript”/>
<script src=”prototype.js” type=”text/javascript”/>

在这种情况下,我们在自己的js代码中如下写的话:

$(‘#msg’).hide();

$此时代表的prototype.js中定义的$符号,如果我们想要调用jquery.js中的工厂选择函数功能的话,只能用全称写法JQuery(‘#msg’).hide().

下面先介绍在第一种引入js库文件顺序的情况下,如何正确的使用不同的js库中定义的$符号。

一.使用JQuery.noConflict()
该方法的作用就是让Jquery放弃对$的所有权,将$的控制权交还给prototype.js,因为jquery.js是后引入的,所以最后拥有$控制权的是jquery。它的返回值是JQuery。当在代码中调用了该 方法以后,我们就不可以使用$来调用jquery的方法了,此时$就代表在prototype.js库中定义的$了。如下:

JQuery.noConflict();

//此处不可以再写成$(‘#msg’).hide(),此时的$代表prototype.js中定义的$符号。
JQuey(‘#msg’).hide();

自此以后$就代表prototype.js中定义的$,jquery.js中的$无法再使用,只能使用jquery.js中$的全称JQuery了。

二.自定义JQuery的别名
如果觉得第一种方法中使用了JQuery.noConflict()方法以后,只能使用JQuery全称比较麻烦的话,我们还可以为JQuery重定义别名。如下:

var $j=JQuery.noConflict();
$j(‘#msg’).hide();//此处$j就代表JQuery

自此以后$就代表prototype.js中定义的$,jquey.js中的$无法再使用,只能使用$j来作为jquey.js中JQuery的别名了。

三.使用语句块,在语句块中仍然使用jquery.js中定义的$,如下:

JQuery.noConflict();
JQuery(document).ready(function($){
$(‘#msg’).hide();//此时在整个ready事件的方法中使用的$都是jquery.js中定义的$.
});

或者使用如下语句块:

(function($){
…..
$(‘#msg’).hide();//此时在这个语句块中使用的都是jquery.js中定义的$.
})(JQuery)

如果在第二种引入js库文件顺序的情况下,如何使用jquery.js中的$,我们还是可以使用上面介绍的语句块的方法,如:

代码
<script src=”jquery.js” type=”text/javascript”/>
<script src=”prototype.js” type=”text/javascript”/>
<script type=”text/javascript”>

(function($){
…..
$(‘#msg’).hide();//此时在这个语句块中使用的都是jquery.js中定义的$.
})(JQuery)
</script>

这种使用语句块的方法非常有用,在我们自己写jquery插件时,应该都使用这种写法,因为我们不知道具体工作过程中是如何顺序引入各种js库的,而这种语句块的写法却能屏蔽冲突。

 

以上是处理的原理,
当然用最简单的更改命名方法
var j = jQuery.noConflict();

也就是用j代替了$
以后自己写jq库的时候尽量避免用$,养成个良好的习惯吧

 

今天在做一个 菜单下载 统计 ,想到直接用txt来记录数据就行了。

<?
$filetxt=”dow.txt”;

if(($fg=fopen($filetxt,”r+”))==false){
printf(“读取不成功成功”);
exit;
}else{
$count=fread($fg,60);
$count=substr($count,33);
$count=$count+1;
fclose ($fg);

$fg=fopen($filetxt,”w+”);
fwrite($fg,”the delivery menu download count:”.$count);
fclose($fg);

}

?>

这是php出来文件 dow.php


<html xmlns=”http://www.w3.org/1999/xhtml”>

<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>无标题文档</title>
<script type=”text/javascript” src=”jquery-1.7.2.min.js”></script>
<script language=”javascript”>

function dowss(url){

$.getJSON(url + ‘?callback=?’);
window.open(“Bocca Delivery Menu.xls”);
}
</script>
</head>

<body>

<a href=”#” id=”downloads” onclick=”dowss(‘dow.php’)”>delivery menu down</a>
</body>
</html>

这是html文件内容,用到jquery 的getJSON(), 记住要先建立一个txt文件哦, 我这里偷懒 没用php 判断文件不存在时 自动生成, 不难 大伙自己写吧。

 

今天在写一个javascript特效的时候,在获取窗口参数的时候(例如:document.documentElement.scrollTop来获取顶部的数值),谷歌浏览器居然没效,查了下才知道,标准浏览器是只认识documentElement.scrollTop的,但chrome却不认识这个,在有文档声明时,chrome也只认识document.body.scrollTop.

这时候是不是想到做判断,是哪个浏览器 就 用哪个方法来获取呢, 这个方法应该是没多人都会,不过就是多了很多代码了,这里有一个更简单的方法

“var stop =  document.body.scrollTop+document.documentElement.scrollTop” ;

呵呵。。。这样的话 是不是就简化很多了, 这样的写法其实 就是 两个方法获取参数的时候 在不同的浏览器 中始终会有一个值是为0,那自然也就做了判断了啦(虽然不是真正的判断)。

 

本文出自:麻瓜程序员

转载请注明出处:http://blog.aiwebcom.com/%e7%bd%91%e7%ab%99%e5%bb%ba%e8%ae%be/javascript-jquery/453.html

 

 

在页面中同时存在jquery 和 prototype ,当用到 $ 的时候,难免产生冲突,所以一定要区分开来:

<script type=”text/javascript” src=”jquery.js”></script>
<script type=”text/javascript”>
j= $;
</script>
<script type=”text/javascript” src=”prototype.js” ></script>

这样做了以后,在用到jquery 的地方用 j 来替代 $ 符号,而 prototype 的 $ 函数照常使用,当然其实也不用定义“ j= $; ” ,在用到 jquery 的地方直接用 jQuery 来替代 $ 符号也一样的。

 

还有一个冲突网上找到的:Array.prototype.push 方法冲突。转载下:

这个冲突很严重,直接导致jQuery 的级联筛选无效。比如正常情况下,你可以使 用 $(“span”,$(“#main”)) 来获取ID 为 main 的元素下面的 span 元素。但如果页面中同时使用了 prototype 框架相关,那抱歉 的很,你永远获取不到了。原因你可以调试跟踪自己查看 jQuery 的源代码。
解决方法:
<script type=”text/javascript”>
var fnArrayPush = Array.prototype.push;
$().ready(function(){
Array.prototype.push = fnArrayPush;
init();
});
</script>

/****/

一般将 $换成jQuery 都可以解决的了

 

其实就是 一个不带端口 一个带端口

location.hostname   是不带端口的

hostname属性图示

hostname属性图示

而location.host是带端口的

 

今天做一个乙肝测试的功能,使用javascript数组来做

首先是html代码部分:

<ul>
<li><strong>HBsAg:</strong>
<select name=”HBsAg”>
<option selected=”selected” value=”+”>+</option>
<option value=”-”>-</option>
</select>
</li>
<li><strong>HBsAb:</strong>

<select name=”HBsAb”>
<option selected=”selected” value=”+”>+</option>
<option value=”-”>-</option>
</select>
</li>
<li><strong>HBeAg:</strong>
<select name=”HBeAg”>

<option selected=”selected” value=”+”>+</option>
<option value=”-”>-</option>
</select>
</li>
<li><strong>HBeAb:</strong>
<select name=”HBeAb”>
<option selected=”selected” value=”+”>+</option>

<option value=”-”>-</option>
</select>
</li>
<li><strong>HBcAb:</strong>
<select name=”HBcAb”>
<option selected=”selected” value=”+”>+</option>
<option value=”-”>-</option>
</select>
</li>
<li><img src=”http://img1.fswj120.com/images/gbk/images/08.gif” onclick=”getResult()” name=”button” class=”search_but” align=”absmiddle” /></li>
<li>
<textarea name=”txtbb” rows=”4″ wrap=”VIRTUAL” style=”width:202px; height:76px;”></textarea>
</li>
</ul>

 

然后是javascript代码部分:

function getResult(){
var csx = new Array(25);
var csjg = new Array(26);
csx[0] = “—–”;
csjg[0] = “过去和现在未感染过HBV,建议注射乙肝疫苗”;
csx[1] = “—-+”;
csjg[1] = “有以下三种可能性:\n(1)既往感染未能测出抗-HBs;\n(2)” +
“恢复期HBsAg已消,抗-HBs尚未出现;\n(3)无症状HbsAg携带者。”;
csx[2] = “—++”;
csjg[2] = “有以下三种可能性:\n(1)既往感染过HBV;\n(2)急性HBV感染恢复期;\n(3)少数标本仍有传染性。”;
csx[3] = “-+—”;
csjg[3] = “有以下两种可能性:\n(1)注射过乙肝苗有免疫;\n(2)既往感染。 “;
csx[4] = “-+-++”;
csjg[4] = “急性HBV感后康复。”;
csx[5] = “+—+”;
csjg[5] = “有以下两种可能性:\n(1)急性HBV感染;\n(2)慢性HBsAg携带者;\n两种情况皆传染性弱。”;
csx[6] = “-+–+”;
csjg[6] = “既往感染,仍有免疫力。”;
csx[7] = “+–++”;
csjg[7] = “有以下两种可能性:\n(1)急性HBV感染趋向恢复;\n(2)慢性HBsAg携带者;\n两种情况传染性皆弱”;
csx[8] = “+-+-+”;
csjg[8] = “急慢性乙型肝炎。提示HBV复制,传染强。”;
csx[9] = “+—-”;
csjg[9] = “有以下两种可能性:\n(1)急性HBV感染早期;\n(2)慢性HBV携带者,传染性弱。”;
csx[10] = “+–+-”;
csjg[10] = “有以下两种可能性:\n(1)慢性HBsAg携带者易转阴;\n(2)急性HBV感染趋向恢复。”;
csx[11] = “+-+–”;
csjg[11] = “早期HBV感染或慢性携带者,传染性强。”;
csx[12] = “+-+++”;
csjg[12] = “有以下两种可能性:\n(1)急性HBV感染趋向恢复;\n(2)慢性携带者。 “;
csx[13] = “++—”;
csjg[13] = “有以下两种可能性:\n(1)亚临床型HBV感染早期;\n(2)不同亚型HBV二次感染。”;
csx[14] = “++–+”;
csjg[14] = “有以下两种可能性:\n(1)亚临床型HBV感染早期;\n(2)不同亚型HBV二次感染。”;
csx[15] = “++-+-”;
csjg[15] = “亚临床型或非典型性感染。”;
csx[16] = “++-++”;
csjg[16] = “亚临床型或非典型性感染。”;
csx[17] = “+++-+”;
csjg[17] = “亚临床型或非典型性感染早期。”;
csx[18] = “–+–”;
csjg[18] = “有以下两种可能性:\n(1)非典型性急性感染;\n(2)见于抗-HBc出现之前的” +”感染早期,HBsAg滴度低而呈阴性,或呈假阳性。 “;
csx[19] = “–+-+”;
csjg[19] = “非典型性急性感染。”;
csx[20] = “–+++”;
csjg[20] = “急性HBV感染中期”;
csx[21] = “-+-+-”;
csjg[21] = “HBV感染后已恢复。”;
csx[22] = “-++–”;
csjg[22] = “非典型性或亚临床型HBV感染。”;
csx[23] = “-++-+”;
csjg[23] = “非典型性或亚临床型HBV感染。”;
csx[24] = “—+-”;
csjg[24] = “急性HBV感染趋向恢复。”;
csjg[25] = “输入结果和临床研究不符,请查证您的化验结果再次输入”;
var csxm = document.getElementsByName(“HBsAg”)[0].value + document.getElementsByName(“HBsAb”)[0].value + document.getElementsByName(“HBeAg”)[0].value + document.getElementsByName(“HBeAb”)[0].value + document.getElementsByName(“HBcAb”)[0].value;
//alert(csxm);
for(i=0;i<csx.length;i++){
if(csxm==csx[i]){
document.getElementsByName(“txtbb”)[0].value=csjg[i];
break;
}else{
document.getElementsByName(“txtbb”)[0].value=csjg[25];
}
}

}

感觉写得不怎么样,应该可以再简化。

 

shift:删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined
var a = [1,2,3,4,5];
var b = a.shift(); //a:[2,3,4,5] b:1

unshift:将参数添加到原数组开头,并返回数组的长度
var a = [1,2,3,4,5];
var b = a.unshift(-2,-1); //a:[-2,-1,1,2,3,4,5] b:7
注:在IE6.0下测试返回值总为undefined,FF2.0下测试返回值为7,所以这个方法的返回值不可靠,需要用返回值时可用splice代替本方法来使用。

pop:删除原数组最后一项,并返回删除元素的值;如果数组为空则返回undefined
var a = [1,2,3,4,5];
var b = a.pop(); //a:[1,2,3,4] b:5

push:将参数添加到原数组末尾,并返回数组的长度
var a = [1,2,3,4,5];
var b = a.push(6,7); //a:[1,2,3,4,5,6,7] b:7

concat:返回一个新数组,是将参数添加到原数组中构成的
var a = [1,2,3,4,5];
var b = a.concat(6,7); //a:[1,2,3,4,5] b:[1,2,3,4,5,6,7]

splice(start,deleteCount,val1,val2,…):从start位置开始删除deleteCount项,并从该位置起插入val1,val2,…
var a = [1,2,3,4,5];
var b = a.splice(2,2,7,8,9); //a:[1,2,7,8,9,5] b:[3,4]
var b = a.splice(0,1); //同shift
a.splice(0,0,-2,-1); var b = a.length; //同unshift
var b = a.splice(a.length-1,1); //同pop
a.splice(a.length,0,6,7); var b = a.length; //同push

reverse:将数组反序
var a = [1,2,3,4,5];
var b = a.reverse(); //a:[5,4,3,2,1] b:[5,4,3,2,1]

sort(orderfunction):按指定的参数对数组进行排序
var a = [1,2,3,4,5];
var b = a.sort(); //a:[1,2,3,4,5] b:[1,2,3,4,5]

slice(start,end):返回从原数组中指定开始下标到结束下标之间的项组成的新数组
var a = [1,2,3,4,5];
var b = a.slice(2,5); //a:[1,2,3,4,5] b:[3,4,5]

join(separator):将数组的元素组起一个字符串,以separator为分隔符,省略的话则用默认用逗号为分隔符
var a = [1,2,3,4,5];
var b = a.join(“|”); //a:[1,2,3,4,5] b:”1|2|3|4|5″

 

数组是JavaScript提供的一个内部对象,它是一个标准的集合,我们可以添加(push)、删除(shift)里面元素,我们还可以通过for循环遍历里面的元素,那么除了数组我们在JavaScript里还可以有别的集合吗?

由于JavaScript的语言特性,我们可以向通用对象动态添加和删除属性。所以Object也可以看成是JS的一种特殊的集合。下面比较一下Array和Object的特性:

Array:

新建:var ary = new Array(); 或 var ary = [];
增加:ary.push(value);
删除:delete ary[n];
遍历:for ( var i=0 ; i < ary.length ; ++i ) ary[i];

Object:

新建:var obj = new Object(); 或 var obj = {};
增加:obj[key] = value; (key为string)
删除:delete obj[key];
遍历:for ( var key in obj ) obj[key];

从上面的比较可以看出Object完全可以作为一个集合来使用,在使用Popup窗口创建无限级Web页菜单(3)中我介绍过Eric实现的那个__MenuCache__,它也就是一个模拟的集合对象。

如果我们要在Array中检索出一个指定的值,我们需要遍历整个数组:
代码:
var keyword = ;
for ( var i=0 ; i < ary.length ; ++i )
{
if ( ary[i] == keyword )
{
// todo
}
}

 

而我们在Object中检索一个指定的key的条目,只需要是要使用:
代码:
var key = ”;
var value = obj[key];
// todo

Object的这个特性可以用来高效的检索Unique的字符串集合,遍历Array的时间复杂度是O(n),而遍历Object的时间复杂度是O(1)。虽然对于10000次集合的for检索代价也就几十ms,可是如果是1000*1000次检索或更多,使用Object的优势一下就体现出来了。在此之前我做了一个mapping,把100个Unique的字符mapping到1000个字符串数组上,耗时25-30s!后来把for遍历改成了Object模拟的集合的成员引用,同样的数据量mapping,耗时仅1.7-2s!!!

对于集合的遍历效率(从高到低):var value = obj[key]; > for ( ; ; ) > for ( in )。效率最差的就是for( in )了,如果集合过大,尽量不要使用for ( in )遍历。

 

(1)parentObj.firstChild:如果节点为已知节点(parentObj)的第一个子节点就可以使用这个方法。这个属性是可以递归使用的,也就是支持parentObj.firstChild.firstChild.firstChild…的形式,如此就可以获得更深层次的节点。
(2)parentObj.lastChild:很显然,这个属性是获取已知节点(parentObj)的最后一个子节点。与firstChild一样,它也可以递归使用。
在使用中,如果我们把二者结合起来,那么将会达到更加令人兴奋的效果,即:parentObj.firstChild.lastChild.lastChild…
(3)parentObj.childNodes:获取已知节点的子节点数组,然后可以通过循环或者索引找到需要的节点。
注意:经测试发现,在IE7上获取的是直接子节点的数组,而在Firefox2.0.0.11上获取的是所有子节点即包括子节点的子节点。
(4)parentObj.children:获取已知节点的直接子节点数组。
注意:经测试,在IE7上,和childNodes效果一样,而Firefox2.0.0.11不支持。这也是为什么我要使用和其他方法不同样式的原因。因此不建议使用。
(5)parentObj.getElementsByTagName(tagName):使用方法不再赘述,它返回已知节点的所有子节点中类型为指定值的子节点数组。例如:parentObj.getElementsByTagName(‘A’)返回已知的子节点中的所有超链接。
3、通过临近节点获取:
(1)neighbourNode.previousSibling:获取已知节点(neighbourNode)的前一个节点,这个属性和前面的firstChild、lastChild一样都似乎可以递归使用的。
(2)neighbourNode.nextSibling:获取已知节点(neighbourNode)的下一个节点,同样支持递归。
4、通过子节点获取:
    (1)childNode.parentNode:获取已知节点的父节点。

 

try…catch 的作用是测试代码中的错误。

try 部分包含需要运行的代码,而 catch 部分包含错误发生时运行的代码。

语法:

try
{
   //在此运行代码
}
catch(err)
{
   //在此处理错误
}

注意:try…catch 使用小写字母。大写字母会出错。

实例 1

下面的例子原本用在用户点击按钮时显示 “Welcome guest!” 这个消息。不过 message() 函数中的 alert() 被误写为 adddlert()。这时错误发生了:

<html>
<head>
<script type="text/javascript">
function message()
{
adddlert("Welcome guest!")
}
</script>
</head>

<body>
<input type="button" value="View message" onclick="message()" />
</body>

</html>

我们可以添加 try…catch 语句,这样当错误发生时可以采取更适当的措施。

下面的例子用 try…catch 语句重新修改了脚本。由于误写了 alert(),所以错误发生了。不过这一次,catch 部分捕获到了错误,并用一段准备好的代码来处理这个错误。这段代码会显示一个自定义的出错信息来告知用户所发生的事情。

<html>
<head>
<script type="text/javascript">
var txt=""
function message()
{
try
  {
  adddlert("Welcome guest!")
  }
catch(err)
  {
  txt="此页面存在一个错误。\n\n"
  txt+="错误描述: " + err.description + "\n\n"
  txt+="点击OK继续。\n\n"
  alert(txt)
  }
}
</script>
</head>

<body>
<input type="button" value="View message" onclick="message()" />
</body>

</html>

实例 2

下一个例子会显示一个确认框,让用户来选择在发生错误时点击确定按钮来继续浏览网页,还是点击取消按钮来回到首页。如果 confirm 方法的返回值为 false,代码会把用户重定向到其他的页面。如果 confirm 方法的返回值为 true,那么代码什么也不会做。

confirm() 方法用于显示一个带有指定消息和 OK 及取消按钮的对话框。

<html>
<head>
<script type="text/javascript">
var txt=""
function message()
{
try
  {
  adddlert("Welcome guest!")
  }
catch(err)
  {
  txt="There was an error on this page.\n\n"
  txt+="Click OK to continue viewing this page,\n"
  txt+="or Cancel to return to the home page.\n\n"
  if(!confirm(txt))
    {
    document.location.href="http://www.w3school.com.cn/"
    }
  }
}
</script>
</head>

<body>
<input type="button" value="View message" onclick="message()" />
</body>

</html>
© 2012 Ai-WEB的博客 Suffusion theme by Sayontan Sinha