让JavaScript和PHP通用值为中文的cookie

引用地址:http://vseb.blog.sohu.com/67136922.html

这是一个哪里都能找到的操作cookie的JavaScript函数:


很遗憾,如果让PHP设定cookie的值为中文,然后让这个JavaScript读取,就会出现乱码:



反之,如果让JavaScript设定了一个中文cookie值,由PHP进行读取,也会出现乱码:



观察上面的乱码,你会发现% u4E2D% u6587刚好是“中文”两个汉字的unicode编码,第一个想法是直接解码,但是PHP里面似乎没有可以把unicode编码转换为汉字的便捷方法。(WordPress倒是不错,不加空格倒是给解码出来了!)

在《JavaScript: The Definitive Guide, 4th Edition》中写到:

In client-side JavaScript, a common use of escape( ) is to encode cookie values, which have restrictions on the punctuation characters they may contain.
在客户端脚本程序中,escape( )函数可以被用作对具有不规范标点的cookie进行编码。(就像我们函数中所用到的一样)

Although the escape( ) function was standardized in the first version of ECMAScript, it has been deprecated and removed from the standard by ECMAScript v3. Implementations of ECMAScript are likely to implement this function, but they are not required to. In JavaScript 1.5 and JScript 5.5 and later, you should use encodeURI( ) and encodeURIComponent( ) instead of escape( ).
虽然escape( ) 已经在ECMAScript中被标准化,但是在ECMAScript v3中,escape( ) 被剔出,如果需要在JavaScript 1.5 和JScript 5.5以后的版本中使用这个函数,建议使用encodeURI( )和encodeURIComponent( )。

按照手册的建议,我修改了JavaScript函数中的escape()和unescape()为encodeURI()和decodeURI(),结果异常的顺利,下面给出修改后的代码和调试程序:







js中showModalDialog和open子窗口向父窗口传值方法

showModalDialog:

父窗口:

 function addresswindow(){
  var adr=window.showModalDialog(‘index.php’,”,’dialogWidth:400px;dialogHeight:200px;center:Yes;resizable:no;status:no;scroll:no;’);
  if (adr != null && adr != “”) {
             var strs = new Array();
             strs = adr.split(“,”);
             window.document.getElementsByName(“address1”)[0].value = strs[0];
             window.document.getElementsByName(“address2”)[0].value = strs[1];
            window.document.getElementsByName(“address3″)[0].value = strs[2];
         }

 }

子窗口:

<base target=”_self” />   ——加上这一句话可以在子窗口进行一些操作,要是不加的话,比如查询会另弹出一个页面来
<script>
function backparent(){
    var adr=’1111111,22222222,33333333′;
    window.returnValue = adr;
    window.close();

}
</script>

其中adr变量为两个窗口之间传值的桥梁。

使用open方法打开的窗口可以用window.opener.document.getElementById(‘id’).value=’1111′;来向操作父窗口。

************************************

附1:Window.ShowModalDialog参数详解

基本介绍:
         showModalDialog()                              (IE 4+ 支持)
         showModelessDialog()                         (IE 5+ 支持)
         window.showModalDialog()                 方法用来创建一个显示HTML内容的模态对话框。
         window.showModelessDialog()            方法用来创建一个显示HTML内容的非模态对话框。
使用方法:
         vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])
         vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures])
参数说明:
        sURL                —   必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
        vArguments   —    可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
        sFeatures       —    可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
—————-
1.   dialogHeight:   对话框高度,不小于100px
2.   dialogWidth:   对话框宽度。
3.   dialogLeft:    离屏幕左的距离。
4.   dialogTop:    离屏幕上的距离。
5.   center:         { yes | no | 1 | 0 } :             是否居中,默认yes,但仍可以指定高度和宽度。
6.   help:            {yes | no | 1 | 0 }:               是否显示帮助按钮,默认yes。
7.   resizable:      {yes | no | 1 | 0 } [IE5+]:    是否可被改变大小。默认no。
8.   status:         {yes | no | 1 | 0 } [IE5+]:     是否显示状态栏。默认为yes[ Modeless]或no[Modal]。
9.   scroll:           { yes | no | 1 | 0 | on | off }:是否显示滚动条。默认为yes。

