YOYO的最新BLOG文章

Aug
27

今天在写一个js日期的时候,发现getYear()在Firefox中测试时是个三位数的108,而在ie里面是正常的怪怪的。明明是2008,这是怎么回事呢?

经过查询相关资料,我发现原因是 javascript 的兼容性问题

var today = new date();
var year = today.getYear();

在 Firefox 里面 getYear 返回的是 “当前年份-1900″ 的值 (以前都如此)
而微软很NB的做了一个改动:
当today的年份大于等于2000的时候 直接把1900加上了 返回的 200X (而不是10X)
如:today年份是1999 返回99
today年份是2000 返回2000

一个简单的解决是加一个判断:
year = (year<1900?(1900+year):year);

也有另外的方法
通过 getFullYear getUTCFullYear 去调用
var year = today.getFullYear();在IE,FireFox都适用。

Mar
12

今天谈Ajax的简单入门,对很多IT从业者来说可能有些晚了,毕竟Ajax被狂热吹捧的时代已经过去了,而现在使用Ajax技术已经不是什么新鲜的事情了,但是对一些初学者还是很有必要的。

Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。对于Ajax,最核心的一个对象是XMLHttpRequest,所有的Ajax操作都离不开对这个对象的操作。

首先我们来了解怎么在javascript中创建这个对象:

var xmlHttp = new XMLHttpRequest();

这行简单的代码在 Mozilla、Firefox、Safari、Opera 以及基本上所有以任何形式或方式支持 Ajax 的非 Microsoft 浏览器中,创建了 XMLHttpRequest 对象。但是对于市场占有率达到70%的IE来说,这种方法是不行的,而不同的IE版本还有不同的创建方法,所以我们需要在IE下面使用下面两种创建对象的办法:

try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");//针对较新的浏览器
} catch (err) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//针对较老的浏览器
} catch (err2) {
xmlHttp = false;
}
}

即使这样,我们也无法预料有些浏览器可能无法创建这个对象,所以在创建不成功的情况下,我们还要加上一句:

if (!xmlHttp){
alert("无法创建 XMLHttpRequest 对象!");
}

结合起来就是:

var xmlHttp = false;
try {
xmlHttp = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
xmlHttp = false;
}
}
}
if (!xmlHttp){
alert("无法创建 XMLHttpRequest 对象!");
}

然后,让我们建立一个函数getInfo(),打开异步请求:

function getInfo() {
var num = document.getElementById("num").value;//获得表单的数据
var url = "/ajax/1.php?n=" + escape(num);
xmlHttp.open("GET", url, true);//这里的true代表是异步请求
}

一旦用 open() 配置好之后,就可以发送请求了。虽然可以使用 send() 发送数据,但也能通过 URL 本身发送数据。事实上,在大部分GET 请求中,用 URL 发送数据要容易得多,所以这里用null作为send()的参数就可以了。url地址里面的php文件是被请求来处理所需要数据的php文件,就像我们平时用PHP的时候一样,后面的参数可以加多个,并用&分隔开来。

xmlHttp.send(null);

在发送了数据之后,我们需要用回调方法来获得服务器的状态,所以就用到了onreadystatechange 属性。

xmlHttp.onreadystatechange = updatePage;

此语句已经要放在send()语句前面,这样才会有效,后面的updatePage是处理返回信息的一个函数。完整的getInfo()如下:

function getInfo() {
var num = document.getElementById("num").value;//获得表单的数据
var url = "/ajax/1.php?n=" + escape(num);
xmlHttp.open("GET", url, true);//这里的true代表是异步请求
xmlHttp.onreadystatechange = updatePage;
xmlHttp.send(null);
}

我们还需要在html里面来触发这个函数:

<input name="num" id="num" onblur="getInfo()" type="text" />

下面我们需要来编写updatePage()这个函数:

function updatePage(){
if (xmlhttp.readyState == 4) {
var response = xmlhttp.responseText;
document.getElementById("city").value = response;
}
}

上面这段代码里面的readyState是服务器返回的一个状态,4这个状态表示请求已经发送,并处理完毕。responseText是获得服务器返回的信息,然后通过javascript赋给ID为city的表单。

到此,一个简单的Ajax程序就完成了,完整的javascript代码如下:

var xmlHttp = false;
try {
xmlHttp = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
xmlHttp = false;
}
}
}
if (!xmlHttp){
alert("无法创建 XMLHttpRequest 对象!");
}
 
function getInfo() {
var num = document.getElementById("num").value;//获得表单的数据
var url = "/ajax/1.php?n=" + escape(num);
xmlHttp.open("GET", url, true);//这里的true代表是异步请求
xmlHttp.onreadystatechange = updatePage;
xmlHttp.send(null);
}
 