下面几个属性是用在HTA中的,在一般的网页中一般不使用。
10.   dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。
11.   edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
12.   unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。

 ************************************

附2:window.open参数详解

window = object.open([URL ][, name ][, features ][, replace]]]])
URL:新窗口的URL地址
name:新窗口的名称,可以为空
featurse:属性控制字符串,在此控制窗口的各种属性,属性之间以逗号隔开。
fullscreen= { yes/no/1/0 } 是否全屏,默认no
channelmode= { yes/no/1/0 } 是否显示频道栏,默认no
toolbar= { yes/no/1/0 } 是否显示工具条,默认no
location= { yes/no/1/0 } 是否显示地址栏,默认no
directories = { yes/no/1/0 } 是否显示转向按钮,默认no
status= { yes/no/1/0 } 是否显示窗口状态条,默认no
menubar= { yes/no/1/0 } 是否显示菜单,默认no
scrollbars= { yes/no/1/0 } 是否显示滚动条,默认yes
resizable= { yes/no/1/0 } 是否窗口可调整大小,默认no
width=number 窗口宽度(像素单位)
height=number 窗口高度(像素单位)
top=number 窗口离屏幕顶部距离(像素单位)
left=number 窗口离屏幕左边距离(像素单位)

js中onmouseout问题

js的onmouseout有很奇怪的一个问题。例如


我们预期只有当鼠标从div中移开的时候才会触发onmouseout事件,可是,事实上,当我们移到div中的元素时,例如本例中的a标签时,就会触发onmousout事件。也就是说,移到对象的子对象上,也算onmouseout了。这往往会让我们预期的效果达不到。下面是一种解决方法,兼容IE和FF。


faddsf

另外,JQ中关于这个问题,已经有了一个好的解决办法了.jquery中定义了一种事件叫做”mouseleave”,用这个事件做事件句柄的话,就可以解决这个问题。具体使用方法可以参考这里 http://www.w3school.com.cn/jquery/event_mouseleave.asp

Discuz7.2在Firefox3.6不显示主题分类,源码,用户名的解决方法

解决discuz7.2论坛在firefox火狐3.6版本下分类信息和主题分类下拉框无法显示的问题
问题描述:
discuz7.2,在用Firefox/3.6版本发布主题时:
1.如果只开启了分类信息或主题分类,则不显示后面下拉选项。
2.如果同时开启了分类信息和主题分类,则只显示前面的分类信息选项。
3.还有,编辑器右侧的“源码”切换选项也不见了;

正解:
此问题为FF3.6的兼容问题。

修复方法:
在include\js\common.js中
找到 BROWSER.firefox 一行中的
document.getBoxObjectFor &&
去掉后,后台更新缓存。

js获取&设置cookie函数

设置cookie:

function setcookie(cookieName, cookieValue, seconds, path, domain, secure) {
	var expires = new Date();
	expires.setTime(expires.getTime() + seconds);
	document.cookie = escape(cookieName) + '=' + escape(cookieValue)
		+ (expires ? '; expires=' + expires.toGMTString() : '')
		+ (path ? '; path=' + path : '/')
		+ (domain ? '; domain=' + domain : '')
		+ (secure ? '; secure' : '');
}

读取cookie:

function getcookie(name) {
	var cookie_start = document.cookie.indexOf(name);
	var cookie_end = document.cookie.indexOf(";", cookie_start);
	return cookie_start == -1 ? '' : unescape(document.cookie.substring(cookie_start + name.length + 1, (cookie_end > cookie_start ? cookie_end : document.cookie.length)));
}

例:


兼容IE,FF,OP的添加收藏夹(兼容热点)






添加


js简繁体切换代码&javascript在IE和Firefo x中兼容性问题

页面简繁体切换问题,花了两天终于搞定。