function updatePage(){
if (xmlhttp.readyState == 4) {
var response = xmlhttp.responseText;
document.getElementById("city").value = response;
}
}

这里还缺一个php文件,由于处理的方式不一样,写法也不一样,而且这不是Ajax的主要部分,所以这里就不放代码了。只要记住php是输出并返回所需要的数据就可以了。

Mar
06

Javascript一向以他的灵活随意而著称,这也使得它的功能可以非常的强大,而由于没有比较好的调试工具,又使得它使用起来困难重重,尤其使对于一些初学者,更是感觉到无从下手。今天探讨的问题是用javascript获取textarea中光标的位置。

对于写javascript写网页编辑器的人来说,获取textarea中的光标位置是一个非常重要的问题,而往往很多人在这个地方不知所措,找不到好的办法。昨天我在网上找到了一段javascript代码,本来不想把原版放在这里的,就是因为太精彩了,怕我给改坏了,所以还是原版放在这里吧。

var start=0;
    
var end=0;
    
function add(){       
        
var textBox = document.getElementById("ta");
        
var pre = textBox.value.substr(0, start);
        
var post = textBox.value.substr(end);
        
textBox.value = pre + document.getElementById("inputtext").value + post;
    
}
    
function savePos(textBox){
        
//如果是Firefox(1.5)的话,方法很简单
        
if(typeof(textBox.selectionStart) == "number"){
            
start = textBox.selectionStart;
            
end = textBox.selectionEnd;
        
}
        
//下面是IE(6.0)的方法,麻烦得很,还要计算上'\n'
        
else if(document.selection){
            
var range = document.selection.createRange();
            
if(range.parentElement().id == textBox.id){
                
// create a selection of the whole textarea
                
var range_all = document.body.createTextRange();
                
range_all.moveToElementText(textBox);
                
//两个range,一个是已经选择的text(range),一个是整个textarea(range_all)
                
//range_all.compareEndPoints()比较两个端点,如果range_all比range更往左(further to the left),则                //返回小于0的值,则range_all往右移一点,直到两个range的start相同。
                
// calculate selection start point by moving beginning of range_all to beginning of range
                
for (start=0; range_all.compareEndPoints("StartToStart", range) < 0; start++)
                    
range_all.moveStart('character', 1);
                
// get number of line breaks from textarea start to selection start and add them to start
                
// 计算一下\n
                
for (var i = 0; i <= start; i ++){
                    
if (textBox.value.charAt(i) == '\n')
                        
start++;
                
}
                
// create a selection of the whole textarea
                
var range_all = document.body.createTextRange();
                
range_all.moveToElementText(textBox);
                
// calculate selection end point by moving beginning of range_all to end of range
                
for (end = 0; range_all.compareEndPoints('StartToEnd', range) < 0; end ++)
                    
range_all.moveStart('character', 1);
                    
// get number of line breaks from textarea start to selection end and add them to end
                    
for (var i = 0; i <= end; i ++){
                        
if (textBox.value.charAt(i) == '\n')
                            
end ++;
                    
}
                
}
            
}
        
document.getElementById("start").value = start;
        
document.getElementById("end").value = end;
    
}

下面是在页面中调用js代码的方法:

<form action="a.cgi">
<table border="1" cellspacing="0" cellpadding="0">
    
<tr>
        
<td>start: <input type="text" id="start" size="3"/></td>
        
<td>end: <input type="text" id="end" size="3"/></td>
    
</tr>
    
<tr>
        
<td colspan="2">
            
<textarea id="ta" onKeydown="savePos(this)"
                              
onKeyup="savePos(this)"
                              
onmousedown="savePos(this)"
                              
onmouseup="savePos(this)"
                              
onfocus="savePos(this)"
                              
rows="14" cols="50"></textarea>
        
</td>
    
</tr>
    
<tr>
        
<td><input type="text" id="inputtext" /></td>
        
<td><input type="button" onClick="add()" value="Add Text"/></td>
    
</tr>
</table>
</form>

此代码的原文是:http://blog.csdn.net/liujin4049/archive/2006/09/19/1244065.aspx,在此谢过!

这段js代码同时支持IE和Firefox,甚是精彩,可见此人js功力深厚啊,呵呵。

Btw:听说Firefox现在的市场占有率已经达到17%了,而IE8也快出来了,浏览器之间又会掀起一场你死我活的争斗,而这种争斗可以使浏览器的解析标准会越来越规范,我们写代码也会越来越省事,这实在是一件值得高兴的事。

May
10

今天用到一个功能,就是用javascript来获取鼠标坐标,在网上找到了event.clientX和event.clientY,如实例一。
实例一:

<script language="javascript" type="text/javascript"> function m(){ document.getElementById("area").innerHTML=event.clientX +" , "+event.clientY; } </script>
<p id="area" style="border: 1px solid ; font-size: 36px; width: 800px; height: 600px" onmousemove="m();">d</p>