网上有两个版本的js代码

1.最常见的那个js文件在ff下面会有问题,原因是ff对childNode属性的支持有问题。版本一:js文件下载

页面代码:<a href=”#nogo” id=”StranLink”>简体</a>

2.还有一个不容易找到的版本,兼容性比较好,推荐。版本二:js文件下载

页面代码:<a id=”st” href=”javascript:st();void 0;” style=”cursor:pointer”>简体中文</a>

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

附:《javascript在IE和Firefo x中兼容性问题》

-、元素查找问题

1. document.all[name]

  (1)现有问题:Firefox不支持document.all[name]

  (2)解决方法:使用getElementsByName(name),getElementById(id)等来替代。

  (3) 在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。

2. 集合类对象问题

  (1)现有问题:IE中对许多集合类对象取用时可以用 (),但在Firefox只能用[]。

      如:IE中可以使用document.forms(“formName”)来返回名字为”formName”的Form,但在Firefox却行不通。

   (2)解决方法:使用[],上例中可以改为document.forms[“formName”]

3. HTML元素的ID在JavaScript可见

  (1)现有问题:IE中HTML元素中的ID可以作为document的下属对象变量名直接使用。在Firefox中不能。

  (2)解决方法:使用getElementById(“idName”)代替idName作为对象变量使用。

4. eval(idName)取得对象

  (1)现有问题:在IE中,利用eval(idName)可以取得ID为idName的HTML对象,在Firefox中不能。

  (2)解决方法:用 getElementById(idName) 代替 eval(idName)。

5. 变量名与某HTML对象ID相同

  (1)现有问题:在Firefox中,因为对象ID不作为HTML对象的名称,所以可以使用与HTML对象id相同的变量名,IE中不能。

  (2)解决方法:在声明变量时,一律加上var,以避免歧义,这样在IE中亦可正常运行。此外,最好不要取与HTML对象id相同的变量名,以减少错误。

 注:3、4和5都属于同一类的问题。

6. Frame

  (1)现有问题:在IE中可以用window.top.frameId和window.top.frameName来得到该Frame所代表的Window,Firefox中只能用window.top.frameName。

  (2)解决方法:将Frame的Id和Name设置成相同,使用window.top.frameName来访问Frame。

      另外,在mf和ie中都可以使用window.top.document.getElementById(“frameId”)来访问frame标签

并且可以通过window.top.document.getElementById(“testFrame”).src = ‘xx.htm’来切换frame的内容

也都可以通过window.top.frameName.location = ‘xx.htm’来切换frame的内容。

二、DOM操作

1. 设置元素的文本内容。

  (1)现有问题:IE使用innerText,而Firefox使用textContent来设置元素文本内容。

  (2)解决方法:如果文本内容不包含”<“和”>”等特殊字符,可以使用innerHTML。否则,可以使用:

        var child = elem.firstChild;

            if (child != null) elem.removeChild(child);

            elem.appendChild(document.createTextNode(content));

2. parentElement,parent.children

  (1)现有问题:IE可以使用parentElement获得父结点,parent.children得到结点的所有孩子结点。Firefox不支持。

  (2)解决方法:使用parentNode和parent.childNodes。

3. 对childNodes的解释。

  (1)现有问题:IE和Firefox中对childNodes的解释不同,IE不会包含空白文本结点,而Firefox会包含。

  (2)解决方法:使用childNodes过滤文本结点,如下:

      var children = elem.childNodes;

          for (i = 0; i < children.length; i++) {

            if (children[i].nodeType != 3) { // 过滤文本结点

              // …

            }

          }

4. 对document.getElementsByName的解释。

  (1)现有问题:IE中getElementsByName只会检查<input>和<img>元素,而在Firefox下会检查所有元素。

  (2)解决方法:不要使用getElementsByName检查除<input>和<img>之外的元素,如果要获得单个元素,尽量使用getElementById。如果是别的元素用getElementById也可以获得元素数组。

5. 对document.getElementById的解释。

  (1)现有问题:IE中getElementById不仅检查Id属性,也会检查Name属性,当Name属性匹配参数时也会返回该元素。而在Firefox中只会检查Id属性。

  (2)解决方法:尽量保持Id和Name相同,不要让一个元素name属性和另一个元素的id属性相同。

三、事件

1. event.x与event.y问题

  (1)现有问题:在IE中,event对象有x,y 属性,Firefox中没有。

  (2)解决方法:在Firefox中,与event.x 等效的是 event.pageX。可以使用:

      mX = event.x ? event.x : event.pageX;

  (3) event.layerX 在 IE 与 MF 中都有,具体意义有无差别尚未试验。

2. window.event

  (1)现有问题:使用window.event无法在Firefox上运行

  (2)解决方法:原代码(可在IE中运行):

 <input type=”button” name=”someButton” value=”提交” onclick=”javascript:gotoSubmit()”/>

<script language=”javascript”>

function gotoSubmit() {

alert(window.event);    // use window.event

}

 </script>

 新代码(可在IE和Firefox中运行):

<input type=”button” name=”someButton” value=”提交” onclick=”javascript:gotoSubmit(event)”/>

<script language=”javascript”>

 function gotoSubmit(evt) {

 evt = evt ? evt : (window.event ? window.event : null);

  alert(evt);             // use evt

 }

 </script>

3. attachEvent和addEventListener

  (1)现有问题:IE中使用attachEvent来添加事件,Firefox中使用addEventListener。

  (2)解决方法:如下,注意事件参数的区别,一个是click,一个是onclick。

        if (document.attachEvent) document.attachEvent(“click”, clickHandler,false);

        else document.addEventListener(“onclick”,clickHandler);

四、语法

1. const

  (1)现有问题:在IE中不能使用const关键字。如const constVar = 32;在IE中这是语法错误。

  (2)解决方法:不使用const,以var代替。

2. 多余的逗号

  (1)现有问题:firefox中对象文字常量容许多余的逗号,在IE中不允许。下面语句在IE中非法。

      var obj = { ‘key’ : ‘aaa’, }

  (2)解决方法:去掉多余逗号。

五、XML

1. 创建XMLHttpRequest

  (1)现有问题:Firefox使用XMLHttpRequest,IE使用ActiveXObject。

  (2)解决方法:

      if (window.XMLHttpRequest) {

          req = new XMLHttpRequest();

      } else if (window.ActiveXObject) {

          req = new ActiveXObject(“Microsoft.XMLHTTP”);

      }

2. 创建DOM

  (1)现有问题:Firefox和IE创建DOM的方式不同。

  (2)解决方法:

        function createXmlDom() {

          var oXmlDom;

          if (Window.ActiveXObject) { // IE

            oXmlDom = new ActiveXObject(“Microsoft.XmlDom”);

          } else {  // Firefox

            oXmlDom = document.implementation.createDocument(“”, “”, null);

          }

        }

3. 加载XML

  (1)现有问题:如果要加载外部文件IE和Firefox都可以用:

          oXmlDom.async=false;      // 这在Firefox中是必须的

          oXmlDom.load(“test.xml”);

     但是它们加载xml字符串的方式不一样,IE中直接可以使用oXmlDom.loadXML(“<root><child/></root>”),而Firefox要使用DOMParser:

        var oParser = new DOMParser();

          var oXmlDom = oParser.parseFromString(“<root/>”, “text/xml”);

  (2)解决方法:比较好的方法是给Firefox产生的XMLDom加上loadXML方法:

        if (isFirefox) { // 需要浏览器检测

          Document.prototype.loadXML = function(sXml) {

            var oParser = new DOMParser();

            var oXmlDom = oParser.parseFromString(sXml, “text/xml”);

            while (this.firstChild) this.removeChild(this.firstChild);

            for (var i = 0; i < oXmlDom.childNodes.length; i++) {

              var oNewNode = this.importNode(oXmlDom.childNodes[i], true);

              this.appendChild(oNewNode);

            }

          }

        }

      这样在IE和Firefox就可以调用loadXML方法了。