这段代码在IE下面正常,但是在Firefox下面无法运行,于是继续寻找在Firefox下面的解决办法,最终在博客园里找到了Firefox中Javascript使用event对象需要注意的问题,给函数加了一个参数就可以了,我修改的代码即实例二。
阅读全文 ->

Mar
15

二级级联菜单在我去年的时候就用asp+js做过,而现在忽然拿出来再做的时候我发现我忘记了,而且原来用asp写的程序都找不到了,真晕[emot]sweat[/emot],于是到网上搜,找了半天,我发现网上的写法各异,而且都特别复杂,这么一个二级级联菜单,有必要弄这么复杂吗?于是自己想重新写一个简单的。在经过半个小时左右的思考后,我完成了二级级联菜单的设计和制作。

大体思路是这样的:为了不让先前的页面刷新,我用iframe潜入了一个二级子页面,用来读取数据库中的数据,最后把想要的数据传递给父级页面,完成数据的选择和转移。

主要程序代码如下(部分代码有改动,但不影响功能):
父页面reg.html:

<iframe src=”city.php” width=”300″ height=”22″ frameborder=”0″ scrolling=”no”></iframe> <input name=”city” type=”hidden” id=”city” value=”" />

子页面city.php:

<script language=”javascript” type=”text/javascript”>
function goto(n){
this.location.href=”city.php?sh_id=”+n;
}
</script>

<select name=”sh” onchange=”goto(this.value)”>
<option>请选择所在省市</option>
<?php
include_once(”db.php”);
$sql=”select * from province order by sh_id asc”;
$result=mysql_query($sql);
while($row=mysql_fetch_assoc($result)){
?>
<option value=”<? echo $row["sh_id"];?>” <? if($_GET["sh_id"]==$row["sh_id"]){echo ’selected=”selected”‘;}?>><? echo $row["sh_name"];?></option>
<?php
}
?>
</select>
<select name=”city” onchange=”parent.document.getElementById(’city’).value=this.value”>
<option>选择你所在的城市</option>
<?php
if(!empty($_GET["sh_id"])){
//echo “ok”;
$sql=”select * from city where sh_id=”.$_GET["sh_id"].” order by city_id asc”;
$result=mysql_query($sql);
while($row=mysql_fetch_assoc($result)){
?>
<option value=”<? echo $row["city_name"];?>”><? echo $row["city_name"];?></option>
<?php
}
}
?>
</select>

实例演示请看团购社区的注册页面:http://www.togou.net/reg.html

Sep
20

一、window.open()支持环境:
JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+

二、基本语法:

window.open(pageURL,name,parameters);

其中:
pageURL 为子窗口路径
name 为子窗口句柄
parameters 为窗口参数(各参数用逗号分隔)

三、示例:

<script> <!-- window.open (\'page.html\',\'newwindow\',\'height=100,width=400,top=0,left=0,toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no\') //写成一行 --> </script>

脚本运行后,page.html将在新窗体newwindow中打开,宽为100,高为400,距屏顶0象素,屏左0象素,无工具条,无菜单条,无滚动条,不可调整大小,无地址栏,无状态栏。请对照。
上例中涉及的为常用的几个参数,除此以外还有很多其他参数,请见四。

四、各项参数
其中yes/no也可使用1/0;pixel value为具体的数值,单位象素。

参数 | 取值范围 | 说明

alwaysLowered | yes/no | 指定窗口隐藏在所有窗口之后
alwaysRaised | yes/no | 指定窗口悬浮在所有窗口之上
depended | yes/no | 是否和父窗口同时关闭
directories | yes/no | Nav2和3的目录栏是否可见
height | pixel value | 窗口高度
hotkeys | yes/no | 在没菜单栏的窗口中设安全退出热键
innerHeight | pixel value | 窗口中文档的像素高度
innerWidth | pixel value | 窗口中文档的像素宽度
location | yes/no | 位置栏是否可见
menubar | yes/no | 菜单栏是否可见
outerHeight | pixel value | 设定窗口(包括装饰边框)的像素高度
outerWidth | pixel value | 设定窗口(包括装饰边框)的像素宽度
resizable | yes/no | 窗口大小是否可调整
screenX | pixel value | 窗口距屏幕左边界的像素长度
screenY | pixel value | 窗口距屏幕上边界的像素长度
scrollbars | yes/no | 窗口是否可有滚动栏
titlebar | yes/no | 窗口题目栏是否可见
toolbar | yes/no | 窗口工具栏是否可见
Width | pixel value | 窗口的像素宽度
z-look | yes/no | 窗口被激活后是否浮在其它窗口之上

阅读全文 ->