4. XPath支持

  (1)现有问题:IE中可以直接用XmlDOM的selectNodes来根据XPath表示式来选择结点,Firefox则比较复杂,需要使用XPathEvaluator。

     IE:

        var lstNodes = oXmlDom.documentElement.selectNodes(“employee/name”);

        for (var i = 0; i < lstNodes.length; i++) {

          alert(lstNodes[i].firstChild.nodeValue);

        }

     Firefox:

          var oEvaluator = new XPathEvaluator();

          var oResult = oEvaluator.evaluate(“employee/name”, oXmlDom.documentElement, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

          var oElement = oResult.iterateNext();

          while (oElement) {

            alert(oElement.firstChild.nodeValue);

            oElement = oResult.iterateNext();

          }

  (2)解决方法:比较好的方法给Firefox的Element添加selectNodes方法。

        if (isFirefox) { // 需要浏览器检测

            Element.prototype.selectNodes = function(sXPath) {

            var oEvaluator = new XPathEvaluator();

              var oResult = oEvaluator.evaluate(sXPath, this, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

              var aNodes = new Array();

              if (oResult != null) {

                var oElement = oResult.iterateNext();

                while (oElement) {

                  aNodes.push(oElement);

                  oElement = oResult.iterateNext();

                }

              }

              return aNodes;

           }

      }

   这样在IE和Firefox中就都可以调用selectNodes方法了。

5. XSLT支持

  (1)现有问题:IE中可以使用XmlDOM的transferNode方法将其转换成html,而Firefox需要使用XSLTProcessor。

  IE:

        oXmlDom.load(“employee.xml”);

        oXslDom.load(“employee.xslt”);

        var sResult=oXmlDom.transformNode(oXslDom);

    Firefox:

        var oProcessor = new XSLTProcessor();

        oProcessor.importStylesheet(oXslDom);

        var oResultDom = oProcessor.transformToDocument(oXmlDom);       

        var oSerializer = new XMLSerializer();

        var sXml = oSerializer.serializeToString(oResultDom, “text/xml”);

        alert(sXml);

  (2)解决方法:比较好的方法给Firefox的Node添加transferNode方法。

        if (isFirefox) { // 需要浏览器检测

          Node.prototype.transformNode = function(oXslDom) {

          var oProcessor = new XSLTProcessor();

            oProcessor.importStylesheet(oXslDom);

            var oResultDom = oProcessor.transformToDocument(oXmlDom);

            var oSerializer = new XMLSerializer();

            var sXml = oSerializer.serializeToString(oResultDom, “text/xml”);

            return sXml;

          }

        }

   这样在IE和Firefox中就都可以调用transferNode方法了。

6. 在Firefox中,自己定义的属性必须getAttribute()取得

7.在Firefox中没有  parentElement parement.children  而用

               parentNode parentNode.childNodes

   childNodes的下标的含义在IE和MF中不同,Firefox使用DOM规范,childNodes中会插入空白文本节点。

  一般可以通过node.getElementsByTagName()来回避这个问题。

   当html中节点缺失时,IE和Firefox对parentNode的解释不同,例如

   <form>

   <table>

        <input/>

   </table>

   </form>

   Firefox中input.parentNode的值为form, 而IE中input.parentNode的值为空节点

 Firefox中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)

8. body 对象

   Firefox的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在

9. url encoding

在js中如果书写url就直接写&不要写&amp;例如var url = ‘xx.jsp?objectName=xx&amp;objectEvent=xxx’;

frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器

一般会服务器报错参数没有找到

当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&amp;

一般Firefox无法识别js中的&amp;

10. nodeName 和 tagName 问题

  (1)现有问题:

     在Firefox中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象

     有问题(具体情况没有测试,但我的IE已经死了好几次)。

  (2)解决方法:

     使用 tagName,但应检测其是否为空。

11. 元素属性

   IE下 input.type属性为只读,但是Firefox下可以修改